我的问题是关于 jetpack compose 和 kotlin 中使用的记忆结构。正如您很可能已经知道的那样,这些是我所指的:
var first = remember { mutableStateOf(true) }
var second by remember { mutableStateOf(true) }
现在我的问题是它们是否只能在可组合函数的上下文中使用?我的猜测是答案是肯定的。为了给您提供更多背景信息,我目前正在开发一个项目,并且已经完成了 ui 层和导航部分,现在我正在尝试实现 ViewModel 界面。到目前为止,我对屏幕可组合项中的几乎每个 ui 逻辑都使用了上面的两个。但现在,我注意到我不能再在 UIState 类型的数据类中使用它们。解决方案是简单地将它们声明为 mutableState。这是切换到 hilt/viewModel/依赖注入部分时替换它们的唯一等效方法吗?
我知道这可能很明显,但我认为这会更清晰。预先感谢!
各种
remember
功能都用@Composable
注释。这使它们本身成为可组合函数,这意味着必须从另一个可组合函数调用它们。如果您确实尝试从不可组合的函数调用它们,您可以轻松验证这一点。你会得到这个错误:
@Composable 调用只能在 @Composable 函数的上下文中发生
remember
函数的存在是为了保护您的状态在重组时不会丢失。重组实际上会再次执行整个函数,因此任何未记住的内容都会丢失。在可组合函数之外,这些函数是无用的,即使 if 它们可以被调用。因此,只需从视图模型中使用的任何内容中删除 remember
即可。
也就是说,如果您记得
MutableState
,那么您也不应该在视图模型中使用它。 MutableState 也是特定于组合的。虽然不是可组合函数(因此它不会在视图模型中产生编译错误),但在组合代码之外正确使用可能很棘手。它可能在大多数情况下都能按预期工作,但最好使用 MutableStateFlow
代替,如 Android 文档 中所示。尽管它们的名称相似,但它们完全不同:MutableState
来自 Android Compose SDK,其中 MutableStateFlow
集成到 Kotlin 编程语言本身中。不过,它们在概念上是相似的:它们都封装了一个可以观察到变化的值。 How
不过,观察结果完全不同。