我想重构我的自定义视图以使用Android架构组件。但是,我发现
ViewModelProviders.of(...)
只接受 Activity 或 Fragment。有什么办法可以让其工作?我应该使用 Fragment 替代自定义视图吗?
我想重构我的自定义视图以使用Android架构组件。但是,我发现
ViewModelProviders.of(...)
只接受 Activity 或 Fragment。有什么办法可以让其工作?我应该使用 Fragment 替代自定义视图吗?
在View中获取ViewModel实例是可能的,但不建议这样做。根据this post:
虽然在Activity或Fragment中获取ViewModel很容易,但在View中获取ViewModel并不直接。主要原因是View应该独立于所有处理过程,即使您的所有逻辑都在ViewModel中,访问View中的ViewModel也会使其依赖于不应该依赖的东西。控制View的推荐方法是根据来自Fragment或Activity的ViewModel状态向其传递参数。
关键是尝试从上下文中获取Activity:
override val activity: FragmentActivity by lazy {
try {
context as FragmentActivity
} catch (exception: ClassCastException) {
throw ClassCastException("Please ensure that the provided Context is a valid FragmentActivity")
}
}
override var viewModel = ViewModelProvider(activity).get(SharedViewModel::class.java)
如上所述,如果可能的话,我尽量避免使用此方法。