为什么 Dagger 无法识别 AppModule 中的@Provides?
why Dagger could not recognize @Provides in AppModule?
我收到此错误:
[Dagger/MissingBinding] SessionFetcher cannot be provided without an
@Inject constructor or an @Provides-annotated method. while you can
see I have defined SessionFetcher
在 AppModule 中 class
@Suppress("unused")
@Module
abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(AccountViewModel::class)
abstract fun bindAccountViewModel(accountViewModel: AccountViewModel): ViewModel
@Binds
abstract fun bindViewModelFactory(factory: ViewModelProviderFactory): ViewModelProvider.Factory
}
@Module(includes = [ViewModelModule::class])
class AppModule(private val applicationContext: Context) {
@Provides
fun sessionFetcher(@Named("UserPreferences") userPreferences: SharedPreferences): ISessionFetcher {
return SessionFetcher(userPreferences)
}
@Singleton
@Provides
@Named("UserPreferences")
fun userPreferences(context: Context): SharedPreferences {
return context.getSharedPreferences(USER_CONFIG_NAME, Context.MODE_PRIVATE)
}
class AccountViewModel @Inject constructor(sessionFetcher: SessionFetcher) :
SessionViewModel(sessionFetcher), AppComponent.Injectable {
您在图表中提供 ISessionFetcher
,但您正在尝试 inject
SessionFetcher
.
的实例
您向图表提供的是您可以注入的类型。 Dagger 不分析 @Providing
函数体(或最终实现 class 的类型)。
只需注入接口而不是实现 class。
class AccountViewModel @Inject constructor(sessionFetcher: ISessionFetcher) :
SessionViewModel(sessionFetcher), AppComponent.Injectable {
//...
}
如果您需要使用 ISessionFetcher
未公开的 SessionFetcher
方法,那么您的 ISessionFetcher
可能 不完整。
我收到此错误:
[Dagger/MissingBinding] SessionFetcher cannot be provided without an @Inject constructor or an @Provides-annotated method. while you can see I have defined SessionFetcher
在 AppModule 中 class
@Suppress("unused")
@Module
abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(AccountViewModel::class)
abstract fun bindAccountViewModel(accountViewModel: AccountViewModel): ViewModel
@Binds
abstract fun bindViewModelFactory(factory: ViewModelProviderFactory): ViewModelProvider.Factory
}
@Module(includes = [ViewModelModule::class])
class AppModule(private val applicationContext: Context) {
@Provides
fun sessionFetcher(@Named("UserPreferences") userPreferences: SharedPreferences): ISessionFetcher {
return SessionFetcher(userPreferences)
}
@Singleton
@Provides
@Named("UserPreferences")
fun userPreferences(context: Context): SharedPreferences {
return context.getSharedPreferences(USER_CONFIG_NAME, Context.MODE_PRIVATE)
}
class AccountViewModel @Inject constructor(sessionFetcher: SessionFetcher) :
SessionViewModel(sessionFetcher), AppComponent.Injectable {
您在图表中提供 ISessionFetcher
,但您正在尝试 inject
SessionFetcher
.
您向图表提供的是您可以注入的类型。 Dagger 不分析 @Providing
函数体(或最终实现 class 的类型)。
只需注入接口而不是实现 class。
class AccountViewModel @Inject constructor(sessionFetcher: ISessionFetcher) :
SessionViewModel(sessionFetcher), AppComponent.Injectable {
//...
}
如果您需要使用 ISessionFetcher
未公开的 SessionFetcher
方法,那么您的 ISessionFetcher
可能 不完整。