我想通過自己的KClass
類型的ViewModel
子類裝訂成地圖:結合進入地圖KClass型
@Module abstract class ViewModelModule {
@Binds @IntoMap @ViewModelKey(MyViewModel::class)
abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel
@Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}
但我正在逐漸匕首編譯器錯誤:
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>>
,但我無法弄清楚它爲什麼會崩潰。
我也嘗試過到Java切換ViewModelKey
註解類,採取Class
作爲構造函數的參數,而不是KClass
。然後修改我的ViewModelFactory
以取決於Map<Class<out ViewModel>, Provider<ViewModel>>
,但發生了相同的錯誤。
你太棒了,非常感謝 – Roman
令人驚歎。我從來沒有想到過,所有Google Android Architecture項目都是用Java編寫的! – Arjun