Android jetpack compose 中的记住结构仅在可组合函数的上下文中使用?

问题描述 投票:0回答:1

我的问题是关于 jetpack compose 和 kotlin 中使用的记忆结构。正如您很可能已经知道的那样,这些是我所指的:

var first = remember { mutableStateOf(true) } 
var second by remember { mutableStateOf(true) }

现在我的问题是它们是否只能在可组合函数的上下文中使用?我的猜测是答案是肯定的。为了给您提供更多背景信息,我目前正在开发一个项目,并且已经完成了 ui 层和导航部分,现在我正在尝试实现 ViewModel 界面。到目前为止,我对屏幕可组合项中的几乎每个 ui 逻辑都使用了上面的两个。但现在,我注意到我不能再在 UIState 类型的数据类中使用它们。解决方案是简单地将它们声明为 mutableState。这是切换到 hilt/viewModel/依赖注入部分时替换它们的唯一等效方法吗?

我知道这可能很明显,但我认为这会更清晰。预先感谢!

android kotlin android-jetpack-compose android-viewmodel dagger-hilt
1个回答
0
投票

各种

remember
功能都用
@Composable
注释。这使它们本身成为可组合函数,这意味着必须从另一个可组合函数调用它们。如果您确实尝试从不可组合的函数调用它们,您可以轻松验证这一点。你会得到这个错误:

@Composable 调用只能在 @Composable 函数的上下文中发生

remember
函数的存在是为了保护您的状态在重组时不会丢失。重组实际上会再次执行整个函数,因此任何未记住的内容都会丢失。在可组合函数之外,这些函数是无用的,即使 if 它们可以被调用。因此,只需从视图模型中使用的任何内容中删除
remember
即可。

也就是说,如果您记得

MutableState
,那么您也不应该在视图模型中使用它。 MutableState 也是特定于组合的。虽然不是可组合函数(因此它不会在视图模型中产生编译错误),但在组合代码之外正确使用可能很棘手。它可能在大多数情况下都能按预期工作,但最好使用
MutableStateFlow
代替,如 Android 文档 中所示。尽管它们的名称相似,但它们完全不同:
MutableState
来自 Android Compose SDK,其中
MutableStateFlow
集成到 Kotlin 编程语言本身中。不过,它们在概念上是相似的:它们都封装了一个可以观察到变化的值。
How
不过,观察结果完全不同。

© www.soinside.com 2019 - 2024. All rights reserved.