首页 > 解决方案 > Android:使用 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 片段保留公共 livedata 可观察对象,如加载、错误等。

我想要实现的是我想从 BaseAuthFragment 内部的 BaseAuthViewModel 观察那些常见的 Livedata 对象,这样我就不必单独复制 LoginFragment && RegFragment 中的代码。

但是在 LoginFragment && RegFragment 内部我应该已经有 LoginViewModel 和 RegViewModel,它们是 BaseAuthViewModel 的孩子,所以有可能以某种方式覆盖子片段中的 viewModel 对象类型吗?

标签: javaandroidkotlinmvvmkoin

解决方案


您可以定义如下内容:

基类

abstract class BaseFragment : Fragment() {
    /**
     * Every fragment has to have an instance of a view model that extends from the BaseViewModel
     */
    abstract val _viewModel: BaseViewModel

    ...
}

儿童班

class ChildFragment : BaseFragment() {
    override val _viewModel: ChildViewModel by inject()
...
}

推荐阅读