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

时间:2018-12-23 08:11:51

标签: android kotlin viewmodel lifecycle koin

我有一个活动申请。

我想将viewModel绑定到父片段生命周期(FlowFragmentLogin),并与子片段(CellFragmentInfoFragmentetc)共享。因此,当我从FlowFragmentLogin移到FlowFragmentMain时,调用了viewModel onCleared()

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

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

2 个答案:

答案 0 :(得分:1)

自导航2.1.0-alpha02

  

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

您可以找到更改日志heredocument

很遗憾,由于viewModel()sharedViewModel()已绑定到“活动”,因此Koin不支持该功能。但是已经在2.1.x中计划了对nav的支持,您可以跟踪here


现在这是我的解决方案:

  1. 在Koin中使用navGraphViewModels()代替viewModel()
class DetailFr : Fragment() {
    private val vm: DetailViewModel by navGraphViewModels(R.id.main_nav_graph)
}
  1. 使ViwModel实现KoinComponent,以便我们可以使用by inject()代替构造方法的注入。
class DetailViewModel : ViewModel(), KoinComponent {

    private val repo: DetailRepository by inject()
    // othetr objects you need
}

希望这会有所帮助

答案 1 :(得分:1)

您可以使用新版本的 Koin(2.1.0)和一些魔术方法来实现:)

您所需要做的就是添加此扩展功能:

inline fun <reified VM : ViewModel> Fragment.sharedGraphViewModel(
    @IdRes navGraphId: Int,
    qualifier: Qualifier? = null,
    noinline parameters: ParametersDefinition? = null
) = lazy {
    val store = findNavController().getViewModelStoreOwner(navGraphId).viewModelStore
    getKoin().getViewModel(ViewModelParameter(VM::class, qualifier, parameters, null, store, null))
}

现在,您可以通过以下方式简单地从嵌套图中获取ViewModel:

private val viewModel: MyViewModel by sharedGraphViewModel(R.id.my_graph)