Compose中的状态

大家好,今天我们来讲一下Compose中的状态。 我们之前说过,应用简单来说就是界面+数据。所以我们今天就一起来看一下Compose是怎么记录数据的。Compose中通过State可以来记录数据,记录和程序界面的交互。 我们一起来新建一个简单的计数器程序,工程命名为ComposeLesson2。 这个计数器程序如下图:

图中有一个文本用于显示计数的值,一个按钮用来实现加1功能。

我们来看一下下面不用State的代码:

kotlin 复制代码
@Composable
fun AddNumber() {
    var num = 0 //Don't do this
    Row {
        Text(
            num.toString(),
            modifier = Modifier.padding(10.dp)
        )

        ElevatedButton(
            onClick = {
                num += 1
            },
            modifier = Modifier.padding(start = 10.dp)
        ) {
            Text("+1")
        }
    }
}

这时候我们点击+1按钮是没有反应的。

上述的代码无法按预期发挥作用。为变量num设置不同的值不会使Compose检测到其状态更改,因此不会产生任何效果。

同时,上述函数中第一行将num设置为0. 可组合函数在界面中可以按照任意顺序频繁执行,每一次进入该函数都会使num变量被重新赋值为0.

如需向可组合函数中添加内部状态,可以使用mutableStateOf函数。该函数可以让Compose重组读取最新状态。

同时,为了使重组后能记住之前的状态,我们需要使用remember函数。

使用remember后的函数的程序如下:

scss 复制代码
@Composable
fun AddNumber() {
    var num by remember {
        mutableStateOf(0)
    }
    Row {
        Text(
            num.value.toString(),
            modifier = Modifier.padding(10.dp)
        )

        ElevatedButton(
            onClick = {
                num.value += 1
            },
            modifier = Modifier.padding(start = 10.dp)
        ) {
            Text("+1")
        }
    }
}

上述程序中,我们用到了remember和mutableStateOf,这时再取num的值时就需要用.value。

为了方便,我们可以使用by关键字来实现属性委托:

我们把=改成by,最终程序如下:

scss 复制代码
@Composable
fun AddNumber() {
    var num by remember {
        mutableStateOf(0)
    }
    Row {
        Text(
            num.toString(),
            modifier = Modifier.padding(10.dp)
        )

        ElevatedButton(
            onClick = {
                num += 1
            },
            modifier = Modifier.padding(start = 10.dp)
        ) {
            Text("+1")
        }
    }
}

运行后我们再来点击一下+1按钮,就可以看到实现了+1的效果。

本文的代码已提交到以下github地址:

github.com/gucheng3116...

相关推荐
总捣什么乱120 分钟前
MySQL MySQL是怎么保证主备一致的?
android·mysql·adb
zzm6281 小时前
精读 HinDroid:基于异构信息网络的安卓恶意软件检测
android
weixin_440784111 小时前
Android基础知识汇总
android·java·android studio
small-pudding2 小时前
Cocos Creator Android 热更新方案实践:逻辑更新、远程 Bundle 与线上回滚
android
00后程序员张2 小时前
iOS加固技术路线全面解析:Bitcode模式、源码模式与汇编模式对比及爱加密优势
android·汇编·ios·小程序·uni-app·cocoa·iphone
summerkissyou19872 小时前
android - 性能 - Perfetto - 内存分析教程及例子
android·性能
超开心~3 小时前
Android AAudio介绍及流程分析
android
取个名字太难了~3 小时前
最新手机外接相机实时传输 + 动态美颜完整项目源码
android·数码相机·智能手机·美颜·相机连接·demu
say_fall3 小时前
【Linux系统编程】文件操作基础:C标准库、系统调用、fd是什么和fd与FILE*的关系
android·linux·c语言
ii_best12 小时前
更新!移动端开发软件按键安卓版&手机助手v5.1.0上线!本地AI识别全面解锁,脚本开发再升级
android·人工智能·ios·按键精灵