共享 viewModel 实现了片段生命周期
Shared viewModel achived fragment lifecycle
如何在没有 activity 的情况下将共享 viewModel 与片段一起使用?
与代码类似,但使用 ParentFragment 代替 requireActivity()。在这种情况下,当 ParentFragment 将被销毁时,SharedViewModel 将被清除,但是当我从 activity 提供 SharedViewModel 时,它不会在 ParentFragment 被销毁时被清除。
并且我使用导航组件,这意味着我不能为片段设置标签然后使用 findFragmentByTag()
class ParentFragment:Fragment{
override fun onCreate(savedInstanceState: Bundle?) {
var viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class)
}
}
class ChildFragment:Fragmnet{
override fun onCreate(savedInstanceState: Bundle?) {
var viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class)
}
}
看到你可以在你想要共享viewmodel的所有片段中初始化viewModel,并使用Rx和viewModel,你在这些片段中的所有进程将保持运行直到你想取消它,你可以调用viewModel.oncleard() 来自 Activity 或 Fragment.
public override fun onCleared() {
super.onCleared()
compositeDisposable.dispose()
// or cancel any process
}
If you do not know ViewModel Scope, please check this image
您可以尝试 scoped-vm - 它允许您为由字符串键标识的 scope 请求 ViewModel。范围一直存在,直到请求 ViewModel 的最后一个片段被销毁,然后 ViewModel 被清除。
您可以使用此代码在 ParentFragment 和 ChildFragment 中获取 SharedViewModel。
ScopedViewModelProviders
.forScope(this, "scope")
.of(requireActivity())
.get(SharedViewModel::class.java)
如何在没有 activity 的情况下将共享 viewModel 与片段一起使用? 与代码类似,但使用 ParentFragment 代替 requireActivity()。在这种情况下,当 ParentFragment 将被销毁时,SharedViewModel 将被清除,但是当我从 activity 提供 SharedViewModel 时,它不会在 ParentFragment 被销毁时被清除。
并且我使用导航组件,这意味着我不能为片段设置标签然后使用 findFragmentByTag()
class ParentFragment:Fragment{
override fun onCreate(savedInstanceState: Bundle?) {
var viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class)
}
}
class ChildFragment:Fragmnet{
override fun onCreate(savedInstanceState: Bundle?) {
var viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class)
}
}
看到你可以在你想要共享viewmodel的所有片段中初始化viewModel,并使用Rx和viewModel,你在这些片段中的所有进程将保持运行直到你想取消它,你可以调用viewModel.oncleard() 来自 Activity 或 Fragment.
public override fun onCleared() {
super.onCleared()
compositeDisposable.dispose()
// or cancel any process
}
If you do not know ViewModel Scope, please check this image
您可以尝试 scoped-vm - 它允许您为由字符串键标识的 scope 请求 ViewModel。范围一直存在,直到请求 ViewModel 的最后一个片段被销毁,然后 ViewModel 被清除。
您可以使用此代码在 ParentFragment 和 ChildFragment 中获取 SharedViewModel。
ScopedViewModelProviders
.forScope(this, "scope")
.of(requireActivity())
.get(SharedViewModel::class.java)