Android compose 可观察状态
文章目录
- 创建可观察状态
- mutableStateOf和remember:
- 使用注意点:
- 状态提升
简单的理解,状态就是一些变量,这个变量不同的值会引起页面的变化
compose中,这个变量必须是可观察的,才能自动引起页面的变化
创建可观察状态
官方介绍:
在可组合项中声明 MutableState 对象的方法有三种:
val mutableState = remember { mutableStateOf(default) }var value by remember { mutableStateOf(default) }val (value, setValue) = remember { mutableStateOf(default) }
使用by委托,需要导入包:
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
mutableStateOf和remember:
mutableStateOf 会创建可观察的 MutableState<T>,后者是与 Compose 运行时集成的可观察类型。
mutableStateOf 方法会返回一个MutableState,MutableState是一个值的持有者,它的读和写都被Compose观察
remember是用来记录这个被观察的值
我这里先理解为:remember可用新老值进行对比,发现变化后,记录最新的值
官方的介绍
相关文章推荐
使用注意点:
使用by委托的方式,可以把创建的MutableState当做原类型使用,而使用=的方式,就需要使用.value来获取值使用,比如:
状态提升
初步理解的状态提升,意思是将可变状态抽出为另一个组合函数,与界面组合函数分离。(组合函数暂时理解为带有@Compose注解的函数)
在状态的可组合函数中调用页面的组合函数
官方例子:
/*** 状态的可组合函数*/
@Composable
fun HelloScreen() {var name by rememberSaveable { mutableStateOf("") }HelloContent(name = name, onNameChange = { name = it })
}
/*** 界面的可组合函数*/
@Composable
fun HelloContent(name: String, onNameChange: (String) -> Unit) {Column(modifier = Modifier.padding(16.dp)) {Text(text = "Hello, $name",modifier = Modifier.padding(bottom = 8.dp),style = MaterialTheme.typography.h5)OutlinedTextField(value = name,onValueChange = onNameChange,label = { Text("Name") })}
}
至此,有疑问的是界面的组合函数的参数,为什么这么写
先看这两个参数什么意思,官方文档介绍如下
Compose 中的状态提升是一种将状态移至可组合项的调用方以使可组合项无状态的模式。Jetpack Compose 中的常规状态提升模式是将状态变量替换为两个参数:value: T:要显示的当前值
onValueChange: (T) -> Unit:请求更改值的事件,其中 T 是建议的新值不过,并不局限于 onValueChange。如果更具体的事件适合可组合项,您应使用 lambda 定义这些事件,就像使用 onExpand 和 onCollapse 定义适合 ExpandingCard 的事件一样。
里面的
onValueChange: (T) -> Unit:请求更改值的事件,其中 T 是建议的新值
简单来说,就是值变化的时候,调用这个事件,从而引起页面的重组。从例子里面看,就是:
OutlinedTextField的onValueChange事件,就是onNameChange事件
onNameChange的实现是在HelloScreen中实现的: HelloContent(name = name, onNameChange = { name = it })
name=it,也就是说OutlinedTextField的value更改的时候,会把value传递给name,name就会改变
name又是被观察的状态,改变会引起重组界面。
至此,我们了解了状态提升时,参数这么写的原因。
后面还有一句:
不过,并不局限于 onValueChange。如果更具体的事件适合可组合项,您应使用 lambda 定义这些事件,就像使用 onExpand 和 onCollapse 定义适合 ExpandingCard 的事件一样。
这个应该属于自己扩展了
Android compose 可观察状态相关推荐
- Android Compose Bloom 项目实战 (一) : 项目说明与配置
1. 项目介绍 Bloom是谷歌 AndroidDevChallenge (Android 开发挑战赛) 中的一期活动,目的是为了推广Compose,非常适合用来练手,通过这个项目,我们可以很好的入门 ...
- android获取wifi连接状态,获取android设备wifi连接状态
本文将介绍如何获取android设备wifi连接状态! 添加访问权限(AndroidManifest.xml文件里) Java代码(MainActivity.java文件) package com.e ...
- android 利用eclipse观察内存变化情况
android 利用eclipse观察内存变化情况 使用方法比较简单: · 选择DDMS视图,并打开Devices视图和Heap视图 · 点击选择要监控的进程,比如:上图中我选择的是system_pr ...
- android 监听网络状态
今天,讲讲怎么监听手机网络状态的改变. 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:nam ...
- Android获取当前网络状态
Android获取当前网络状态 效果图 有网络 没有网络 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9052 ...
- android 状态模式,Android编程设计模式之状态模式详解
本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们 ...
- Android Compose——一个简单的Bilibili APP
Bilibili移动端APP 简介 依赖 效果 登录 效果 WebView 自定义TobRow的Indicator大小 首页 推荐 LazyGridView使用Paging3 热门 排行榜 搜索 模糊 ...
- android进入wifi权限,判断android设备wifi连接状态,判断android设备wifi,添加访问权限(Andro...
判断android设备wifi连接状态,判断android设备wifi,添加访问权限(Andro 添加访问权限(AndroidManifest.xml文件里) ```Java代码(MainActivi ...
- Android Compose 权限请求
Android Compose 权限请求 在Compose中以往的权限请求方式就不再适用了.因此我在使用过程中发现了一种非常简单优雅的权限申请方法. 全部代码见Github Shanyaliux/Co ...
最新文章
- Pytorch 类型错误:Expected object of type torch.FloatTensor but found type torch.cuda.FloatTensor.
- spring2.5 mvc使用注解upload上传文件
- 字节AI Lab总监李磊离职加入UCSB,马维英后又一大牛回归学界
- 学习笔记84—[深度学习]神经网络反向传播(BackPropagation)
- 利用Lucene.net搜索引擎进行多条件搜索的做法
- Python学习之GUI--SQL数据库连接
- 计算机PMA,PMA通信协议分析及仿真工具
- 前端学习(3332):ant design介绍button
- Flask框架——请求钩子与request请求对象
- oracle使用打开数据库,使用工具访问ORACLE数据库(一)
- IDEA 值得推荐的十几款优秀插件,狂,拽,屌!
- 常用的C语言库函数实现
- Vscode新建文件输入感叹号不能生成头文件
- 修怪曹操杀了华佗_拔剑-浆糊的传说_新浪博客
- python time strptime_Python time.strptime方法代碼示例
- Dumpling 导出表内并发优化丨TiDB 工具分享
- Redis--重写机制(减小AOF文件大小)
- 乐视:基于Docker的RDS,我们是这样做的
- mysql悲观锁for update
- 如何批量在图片上加统一的文字?