我有两个Fragments
和两个ViewModels
,它们具有类似的实现。因此,我决定应用继承。因此,我决定创建一个FragmentParent和一个ViewModelParent,最后得到如下结果:
,ViewModelB也继承了ViewModelB
一方面,父母双方都是抽象的,因为他们有要以不同方式实现的方法。另一方面,两个子ViewModels都具有公共的父级视图模型方法以及他们的个人自定义方法。
因此,viewmodel对象必须从FragmentParent调用一些常见的方法,但问题是每个片段都将调用它们相应的视图模型的自定义方法。因此,如果我在viewmodel中声明FragmentParent对象,那么一旦在子对象中使用它来调用每个通讯器视图模型的自定义方法,它就会出现错误,因为viewModel对象的类型对应于ViewModelParent。正如您在图像中看到的那样,不能调用颜色上的方法,因为vM
是ViewModelParent的实例,它们属于自定义ViewModels。
一旦需要调用自定义方法,解决方案可能是在每个子片段中强制转换viewmodel对象,但是,我想这是很脏的。这种方法有什么好主意吗?谢谢。
发布于 2021-07-15 16:08:02
将父ViewModel转换为特定的子ViewModel似乎是最好的选择。这是一种常见的铸造方法,我看不出有什么问题。如果要在子片段中多次访问子ViewModel的方法,则可以将强制转换的ViewModel存储在属性中或每个子片段的变量中。例如,如果您使用Kotlin,您可以这样做:
//FragmentA
val viewModel = vM as ViewModelA
viewModel.customAmethod()
//FragmentB
val viewModel = vM as ViewModelB
viewModel.customBmethod()
https://stackoverflow.com/questions/68395999
复制相似问题