正如Jetpack compose文档中所述,稳定类型必须符合以下约定。
- 两个实例的equals结果将永远相同相同的两个实例
- 如果类型的公共属性发生更改,Composition将收到通知
- 所有公共财产类型也是稳定
第一个和第三个合同很简单。我怎样才能遵守第二点?
例如,我有一个称为User
的稳定类型
data class User(val username: String, var email: String)
并且我在应用程序流程中更改了电子邮件,我如何通知作文?
根据Jetpack组合稳定性解释:
需要注意的是,参数不一定是不可变的,只要Compose运行时收到所有更改的通知,它们就可以是可变的。对于大多数类型来说,这将是一个不切实际的契约,但是Compose提供了一些可变类来为您维护这个契约,例如
MutableState
、SnapshotStateMap
/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
,因为它生成的一些功能(copy
、equals
(无法与现在可变的电子邮件字段一起使用。
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视频。