android - lateinit 属性 viewModelFactory 尚未在 Fragment 中初始化

标签 android mvvm dependency-injection dagger-2 android-viewmodel

我在我的 android 项目中使用 dagger 2(2.15 版)进行依赖注入(inject)。 除了注入(inject) viewModelFactory 之外,一切正常。 我无法将它注入(inject)到我的 fragment 中。

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

private val mainViewModel: StationsViewModel by lazy {
    ViewModelProviders.of(this, viewModelFactory)
            .get(StationsViewModel::class.java)
}

我收到以下错误:

lateinit property viewModelFactory has not been initialized

我有 ViewModelModule:

@Module
abstract class ViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    internal abstract fun bindsMainViewModel(mainViewModel: 
    MainViewModel): ViewModel

    @Binds
    abstract fun bindViewModelFactory(factory: MyViewModelFactory): 
    ViewModelProvider.Factory
}

View 模型键

@MustBeDocumented
@Target(
        AnnotationTarget.FUNCTION,
        AnnotationTarget.PROPERTY_GETTER,
        AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)

和 ViewModelFactory

@Singleton
class MyViewModelFactory @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)
        }

    }
}

虽然我不太明白他们在做什么。

最佳答案

您可以尝试在 onViewCreated() 中启动吗?

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    mainViewModel = ViewModelProviders.of(this, viewModelFactory)
        .get(StationsViewModel::class.java)
    // binding.viewmodel = viewModel
}

应该没问题。

关于android - lateinit 属性 viewModelFactory 尚未在 Fragment 中初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50137246/

相关文章:

android - 如何在不使用 SELECT 查询的情况下获取 Room 持久数据库中具有 bool 值 true(或 1)的行数?

java - 修复 GridView 中的小图像?

WPF MVVM - 属性更改触发 Storyboard 仅发生一次

c# - 属性更改未生效,MVVM

android - 使按钮更容易点击

android - 居中 GWT DialogBox 不考虑我手机浏览器的 "zoom"因素

c# - 带有子集合的嵌套 ItemControls 上的 WPF 绑定(bind)

dependency-injection - 如何使用 ASP.NET MVC 3 RTM 配置依赖注入(inject)

java - 需要在单元测试中使用依赖注入(inject) - 我应该使用 junit 还是 testng?

java - Guice 不会注入(inject) Jersey 的资源