【问题标题】:Why use "remember" keyword in AlertDialog? (Jetpack compose)为什么在 AlertDialog 中使用“remember”关键字? (喷气背包组成)
【发布时间】:2021-09-16 05:24:27
【问题描述】:

代码参考:https://foso.github.io/Jetpack-Compose-Playground/material/alertdialog/

@Composable
fun AlertDialogSample() {
    MaterialTheme {
        Column {
            val openDialog = remember { mutableStateOf(false)  }

            Button(onClick = {
                openDialog.value = true
            }) {
                Text("Click me")
            }

            if (openDialog.value) {

                AlertDialog(
                    onDismissRequest = {
                        // Dismiss the dialog when the user clicks outside the dialog or on the back
                        // button. If you want to disable that functionality, simply use an empty
                        // onCloseRequest.
                        openDialog.value = false
                    },
                    title = {
                        Text(text = "Dialog Title")
                    },
                    text = {
                        Text("Here is a text ")
                    },
                    confirmButton = {
                        Button(

                            onClick = {
                                openDialog.value = false
                            }) {
                            Text("This is the Confirm Button")
                        }
                    },
                    dismissButton = {
                        Button(

                            onClick = {
                                openDialog.value = false
                            }) {
                            Text("This is the dismiss Button")
                        }
                    }
                )
            }
        }

    }
}

我已经了解了 remember 和 mutableStateOf 关键字。 但在这段代码中,我认为“记住”关键字不是必需的。

如果按钮被点击,变量 openDialog 实现 如果 onDismissRequest,变量 openDialog 为 false

所有功能都由代码编写者被动控制..(不是由记住关键字自动管理) 那么,为什么在这个代码案例中使用“remember”呢?

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    通过使用remember,可组合存储之前的组合值,否则每次都会覆盖它。谢谢色雷斯人。

    参考:https://www.jetpackcompose.app/donut-hole-skipping/

    【讨论】:

    • remember 用于存储先前组合的值。使用 mutableState,您可以将其视为 LiveData,其中 compose 观察其值的变化,以便在其值发生变化时重新组合。
    【解决方案2】:

    假设openDialog 的值为true 并且AlertDialogSample 的父级由于任何原因而被重组,这也会触发AlertDialogSample 的重组。如果不使用remember,则openDialog 的值将设置为false

    【讨论】:

    • 我还有一个问题。如果仅使用布尔类型而不是“记住”并更改值,则不会触发重组?还是触发了重组但设置了默认值(false)?
    • 如果您使用val openDialog = mutableStateOf(false),将触发重组,但值将始终为false。如果您使用val openDialog = false,则不会触发重组。 remember与触发重组无关,它只是保存数据,这里我们保存MutableState<Boolean>;不仅仅是Boolean
    • 这是我的理解。 [mutableStateOf] :使值可更改和可重组 [remember] :触发重组时,先前的值不会初始化。并保持价值。对吗?
    • 是的,你是对的。
    • 再次感谢。我不知道那里的时间,祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 2022-06-12
    • 2021-10-27
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    相关资源
    最近更新 更多