美文网首页
Compose学习 - remember、mutableStat

Compose学习 - remember、mutableStat

作者: Bfmall | 来源:发表于2023-10-06 14:39 被阅读0次

    一、需求

    在显示界面中,数据变动,界面刷新是非常常见的操作,所以使用compose该如何实现呢?

    二、remember、mutableStateOf的使用

    我们可以借助标题的两个概念 remember、mutableStateOf来完成。这里先不写定义,定义看完也不是很明白,从例子中去学习,先看段code:

    @Composable
    fun AutoIncrementTest1() {
        var count = 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 ")
            }
        }
    }
    

    这段代码是显示一个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) }
    

    运行应用,旋转屏幕,更改为深色模式,或者终止进程。除非您之前退出了应用,否则系统不会显示初始配置屏幕。

    ————————————————
    版权声明:本文为CSDN博主「孔小乐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/kongqwesd12/article/details/132556890

    相关文章

      网友评论

          本文标题:Compose学习 - remember、mutableStat

          本文链接:https://www.haomeiwen.com/subject/ixopbdtx.html