Fragment 继承与 ViewModel 继承
Fragment Inheritance with ViewModel Inheritance
我有两个 Fragments
和两个 ViewModels
具有类似的实现。所以,我决定申请继承。所以我决定创建一个 FragmentParent 和一个 ViewModelParent,然后以:
- FragmentA 和 FragmentB 都继承自 FragmentParent。
- ViewModel(A) 和 ViewModelB 都继承自 ViewModelParent。
一方面,两个 parent 都是抽象的,因为它们具有以不同方式实现的方法。另一方面,children ViewModels 都有通用的 parent 视图模型方法和他们的个人自定义方法。
因此,viewmodel object 必须从 FragmentParent 调用一些常用方法,但问题是每个 Fragment 都会调用其对应的 viewmodels 的自定义方法。因此,如果我在 FragmentParent 中声明 viewModel object,一旦我在 children 中使用它来调用每个相应 viewmodel 的自定义方法,它就会说错误,因为 viewModel object' s 类型对应于 ViewModelParent。
正如您在图像中看到的,无法调用颜色中的方法,因为 vM
是 ViewModelParent 的实例并且它们属于自定义 ViewModels。
一旦我需要调用自定义方法,一个解决方案可能是在每个 child 片段中投射视图模型 object,但是,我想这很脏。这种方法有什么好主意吗?谢谢
将父 ViewModel 转换为特定的子 ViewModel 似乎是最佳选择。这是铸造的常见用法,我看不出有任何问题。如果您在子 Fragment 中多次访问子 ViewModel 的方法,则可以将转换的 ViewModel 存储在每个子 Fragment 中的 属性 或变量中。例如,如果您使用的是 Kotlin,您可以这样做:
//FragmentA
val viewModel = vM as ViewModelA
viewModel.customAmethod()
//FragmentB
val viewModel = vM as ViewModelB
viewModel.customBmethod()
我有两个 Fragments
和两个 ViewModels
具有类似的实现。所以,我决定申请继承。所以我决定创建一个 FragmentParent 和一个 ViewModelParent,然后以:
- FragmentA 和 FragmentB 都继承自 FragmentParent。
- ViewModel(A) 和 ViewModelB 都继承自 ViewModelParent。
一方面,两个 parent 都是抽象的,因为它们具有以不同方式实现的方法。另一方面,children ViewModels 都有通用的 parent 视图模型方法和他们的个人自定义方法。
因此,viewmodel object 必须从 FragmentParent 调用一些常用方法,但问题是每个 Fragment 都会调用其对应的 viewmodels 的自定义方法。因此,如果我在 FragmentParent 中声明 viewModel object,一旦我在 children 中使用它来调用每个相应 viewmodel 的自定义方法,它就会说错误,因为 viewModel object' s 类型对应于 ViewModelParent。
正如您在图像中看到的,无法调用颜色中的方法,因为 vM
是 ViewModelParent 的实例并且它们属于自定义 ViewModels。
一旦我需要调用自定义方法,一个解决方案可能是在每个 child 片段中投射视图模型 object,但是,我想这很脏。这种方法有什么好主意吗?谢谢
将父 ViewModel 转换为特定的子 ViewModel 似乎是最佳选择。这是铸造的常见用法,我看不出有任何问题。如果您在子 Fragment 中多次访问子 ViewModel 的方法,则可以将转换的 ViewModel 存储在每个子 Fragment 中的 属性 或变量中。例如,如果您使用的是 Kotlin,您可以这样做:
//FragmentA
val viewModel = vM as ViewModelA
viewModel.customAmethod()
//FragmentB
val viewModel = vM as ViewModelB
viewModel.customBmethod()