簡體   English   中英

無法使用 Hilt 成功提供依賴項

[英]Can't successfully provide dependency using Hilt

我是新來的希爾特。 我想為ViewModel提供DataRepository 我在AppModule中的代碼是:

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun provideDataRepository(): DataRepository {
        return DataRepository()
    }
}

然后我想將它注入到 ViewModel 的構造函數中,例如private val dataRepository: DataRepository但我No value passed for parameter 'FeaturesApi'因為FeaturesApiDataRepository的依賴項。 我想要做的只是簡單地注入依賴而不傳遞任何值。 我該怎么做?

在使用Hilt之前,您應該真正嘗試了解Dagger的工作原理。 因為,Hilt 是建立在 Dagger 之上的!

因此,Dagger 要求您提供依賴關系圖。 這意味着對於每個可注入的class (使用 Dagger 或 Hilt),您還必須為 Dagger 提供一種方法來創建其依賴項的實例。

考慮到 OP 中發布的場景。 我們有,

class DataViewModel(val dataRepository: DataRepository): ViewModel() {
}

&

class DataRepository(val featuresApi: FeaturesApi) {
}

正如您所指出的那樣, featuresApiDataRepository的依賴項,而 Dagger 無法知道如何創建FeaturesApi object。

現在,Dagger 提供了三種方法來告訴它,如何創建任何類/類型的實例。

  1. @Inject

您可以在您自己的代碼中定義的class的構造函數上使用@Inject注釋來告訴 Dagger 如何創建該 object。 像這樣:

class DataRepository: @Inject constructor(
    private val featuresApi: FeaturesApi
)

這將類似於:

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun provideDataRepository(): DataRepository {
        return DataRepository()
    }
}

請注意,在任何給定的class中只能有一個單一的@Inject注釋構造函數,因為提供多個@Inject注釋構造函數會混淆 Dagger 使用哪個構造函數。

  1. @Provides

您已經熟悉此注解,它可以在@Module注解的class中使用。

這個注解通常保留給 Dagger 一種方法來創建你不可編輯的類/類型的實例(通常是庫類或由庫創建的對象)。 在這種情況下,假設您的FeaturesApi object 是由Retrofit (這是 Android 中最流行的網絡庫)創建的。

因此,通過稍微重寫您的AppModule

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun provideFeaturesApi(retrofit: Retrofit): FeaturesApi {
        return retrofit.create(FeaturesApi::class.java)
    }
}

現在 Dagger 知道如何創建功能FeaturesApi object。

注意:此時在您的代碼中,您會注意到您現在已經引入了FeaturesApi的依賴項,即Retrofit 所以,現在你還必須提供一種方法讓 Dagger 知道如何創建Retrofit實例。 否則 Dagger 將拋出與No value passed for parameter 'Retrofit'類似的錯誤。

我省略了第三種方式讓您弄清楚和研究,因為這與這個問題無關。


進一步說明:

  • 這些注釋( @InstallIn除外)與Hilt沒有任何關系,但實際上由Dagger使用。
  • 另請注意,訪問較低級別對象(在本例中為DataRepository )的更好方法是通過interface

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM