【发布时间】:2019-09-25 05:35:22
【问题描述】:
为什么我在使用 Dagger Android 时不能在 ViewModel 构造函数中注入接口类型?
这是我的应用组件
@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 时,它编译成功并且可以正常工作。
有人知道问题出在哪里吗?
【问题讨论】:
-
将
@Provides添加到fun providesUserRepository。你不需要@Binds -
@sonnet 我已经重构为使用提供注释方法,但它仍然是一样的。
-
@sonnet
@Binds专为此用例设计
标签: android kotlin dagger-2 dagger