当前位置:网站首页>Jetpack Compose 管理状态(一)
Jetpack Compose 管理状态(一)
2022-06-21 16:05:00 【灯塔@kuaidao】
前言
Jetpack Compose 可帮助您明确状态在 Android 应用中的存储位置和使用方式,状态管理是使用 Compose 开发ui首要面临的问题。
Jetpack compose 引入新的开发范式 (MVI)
应用中的状态是指可以随时间变化的任何值。这是一个非常宽泛的定义,从 Room 数据库到类的变量,全部涵盖在内。
所有 Android 应用都会向用户显示状态。下面是 Android 应用中的一些状态示例:
- 在无法建立网络连接时显示的信息提示控件。
- 博文和相关评论点赞背景变化,或者icon变化。
- 在用户点击按钮时播放的波纹动画。
状态和组合
由于 Compose 是声明式工具集,不能按照之前命令式手动进行界面ui刷新。更新它的唯一方法是通过新参数调用同一可组合项,这里需要引入状态控制。状态的更改会触发可组合函数进行重组。
@Composable
fun HelloContent() {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "Hello!",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
OutlinedTextField(
value = "",
onValueChange = {
},
label = {
Text("Name") }
)
}
}

如果运行此代码,将不会看到任何反应。OutlinedTextField无法输入内容,这是因为,OutlinedTextField 不会自行更新,但会在其 value 参数更改时更新,这是因 Compose 中组合和重组的工作原理造成的.这里的更新即是OutlinedTextField可组合函数进行重组。
重要的词汇:
初始组合:通过首次运行可组合项创建组合。
组合:Jetpack Compose 在执行可组合项时构建的界面描述。
重组:在数据(状态)发生变化时重新运行可组合项以更新组合。
可组合项中的状态

1.可组合函数可以使用 remember 可组合项记住单个对象,系统会在初始组合期间将由 remember 计算的值存储在组合中,并在重组期间返回存储的值。remember 既可用于存储可变对象,又可用于存储不可变对象。
2.mutableStateOf 会创建可观察的 MutableState,MutableState是与 Compose 运行时集成的可观察类型。
可组合项中声明 MutableState 对象的方法有三种:
val mutableState = remember {
mutableStateOf(default) }
var value by remember {
mutableStateOf(default) }
val (value, setValue) = remember {
mutableStateOf(default) }
tips:
虽然 remember 可帮助您在重组后保持状态,但不会帮助您在配置更改后保持状态,
为此,您必须使用 rememberSaveable。rememberSaveable 会自动保存可保存在 Bundle 中的任何值。
对于其他值,您可以将其传入自定义 Saver 对象。
remember 可组合项与 MutableState 可组合项关系
remember可组合项在可组合函数中保持状态。MutableState是实现了State接口的可被观察状态。写法上
remember {
mutableStateOf(default) }
其他受支持的状态类型
Jetpack Compose 支持其他可观察类型,在 Jetpack Compose 中读取其他可观察类型之前,您必须将其转换为State,以便 Jetpack Compose 可以在状态发生变化时自动重组界面。
Compose 附带一些可以根据 Android 应用中使用的常见可观察类型创建 State 的函数:
LiveData
Flow
RxJava2
要点:Compose 将通过读取 State接口 自动重组界面。
如果您在 Compose 中使用 LiveData 等其他可观察类型,应该先将其转换为 State,然后再使用诸如 LiveData.observeAsState() 之类的可组合扩展函数在可组合项中读取它。
注意:在 Compose 中将可变对象(如 ArrayList 或 mutableListOf())用作状态会导致用户在您的应用中看到不正确或陈旧的数据。是否是可观察对象取决于是否实现了State 接口,不推荐使用不可观察的对象
有状态与无状态
使用 remember 存储对象的可组合项会创建内部状态,使该可组合项有状态。HelloContent 就是一个有状态可组合项的示例,因为它会在内部保持和修改自己的 name 状态。在调用方不需要控制状态,并且不必自行管理状态便可使用状态的情况下,“有状态”会非常有用。但是,具有内部状态的可组合项往往不易重复使用,也更难测试。
无状态可组合项是指不保持任何状态的可组合项。实现无状态的一种简单方法是使用[状态提升]。
在开发可重复使用的可组合项时,您通常想要同时提供同一可组合项的有状态和无状态版本。有状态版本对于不关心状态的调用方来说很方便,而无状态版本对于需要控制或提升状态的调用方来说是必要的。
@Composable
fun HelloContent() {
Column(modifier = Modifier.padding(16.dp)) {
var name by remember {
mutableStateOf("") }
if (name.isNotEmpty()) {
Text(
text = "Hello, $name!",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
}
OutlinedTextField(
value = name,
onValueChange = {
name = it },
label = {
Text("Name") }
)
}
}
系统提供rememberxxx 函数
边栏推荐
- 即将步入大四,开始我最真情的告白
- 【mysql学习笔记19】多表查询
- Exness: the impact of inflation in the United States is too great, and the leaders of the Federal Reserve have expressed their position one after another
- Android kotlin 类委托 by,by lazy关键
- 牛客网:大数加法
- [MySQL learning notes 14] DQL statement execution sequence
- path.join() 、path.basename() 和 path.extname()
- 面向流动人口管理的人脸验证系统设计及实现 论文+答辩PPT+项目工程文件
- Matlab中xticks函数
- [MySQL learning notes 11] sort query
猜你喜欢

Use picgo core and Alibaba cloud to automatically upload typera pictures

PowerPoint tutorial, how to change page orientation and slide size in PowerPoint?

Matlab中xticks函数
![[MySQL learning notes 19] multi table query](/img/e6/4cfb8772e14bc82c4fdc9ad313e58a.png)
[MySQL learning notes 19] multi table query

Qt 知识:使用 QGraphicsPixmapItem类

设计一个打印整棵树的打印函数

Why did you win the first Taosi culture award of 20000 RMB if you are neither a top R & D expert nor a sales bull?

Set up your own website (11)

Common formula of derivative__ Common formulas of indefinite integral

Qt5 knowledge: string list qstringlistmodel
随机推荐
[MySQL learning notes 18] constraints
数据类型
Use picgo core and Alibaba cloud to automatically upload typera pictures
go corn定时任务简单应用
Still using xshell? Try this cool SSH terminal tool, which is very powerful!
AttributeError: ‘Book‘ object has no attribute ‘sheet‘
面向流动人口管理的人脸验证系统设计及实现 论文+答辩PPT+项目工程文件
容器云是什么意思?与堡垒机有什么区别?
StarkRocks 第二讲 基本操作(1)
牛客网:验证IP地址
【mysql学习笔记16】权限管理
gp中的decode函数实现
map和实体类互转的代码示例
【mysql学习笔记19】多表查询
Mqtt of NLog custom target
rtmp webrtc 协议 openssl 等安装
The beta version of move protocol is stable, and it is temporarily decided to expand the scale of the prize pool
二叉树的序列化与反序列化
Niuke network: verify the IP address
自然科学的根本任务