Dagger无法使用Dagger Android在ViewModel的构造函数上注入类型接口的参数

时间:2019-09-25 05:35:22

标签: android kotlin dagger-2 dagger

为什么使用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时,它可以成功编译并且可以工作。

有人知道可能是什么问题吗?

1 个答案:

答案 0 :(得分:1)

解决了该问题。使用此Github问题中发现的通用视图模型工厂:

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