如果Stable类型的公共属性发生更改,如何通知Composition



正如Jetpack compose文档中所述,稳定类型必须符合以下约定。

  1. 两个实例的equals结果将永远相同相同的两个实例
  2. 如果类型的公共属性发生更改,Composition将收到通知
  3. 所有公共财产类型也是稳定

第一个和第三个合同很简单。我怎样才能遵守第二点?

例如,我有一个称为User的稳定类型

data class User(val username: String, var email: String)

并且我在应用程序流程中更改了电子邮件,我如何通知作文?

根据Jetpack组合稳定性解释:

需要注意的是,参数不一定是不可变的,只要Compose运行时收到所有更改的通知,它们就可以是可变的。对于大多数类型来说,这将是一个不切实际的契约,但是Compose提供了一些可变类来为您维护这个契约,例如MutableStateSnapshotStateMap/List/等。因此,将这些类型用于可变属性将允许类维护@Stable的约定。

同一篇文章中的示例建议确保类中的任何var实际上都是MutableState:

@Stable
class MyStateHolder {
var isLoading by mutableStateOf(false)
}

在你的例子中,它可能是这样的:

@Stable
data class User(val username: String) {
var email by mutableStateOf("")
}

请注意,此时可能不需要data class,因为它生成的一些功能(copyequals(无法与现在可变的电子邮件字段一起使用。

Compose有一个特殊的State类型,允许您在需要重新组合时发出通知。这是最常见的重组方式。

data类是一个很好的工具,它可以为所有字段提供开箱即用的copy,但您应该避免使用var,只为字段使用val,以避免出现错误。

因此,更新字段的一个基本示例如下:

var state by remember { mutableStateOf(User(username = "", email = "")) }
TextField(
value = state.username,
onValueChange = {
state = state.copy(username = it)
}
)

您可以以相同的方式使用Flow/LiveData,因为它们可以与collectAsState/observeAsState一起在State中收集。

更多信息可以在Compose文档中找到,包括这段解释基本原理的youtube视频。

最新更新