电子商务网站整体策划,甲级建筑设计公司,阿里巴巴官网网址是多少,网站设计影响seo的因素一、需求
在显示界面中#xff0c;数据变动#xff0c;界面刷新是非常常见的操作#xff0c;所以使用compose该如何实现呢#xff1f;
二、remember、mutableStateOf的使用
我们可以借助标题的两个概念 remember、mutableStateOf来完成。这里先不写定义#xff0c;定义…一、需求
在显示界面中数据变动界面刷新是非常常见的操作所以使用compose该如何实现呢
二、remember、mutableStateOf的使用
我们可以借助标题的两个概念 remember、mutableStateOf来完成。这里先不写定义定义看完也不是很明白从例子中去学习先看段code
Composable
fun AutoIncrementTest1() {var count 0Row(modifier Modifier.padding(20.dp),verticalAlignment Alignment.CenterVertically) {Text(text $count,Modifier.padding(horizontal 15.dp))Button(onClick { count }) {Text(text auto-increment )}}
}这段代码是显示一个Text和一个Button点击Button后count变量自增然后在Text中显示出来。
但是实际测试的时候点击按钮Text显示数字是不会变化的原因是 Compose 并未跟踪此变量更改。也就是说这个变量不会触发界面的刷新。
为了解决上面的问题就可以使用 mutableStateOf 函数来看下修改后的代码 State 和 MutableState 是两个接口它们具有特定的值每当该值发生变化时它们就会触发界面更新重组。 setContent {ComposeTestTheme {Surface(color MaterialTheme.colors.background,) {AutoIncrementTest2()}}
}Composable
fun AutoIncrementTest2() {var count mutableStateOf(0)Row(modifier Modifier.padding(20.dp),verticalAlignment Alignment.CenterVertically) {Text(text ${count.value},Modifier.padding(horizontal 15.dp))//用到的时候需要.value获取Button(onClick { count.value }) {Text(text auto-increment )}}
}我们把变量改成使用mutableStateOf函数但是我点击按钮Text的显示依然不会改变为啥呢
原因是在count改动的时候Surface接收的这个Composable函数就会重绘即将这个AutoIncrementTest2函数从头调用一遍每次调用时候走到第一行语句count就又赋值为0所以看起来就是没有改变依然是0。
在这种情况下假如还想记住上一次变量值就要用到remember来看下修改后的代码
setContent {ComposeTestTheme {Surface(color MaterialTheme.colors.background,) {AutoIncrementTest2()}}
}Composable
fun AutoIncrementTest3() {var count remember {mutableStateOf(0);}Row(modifier Modifier.padding(20.dp),verticalAlignment Alignment.CenterVertically) {Text(text ${count.value},Modifier.padding(horizontal 15.dp))//用到的时候需要.value获取Button(onClick { count.value }) {Text(text auto-increment )}}
}这时候在点击按钮的时候Text上显示的就是自增的数字。 您可以将 remember 视为一种在组合中存储单个对象的机制就像私有 val 属性在对象中执行的操作一样。 当然我们还可以优化下上面每次使用count的时候都需要用.value来获取这里再引入一个关键字by修改后的代码如下
setContent {ComposeTestTheme {Surface(color MaterialTheme.colors.background,) {AutoIncrementTest2()}}
}Composable
fun AutoIncrementTest3() {var count by remember {mutableStateOf(0);}Row(modifier Modifier.padding(20.dp),verticalAlignment Alignment.CenterVertically) {Text(text ${count},Modifier.padding(horizontal 15.dp))Button(onClick { count }) {Text(text auto-increment )}}
}使用by实现了属性委托就是属性的 set、get 的操作交给另一个对象器完成。我们可以间接读取 count 并将其设置为可变而无需每次都显式引用 MutableState 的 value 属性。
总结
mutableStateOf 表明某个变量是有状态的对变量进行监听当状态改变时可触发重绘。remember 记录变量的值使得下次绘制执行的时候不会再次进行初始化。
三、rememberSaveable 的使用
remember 函数仅在可组合项包含在组合中时起作用。旋转屏幕后整个 activity 都会重启所有状态都将丢失。当发生任何配置更改或者进程终止时也会出现这种情况。
可以使用 rememberSaveable而不使用 remember。这会保存每个在配置更改如旋转和进程终止后保留下来的状态。 var shouldShowOnboarding by rememberSaveable { mutableStateOf(true) }运行应用旋转屏幕更改为深色模式或者终止进程。除非您之前退出了应用否则系统不会显示初始配置屏幕。
参考文章 Compose中的remember和mutableStateOf Google官方教程