我有一个芯片,当被点击时会改变配置。然而,当用户导航返回(popbackstack)或导航到另一个屏幕时,点击的芯片重置其先前的位置。据我所知,我将不得不使用一个视图模型来传递芯片状态,并以这种方式保存它?我找不到一种方法,虽然存储“记忆保存”在一个视图模型。
我如何才能做到这一点?感谢任何反馈!
我的示例芯片:
@Composable
fun CatsChip() {
val textChipRememberOneState = rememberSaveable { mutableStateOf(false) }
TextChip(
isSelected = textChipRememberOneState.value,
shape = Shapes(medium = RoundedCornerShape(15.dp)),
text = "Cats",
selectedColor = LightGreen,
onChecked = {
textChipRememberOneState.value = it
},
)
}
1条答案
按热度按时间khbbv19g1#
您可以将
MutableStateFlow
中的状态保存在ViewModel
中。要在Compose中使用
ViewModel
s,需要将以下依赖项添加到app/build.gradle
文件中现在,您可以使用
viewModel()
函数在可组合对象中获取ViewModel
示例。有了
ViewModel
s,你就不需要再使用rememberSaveable
了,因为状态会保存在ViewModel
中,但是,如果你想让状态在进程死亡(而不仅仅是配置更改)后仍然存在,那么你必须将状态保存在SavedStateHandle
中。下面是一个
ViewModel
的例子,它只将状态保存在内存中,但不将其保存在SavedStateHandle
中。下面是一个
ViewModel
的例子,它将状态保存在SavedStateHandle
中。那么用法如下所示
有关更多用例,请参见撰写状态提升文档的业务逻辑部分
下面是一个使用Compose导航的
Composable
演示,展示了上面的两个视图模型,将其与rememberSaveable
进行了比较,并以两种不同的方式将其范围划分到父上下文和NavBackStackEntry
。这显示了不同的作用域如何影响ViewModel
s的生命周期。在
app/build.gradle
文件中需要Compose导航依赖项您可以通过在应用程序的某些可组合内容中调用
Demo()
来检查演示。单击按钮进行导航并查看backstack如何更改。作用域为父上下文的ViewModel
s和rememberSaveable
将始终保留状态,而作用域为每个NavBackStackEntry
的ViewModel
s和rememberSaveable
将仅为它们自己的导航目的地保留状态,这可以在返回时看到。此外,保存在MemoryOnlyViewModel
s中的状态将不会在进程死亡后继续存在,您可以通过以下方式进行检查:1.通过按Home键将应用程序发送到后台(但不要在应用程序切换器中关闭它)
1.通过在IDE终端选项卡中使用应用程序的软件包名称运行以下命令来终止进程
1.从应用程序切换器再次打开应用程序
如果您正确地遵循了这些步骤,并成功地以这种方式杀死和恢复了进程,那么您应该注意到只有
MemoryOnlyViewModel
丢失/重置了它们的状态。下面是整个演示代码。只需复制并粘贴到一个新的Kotlin文件,并从可组合内容调用Demo()可组合。