在 Jetpack Compose 中使用非本地状态?

Use non-local state in jetpack compose?

可以使用可组合函数中的非本地状态吗?一个示例是一个 Composable,它显示一个文本,其中一个字符串取自 MutableState,存储为通过 Ambient 检索的对象的成员,如下所示:


data class ServiceX (
   val whateverString: MutableState<String>("meow")
)


@Composable
fun Whatever() {
   val serviceX = AmbientServiceX.current
   Text(serviceX.whateverString)
}

whateverString 发生变化时,可组合函数是否会重新绘制?这有什么问题吗?

它在技术上应该可行,但您可能想将 MutableState 更改为 mutableStateOf,这样可以在后台提供更多 compose 功能。

但我建议在撰写时避免这样的模式。一般来说,Ambients 应该很少使用,因为 Ambients 使可组合项 'magic' 不明显,值的来源或触发值更改的位置不明显。它实质上使您的代码很难调试。

倾向于创建独立的组件,因为它们更易于构建和维护 - 并且是组合的最大好处。

@Composable
fun Whatever(whateverString: String) {
   Text(whateverString)
}