【发布时间】:2017-11-22 03:51:26
【问题描述】:
我正在尝试通过 KClass 类型将 ViewModel 的子类绑定到地图中:
@Module abstract class ViewModelModule {
@Binds @IntoMap @ViewModelKey(MyViewModel::class)
abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel
@Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}
但我收到 Dagger 编译器错误:
e: ~/Example/app/build/tmp/kapt3/stubs/debug/com/example/app/injection/AppComponent.java:5: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
e:
e: public abstract interface AppComponent {
e: ^
e: java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> is injected at
e: com.example.app.ui.ViewModelFactory.<init>(creators)
e: com.example.app.ui.ViewModelFactory is injected at
e: com.example.app.injection.ViewModelModule.bindViewModelFactory(p0)
e: android.arch.lifecycle.ViewModelProvider.Factory is injected at
e: com.example.app.ui.MyFragment.setViewModelFactory(p0)
e: com.example.app.ui.MyFragment is injected at
e: dagger.android.AndroidInjector.inject(arg0)
上面的ViewModelModule包含在我的AppModule中,这是我的AppComponent中的一个模块。所以 Dagger 应该能够提供我的ViewModelFactory 所需的Map<KClass<out ViewModel>, Provider<ViewModel>>,但我不知道它为什么会崩溃。
我还尝试将ViewModelKey 注释类切换到Java,将Class 作为构造函数参数而不是KClass。然后将我的ViewModelFactory修改为依赖Map<Class<out ViewModel>, Provider<ViewModel>>,但出现了同样的错误。
【问题讨论】:
标签: android dependency-injection kotlin dagger-2 dagger