ViewModel作为片段构造函数的参数

时间:2020-01-03 16:50:10

标签: android android-fragments kotlin android-viewmodel

我有一个片段A,称为片段B或片段C。 B和C使用A提供的ViewModel。

有一阵子,我将View作为参数传递给构造函数:

  • FragmentB(val viewModel:ViewModel)
  • FragmentC(val viewModel:viewModel)

但是这种方法不是一个好的解决方案,因为尝试重新打开片段时应用程序崩溃了。

无法实例化片段

什么是最好的方法?

我想创建一个newInstance方法并将viewModel作为Bundle的参数传递,但是如何将其转换为Parcelable或Serializable?

1 个答案:

答案 0 :(得分:0)

您可能正在尝试创建自定义Fragment构造函数,这在Android中是不允许的。 我假设您的ViewModel是使用方法

在片段A内创建的
ViewModelProviders.of(this)
以这种方式创建的

ViewModel仅应在该片段内部使用(如果您通过Object或Singleton传递,则不会崩溃,但不应以这种方式使用)。

更好的解决方案是将所有这些片段ABC放在一个活动中。 这样您可以致电

ViewModelProviders.of(requireActivity())

,并在所有片段中获得ViewModel的相同实例。因此,如果您在片段ViewModel中使用此方法获得了A,在其中放置了一些值,然后在同一活动中将片段A替换为片段B,则可以调用ViewModelProviders.of(requireActivity())再次可以访问ViewModel的同一实例并检索值。