我有片段A调用片段B或片段C。 B 和 C 使用 A 提供的 ViewModel。
同时,我将视图作为构造函数上的参数传递:
- FragmentB(val viewModel: ViewModel(
- FragmentC(val viewModel: viewModel(
但这种方式不是一个好的解决方案,因为尝试重新打开片段时应用程序崩溃。
无法实例化片段
最好的方法是什么?
我想创建一个 newInstance 方法并将视图模型作为捆绑包上的参数传递,但是我将如何在可包裹或可序列化中转换此视图模型?
您可能正在尝试创建自定义Fragment
构造函数,这在Android中是不允许的。 我假设您的ViewModel
是使用方法在片段A
中创建
ViewModelProviders.of(this)
以这种方式创建ViewModel
应该只在这个片段中使用(如果你通过Object
或单例传递它,它不会崩溃,但它不应该那样使用(。
更好的解决方案是将所有这些片段放在一个活动中A
、B
、C
。 这样你可以打电话
ViewModelProviders.of(requireActivity())
并在所有片段中获取相同的ViewModel
实例。因此,如果您在片段A
中使用此方法获取ViewModel
,请放置一些值,然后在同一活动中将片段A
替换为片段B
,则可以调用ViewModelProviders.of(requireActivity())
再次访问ViewModel
的同一实例并检索值。