【问题标题】:Dagger can't inject a parameter of type interface on a ViewModel's constructor using Dagger AndroidDagger 无法使用 Dagger Android 在 ViewModel 的构造函数上注入接口类型的参数
【发布时间】: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


【解决方案1】:

解决了这个问题。使用在这个 Github 问题中找到的通用视图模型工厂:

https://github.com/google/dagger/issues/1273#issuecomment-447997439

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多