在片段中,我们有
private val activityViewModel: MainActivityViewModel by activityViewModels()
private val fragmentViewModel: MainFragmentViewModel by viewModels()
以获得整个应用程序中的共享视图模型(活动视图模型)和视图特定视图模型(片段视图模型)的示例。
我是来作曲的。
如何在jetpack compose中获得两个不同范围的视图模型?
从文件上,我可以看到这一行,
viewModel()返回现有的ViewModel或在给定范围内创建新的ViewModel。
但是,我如何指定视图模型的范围呢?
附言
我已经通过this question,这是类似的,但它没有任何答案。
4条答案
按热度按时间toe950271#
通常在一个复合树中,比如在
setContent
内容中,有一个视图模型范围在所有子复合之间共享。如果需要,可以使用
LocalViewModelStoreOwner
覆盖它:“合成导航”将覆盖每个导航目的地的“合成导航”。请参阅this answer以了解如何在导航目的地之间共享它。
zzwlnbp82#
详细说明@Pylyp Dukhov。由于可以直接在树中更改默认提供程序,因此可以创建一个函数来获取特定
ViewModelStore
中的viewModel
。我已经为此做了一个gist。
内容如下:
在活动存储上获取viewModel与从默认树的存储中获取viewModel一样简单。
x0fgdtte3#
请确保导入合成视图模型。
另外,getActivity()函数不能直接使用,请使用下面的Context扩展。参考:https://stackoverflow.com/a/67927037/6512100
2ic8powd4#
根据这个链接
例如,如果我有一个
settings
导航图,我可以导航到theme
,如果我想要theme
使用settingsViewModel
,那么我可以通过以下方式实现这一点:或者,如果你想让
theme
使用settingsViewModel
,那么这个范围就是theme
本身。你可以像下面这样做,或者直接在你的theme
可组合函数中创建一个settingsViewModel
示例,而不用像这样传递参数。如果你这样做,你会注意到当你从theme
按回settings
时,settingsViewModel
内部的onCleared
将被调用。