android - Dagger 无法使用 Dagger Android 在 ViewModel 的构造函数上注入接口类型的参数
问题描述
为什么我在使用 Dagger Android 时无法在 ViewModel 构造函数中注入接口类型?
这是我的 AppComponent
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class,
ActivityBuilder::class,
ViewModelModule::class
]
)
interface AppComponent {
fun inject(app: App)
}
这是我的活动模块:
@Module
abstract class ActivityBuilder {
@ActivityScope
@ContributesAndroidInjector(modules = [UserDetailsModule::class])
abstract fun userDetailsActivity(): UserDetailsActivity
}
这是 UserDetailsModule
@Module
abstract class UserDetailsModule {
@Binds
@ActivityScope
abstract fun providesUserRepository(repository: UserRepositoryImpl): UserRepository
}
这是我遵循动态视图模型工厂解决方案的 ViewModelModule。
@Module
abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(UserDetailsViewModel::class)
abstract fun userDetailsViewModel(viewModel: UserDetailsViewModel): ViewModel
@Binds
abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}
这是 UserRepository 的具体类
class UserRepositoryImpl @Inject constructor(private val api: Api) : UserRepository { ... }
这是 UserDetailsViewModel
class UserDetailsViewModel @Inject constructor(private val userRepository: UserRepository) : ViewModel() { ... }
编译的时候会报错
UserRepository cannot be provided without an @Provides-annotated method.
但是,令人困惑的部分是当我将 UserDetailsViewModel 的构造函数更改为 receiveUserRepositoryImpl
而不是 typeUserRepository
时,它编译成功并且可以正常工作。
任何人都知道问题可能是什么?
解决方案
解决了这个问题。使用在这个 Github 问题中找到的通用视图模型工厂:
https://github.com/google/dagger/issues/1273#issuecomment-447997439
推荐阅读
- python - 主线程不在主循环中
- youtube-api - 无法获取某些帐户的 YouTube 数据分析
- python - 如何在两个训练集中实现高斯朴素贝叶斯
- c++ - 可以考虑使用 C++ 引用给函数参数一个新名称吗?
- java - 生成具有指定长度和点数的贝塞尔曲线
- c++ - 在模板派生类中用协变返回类型覆盖虚函数
- sas - if then 循环内部的 CALL SYMPUT 问题
- wordpress - Wordpress 使用不同的域
- python-3.x - 如何在 python 中使用 pandas.to_numeric() 向下转换浮点数和整数时防止信息丢失
- tsql - 外部数据源中指定的错误或不可访问的位置