Android:使用 Koin 覆盖子片段中的视图模型对象?
Android: Override viewmodel object in child fragment using Koin?
我这里有以下案例,我得到了 2 个片段:
LoginFragment : BaseAuthFragment
RegFragment : BaseAuthFragment
和相应的视图模型:
LoginViewModel : BaseAuthViewModel
RegViewModel : BaseAuthViewModel
LoginFragment 有一个 LoginViewModel 对象
RegFragment 有一个 RegViewModel 对象
BaseAuthFragment 有一个 BaseAuthViewModel 对象
我使用 Koin 进行依赖注入,所以 BaseAuthFragment 中的 viewModel 对象声明是这样的:
private val viewModel: BaseAuthViewModel by viewModel()
BaseAuthViewModel 为 Login && Reg 片段保留常见的实时数据可观察对象,例如加载、错误等。
我想要实现的是,我想从 BaseAuthFragment 内部的 BaseAuthViewModel 观察那些常见的 Livedata 对象,这样我就不必单独复制 LoginFragment && RegFragment 中的代码。
但是在 LoginFragment && RegFragment 内部我应该已经有 LoginViewModel 和 RegViewModel,它们是 BaseAuthViewModel 的子项,那么是否可以以某种方式覆盖子片段中的 viewModel 对象类型?
你可以这样定义:
基地class
abstract class BaseFragment : Fragment() {
/**
* Every fragment has to have an instance of a view model that extends from the BaseViewModel
*/
abstract val _viewModel: BaseViewModel
...
}
child class
class ChildFragment : BaseFragment() {
override val _viewModel: ChildViewModel by inject()
...
}
我这里有以下案例,我得到了 2 个片段:
LoginFragment : BaseAuthFragment
RegFragment : BaseAuthFragment
和相应的视图模型:
LoginViewModel : BaseAuthViewModel
RegViewModel : BaseAuthViewModel
LoginFragment 有一个 LoginViewModel 对象 RegFragment 有一个 RegViewModel 对象 BaseAuthFragment 有一个 BaseAuthViewModel 对象
我使用 Koin 进行依赖注入,所以 BaseAuthFragment 中的 viewModel 对象声明是这样的:
private val viewModel: BaseAuthViewModel by viewModel()
BaseAuthViewModel 为 Login && Reg 片段保留常见的实时数据可观察对象,例如加载、错误等。
我想要实现的是,我想从 BaseAuthFragment 内部的 BaseAuthViewModel 观察那些常见的 Livedata 对象,这样我就不必单独复制 LoginFragment && RegFragment 中的代码。
但是在 LoginFragment && RegFragment 内部我应该已经有 LoginViewModel 和 RegViewModel,它们是 BaseAuthViewModel 的子项,那么是否可以以某种方式覆盖子片段中的 viewModel 对象类型?
你可以这样定义:
基地class
abstract class BaseFragment : Fragment() {
/**
* Every fragment has to have an instance of a view model that extends from the BaseViewModel
*/
abstract val _viewModel: BaseViewModel
...
}
child class
class ChildFragment : BaseFragment() {
override val _viewModel: ChildViewModel by inject()
...
}