我有一个活动申请。
我想将viewModel绑定到父片段生命周期(FlowFragmentLogin
),并与子片段(CellFragment
,InfoFragment
,etc
)共享。因此,当我从FlowFragmentLogin
移到FlowFragmentMain
时,调用了viewModel onCleared()
。
但是我发现的唯一方法是在Activity之间共享viewModel,它是Fragments: https://insert-koin.io/docs/1.0/documentation/koin-android/index.html
对生命周期所有者没有控制权。 Wich对我来说是不可接受的,至少是因为该viewModel将一直存在直到应用程序终止。
答案 0 :(得分:1)
自导航2.1.0-alpha02
:
现在,您可以通过为Kotlin用户使用by navGraphViewModels()属性委托或使用添加到NavController的getViewModelStore()API来创建在导航图级别范围内的ViewModel。
很遗憾,由于viewModel()
或sharedViewModel()
已绑定到“活动”,因此Koin不支持该功能。但是已经在2.1.x
中计划了对nav的支持,您可以跟踪here。
现在这是我的解决方案:
navGraphViewModels()
代替viewModel()
。class DetailFr : Fragment() {
private val vm: DetailViewModel by navGraphViewModels(R.id.main_nav_graph)
}
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)