[英]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'
因為FeaturesApi
是DataRepository
的依賴項。 我想要做的只是簡單地注入依賴而不傳遞任何值。 我該怎么做?
在使用Hilt之前,您應該真正嘗試了解Dagger的工作原理。 因為,Hilt 是建立在 Dagger 之上的!
因此,Dagger 要求您提供依賴關系圖。 這意味着對於每個可注入的class
(使用 Dagger 或 Hilt),您還必須為 Dagger 提供一種方法來創建其依賴項的實例。
考慮到 OP 中發布的場景。 我們有,
class DataViewModel(val dataRepository: DataRepository): ViewModel() {
}
&
class DataRepository(val featuresApi: FeaturesApi) {
}
正如您所指出的那樣, featuresApi
是DataRepository
的依賴項,而 Dagger 無法知道如何創建FeaturesApi
object。
現在,Dagger 提供了三種方法來告訴它,如何創建任何類/類型的實例。
@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 使用哪個構造函數。
@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.