我有两个 Fragments
和两个 ViewModels
具有类似的实现。所以,我决定应用继承。所以我决定创建一个 FragmentParent 和一个 ViewModelParent,然后最终得到:
一方面,父母双方都是抽象的,因为他们有以不同方式实现的方法。另一方面,两个子视图模型都有共同的父视图模型方法以及他们个人的自定义方法。
因此,viewmodel 对象必须从 FragmentParent 调用一些常用方法,但问题是每个 Fragment 都会调用其对应的 viewmodel 的自定义方法。因此,如果我在 FragmentParent 中声明 viewModel 对象,一旦我在子级中使用它来调用每个对应视图模型的自定义方法,它就会显示错误,因为 viewModel 对象的类型对应于 ViewModelParent。
正如您在图片中看到的,无法调用 color 中的方法,因为 vM
是 ViewModelParent 的实例,它们属于自定义 ViewModel。
一旦我需要调用自定义方法,解决方案可以在每个子片段中投射 viewmodel 对象,但是,我想这很脏。这种方法有什么好主意吗?谢谢。
答案 0 :(得分:1)
将父 ViewModel 投射到特定的子 ViewModel 似乎是最好的选择。这是强制转换的常见用法,我认为它没有任何问题。如果您在子 Fragment 中多次访问子 ViewModel 的方法,则可以将转换的 ViewModel 存储在每个子 Fragment 的属性或变量中。例如,如果您使用 Kotlin,您可以执行以下操作:
//FragmentA
val viewModel = vM as ViewModelA
viewModel.customAmethod()
//FragmentB
val viewModel = vM as ViewModelB
viewModel.customBmethod()