微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jetpack Compose 记得实际上做了什么,它是如何在引擎盖下工作的?

如何解决Jetpack Compose 记得实际上做了什么,它是如何在引擎盖下工作的?

查看 codelab 的基本教程,有一个片段可以在单击时增加按钮上的计数器

@Composable
fun MyScreenContent(names: List<String> = listof("Android","there")) {
    val counterState = remember { mutableStateOf(0) }

    Column(modifier = Modifier.fillMaxHeight()) {
        Column(modifier = Modifier.weight(1f)) {
            for (name in names) {
                Greeting(name = name)
                Divider(color = Color.Black)
            }
        }
        Counter(
            count = counterState.value,updateCount = { newCount ->
                counterState.value = newCount
            }
        )
    }
}


@Composable
fun Counter(count: Int,updateCount: (Int) -> Unit) {
    Button(
        onClick = { updateCount(count + 1) },colors = ButtonConstants.defaultButtonColors(
            backgroundColor = if (count > 5) Color.Green else Color.White
        )
    ) {
        Text("I've been clicked $count times")
    }
}

很明显,remember { mutableStateOf(0) } 存储状态/值。我的问题是记忆在幕后做了什么。在没有记住的情况下使用 var count = remember { 0 }mutableStateOf(0) 不会增加值。

fun MyScreenContent(names: List<String> = listof("Android","there")) {
   
    var count = remember { 0 }

    Column(modifier = Modifier.fillMaxHeight()) {
        Column(modifier = Modifier.weight(1f)) {
            for (name in names) {
                Greeting(name = name)
                Divider(color = Color.Black)
            }
        }
        Counter(
            count = count,updateCount = { newCount ->
                count = newCount
            }
        )
    }
}

上面的代码段不会更新打印在 Text 上的值,记得只适用于 MutableState 吗?

解决方法

remember - 允许您记住先前重构调用的状态,仅此而已。 因此,例如,如果您在初始运行时随机化颜色。随机颜色将被计算一次,并在需要重新组合时重复使用。

所以... 记住 = 存储值以防调用 recompose。

现在第二件事是知道何时应该真正触发重新编写。 可变状态会有所帮助。

mutablestate = 存储值 AND 以防我使用此数据更新所有元素的值触发重构。

,

Codelab example 提到了 remembermutableState as

对状态变化做出反应是 Compose 的核心。撰写 应用程序通过调用可组合函数将数据转换为 UI。如果你的 数据改变,你用新数据调用这些函数,创建 更新的用户界面。 Compose 提供了一些工具来观察你的 应用程序的数据,它会自动调用你的功能——这是 称为重组。 Compose 还会查看一个 单独的可组合,因此它只需要重新组合组件 其数据已更改并且可以跳过组合未更改的数据 受到影响。

在幕后,Compose 使用自定义的 Kotlin 编译器插件,因此当 底层数据发生变化,可组合函数可以是 重新调用以更新 UI 层次结构。

要将内部状态添加到可组合,请使用 mutableStateOf 函数,它提供了一个可组合的可变内存。没有一个 每次重组都有不同的状态,记住可变状态 使用记住。并且,如果有多个可组合实例 在屏幕上的不同位置,每个副本都会有自己的版本 的状态。您可以将内部状态视为私有变量 一个班级。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。