Android 试图在没有工厂的情况下重新创建时ViewModel崩溃

Android 试图在没有工厂的情况下重新创建时ViewModel崩溃,android,android-architecture-components,android-viewmodel,android-mvvm,Android,Android Architecture Components,Android Viewmodel,Android Mvvm,在重新创建活动实例后,如何重新创建通过工厂注入参数创建的ViewModel ViewModel的构造函数如下所示: class MyViewModel( val model: MyModel, val repository: MyRepository ) : ViewModel() 我用factory实例化它: ViewModelProviders .of(this, MyViewModelFactory(

在重新创建活动实例后,如何重新创建通过工厂注入参数创建的ViewModel

ViewModel的构造函数如下所示:

class MyViewModel(
        val model: MyModel,
        val repository: MyRepository
) : ViewModel()
我用factory实例化它:

ViewModelProviders
                    .of(this, MyViewModelFactory(
                            model = MyModel()
                            repository = MyRepository()))
                    .get(MyViewModel::class.java)
我尝试像这样恢复ViewModel,而savedInstanceState不为null会重新创建活动:

ViewModelProviders
                    .of(this)
                    .get(MyViewModel::class.java)
这会导致崩溃,因为MyViewModel类中不存在0参数构造函数

As,对于每次通过工厂: 我的问题是,无论我作为MyModel传递给ViewModel的是什么,以及来自活动意图的内容,都可能在以后由于用户交互而发生更改。这意味着,在重新创建时,Intent中的MyModel对于已经存储在ViewModel中并被用户交互篡改的模型来说是过时的

这会导致崩溃,因为不存在0参数构造函数 在MyViewModel类中

它将崩溃,因为您没有通过任何工厂来构建ViewModel

如何重新创建通过注入参数创建的ViewModel 重新创建活动实例后的工厂

好的,如果我错了,请纠正我,您不必在savedInstanceState上手动重新创建ViewModel。您可以使用viewModel存储活动中使用的数据。因此,在重新创建活动时,ViewModelProvider不会创建viewModel的新实例,但会提供旧实例,并且viewModel中保存的数据不会被清除。因此,无需担心savedInstanceState


提示:如果您想管理工厂的创建并改进娱乐流程。您可以检查MyViewModel中没有0参数构造函数。当您尝试在不提供工厂的情况下获取ViewModel实例时,它将查找0参数构造函数

无论savedInstanceState是否为null,都可以使用此选项


而是如何基于savedInstanceState值创建存储库和模型更改,具体取决于您的用例或实现。

可能唯一的答案是,不能这样做。如果提供了工厂,则必须始终提供。我不知道ViewModel娱乐下面的机制,但这些并不像我希望的那么聪明

我当前的实现如下所示:

    viewModel = ViewModelProviders
            .of(this, MyFactory(MyRepository()))
            .get(MyMViewModel::class.java)

    val binding = DataBindingUtil.setContentView<ActivityCreateFoodstuffBinding>(this, R.layout.my_activity)
    binding.viewModel = viewModel

    if (savedInstanceState == null) {
        val model = intent.getParcelableExtra<MyModel>("model")
        viewModel.model.set(model)
    }

我在ViewModel中使用了一个参数构造函数,该构造函数始终占用存储库,但我移动了模型,并仅在新创建活动时设置它。

请参考此内容-您的ViewModel将与活动重新创建期间保存的数据一起保留。您不必在活动重新创建后重新创建它,Android系统会为您这样做。我认为模型和存储库可能依赖于savedInstanceState值,但不依赖于viewmodel。我认为,模型和存储库不应该对活动可见,应该通过viewmodel访问。我们为什么要使用savedInstanceState@ArkaPravaBasuI认为DI的原则正好相反。如果ViewModel依赖于存储库和模型,则应将它们注入其中,而不是由ViewModel负责实例化它们。savedInstanceState标志的使用是特定于实现和用例的。在不知道数据模型存储了什么以及数据存储库需要什么的情况下,我不确定我将以何种方式使用它。
    viewModel = ViewModelProviders
            .of(this, MyFactory(MyRepository()))
            .get(MyMViewModel::class.java)

    val binding = DataBindingUtil.setContentView<ActivityCreateFoodstuffBinding>(this, R.layout.my_activity)
    binding.viewModel = viewModel

    if (savedInstanceState == null) {
        val model = intent.getParcelableExtra<MyModel>("model")
        viewModel.model.set(model)
    }