为什么使用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的构造函数以接收UserRepositoryImpl
而不是类型UserRepository
时,它可以成功编译并且可以工作。
有人知道可能是什么问题吗?
答案 0 :(得分:1)
解决了该问题。使用此Github问题中发现的通用视图模型工厂:
https://github.com/google/dagger/issues/1273#issuecomment-447997439