如何解决类型 cast / make genric viewModel 作为参数传递
我正在处理一个自定义对话框片段,该片段正在从具有不同 viewModels
的两个不同视图中使用/调用。而不是在Dialog类的构造函数参数中传递两个单独的viewModels
,
class CustomeDialog(var viewModel1: ViewModelA ?= null,var viewModel2 : ViewModelB ?= null) : DialogFragment()
我需要询问/找出一种方法,我可以将 类型的参数设置为对话框,这样我就可以输入 caste 任何 viewModel
到它,我想要。
像这样,
class CustomDialog<T:ViewModel> : DialogFragment()
在代码中,它类似于
val mdialog1: CustomeDialog by lazy { CustomeDialog(viewModel as ViewModelA) }
还有
val mdialog2: CustomeDialog by lazy { CustomeDialog(viewMode2 as ViewModelB) }
解决方法
您可以在泛型类中创建一个辅助构造函数,它接受泛型 ViewModel
参数:
class CustomeDialog<T : ViewModel>() : DialogFragment() {
constructor(viewmodel: T) : this()
}
用法和你一样:
lateinit var viewModel: ViewModel
val mdialog1: CustomeDialog<ViewModelA> by lazy { CustomeDialog(viewModel as ViewModelA) }
lateinit var viewModel2: ViewModelA
val mdialog2: CustomeDialog<ViewModelA> by lazy { CustomeDialog(viewModel2) }
更新:
如何根据类型在对话框中初始化viewModel。例如。如果在构造函数中传递 VM1,则 var dialogViewModel = WHAT??,
要求有一个带有泛型 ViewModel
的 Dialog,所以它的类型是泛型,因为它在实例化之前是未知的。
是的,我需要一个通用的本地 var dialogViewModel,正如我提到的,整个逻辑都依赖于这个 dvm
可以在二级构造函数中初始化:
class CustomDialog<T : ViewModel>() : DialogFragment() {
lateinit var dialogViewModel: T
constructor(viewmodel: T) : this() {
dialogViewModel = viewmodel
}
}
,
这个策略行不通。操作系统使用反射及其空构造函数重新创建您的 Fragment。它可以使用 Bundle 值将状态恢复到替换 Fragment,但类类型不是 Bundle 的有效数据类型。
我能想到的最接近的是使它成为一个抽象类,然后创建具有具体类型的简单子类。
abstract class CustomDialog<T: ViewModel>(viewModelType: KClass<out T>): DialogFragment() {
val viewModel: T by createViewModelLazy(viewModelType,{ viewModelStore })
}
class CustomDialogA: CustomDialog<ViewModelA>(ViewModelA::class)
class CustomDialogB: CustomDialog<ViewModelB>(ViewModelB::class)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。