Android中带有Kotlin的Dagger:lateinit属性viewModelProviderFactory尚未初始化
我的代码:Android中带有Kotlin的Dagger:lateinit属性viewModelProviderFactory尚未初始化,android,kotlin,dagger,Android,Kotlin,Dagger,我的代码: 应用程序组件: MainActivityViewModelModule: MainActivityViewModel: ViewModelKey(在Java中): @已记录 @目标({ElementType.METHOD}) @保留(RetentionPolicy.RUNTIME) @地图键 public@interface ViewModelKey{ Class扩展DaggerAppCompatActivity而不是AppCompatActivity这里我可能错了,但我认为您的vi
@已记录
@目标({ElementType.METHOD})
@保留(RetentionPolicy.RUNTIME)
@地图键
public@interface ViewModelKey{
Class扩展DaggerAppCompatActivity而不是AppCompatActivity这里我可能错了,但我认为您的viewModelModule中需要一个ViewModelFactory,如下所示:
@Module
abstract class MainActivityViewModelModule {
@Binds
@IntoMap
@ViewModelKey(MainActivityViewModel::class)
public abstract fun bindMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): ViewModel
@Binds
abstract fun provideViewModelFactory(
factory: ViewModelFactory
): ViewModelProvider.Factory
}
class ViewModelFactory@Inject构造函数(
私有val创建者:映射
):ViewModelProvider.Factory{
重写趣味创建(modelClass:Class):T{
val creator=creators[modelClass]?:creators.entries.firstOrNull{
modelClass.isAssignableFrom(it.key)
}?值?:抛出IllegalArgumentException(“未知模型类$modelClass”)
试一试{
@抑制(“未选中的_CAST”)
将creator.get()返回为T
}捕获(e:例外){
抛出运行时异常(e)
}
}
}
噢,老兄,在这种情况下,您所做的比任何错误日志都要多
@Module
abstract class ActivityBuildersModule {
@ContributesAndroidInjector(
modules = [MainActivityViewModelModule::class]
)
abstract fun contributeMainActivity(): MainActivity
}
@Module
abstract class MainActivityViewModelModule {
@Binds
@IntoMap
@ViewModelKey(MainActivityViewModel::class)
public abstract fun bindMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): ViewModel
}
class MainActivityViewModel @Inject constructor(application: Application) : AndroidViewModel(application) {
// empty for now
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
class MainActivity : AppCompatActivity() { <-- I made mistake here. I must Extend DaggerAppCompatActivity instead of AppCompatActivity.
// doesn't work for now
@Inject
lateinit var viewModelProviderFactory: ViewModelProviderFactory
lateinit var mainActivityViewModel: MainActivityViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainActivityViewModel = ViewModelProvider(this, viewModelProviderFactory).get(MainActivityViewModel::class.java)
setMainFragment()
}
private fun setMainFragment() {
// my code
}
}
@Module
abstract class MainActivityViewModelModule {
@Binds
@IntoMap
@ViewModelKey(MainActivityViewModel::class)
public abstract fun bindMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): ViewModel
@Binds
abstract fun provideViewModelFactory(
factory: ViewModelFactory
): ViewModelProvider.Factory
}
class ViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}