我可以通过向Koin注入viewModel来管理生命周期所有者吗?

Ant*_*sky 5 lifecycle android viewmodel kotlin koin

我有一个活动应用程序。

我想视图模型绑定到父片段生命周期(FlowFragmentLogin),并与孩子片段分享(CellFragmentInfoFragmentetc)。这样,当我从FlowFragmentLogin移到时FlowFragmentMain,调用了viewModel onCleared()

但是我发现的唯一方法是在Activity和片段之间共享viewModel:https ://insert-koin.io/docs/1.0/documentation/koin-android/index.html

而且无法控制生命周期所有者。Wich对我来说是不可接受的,至少是因为该viewModel将一直存在直到应用程序终止。

Che*_*nhe 4

自导航以来2.1.0-alpha02

现在,您可以通过 Kotlin 用户的 navGraphViewModels() 属性委托或使用添加到 NavController 的 getViewModelStore() API 创建范围在导航图级别的 ViewModel。

您可以在此处找到更改日志和文档

不幸的是,Koin 无法支持该功能,因为viewModel()sharedViewModel()与 Activity 绑定。但对 nav 的支持已经计划好了2.1.x,您可以在这里跟踪。


现在这是我的解决方案:

  1. 在 Koin 中使用navGraphViewModels()而不是viewModel()
class DetailFr : Fragment() {
    private val vm: DetailViewModel by navGraphViewModels(R.id.main_nav_graph)
}
Run Code Online (Sandbox Code Playgroud)
  1. 让 ViwModel 实现KoinComponent,以便我们可以使用by inject()而不是通过构造函数注入。
class DetailViewModel : ViewModel(), KoinComponent {

    private val repo: DetailRepository by inject()
    // othetr objects you need
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助