我有以下可组合的函数.这是一个简单的登录屏幕与用户名,密码和提交按钮.

当用户点击提交按钮时,如果用户名或密码字段为空,则会显示一个快捷栏.然而,它在第一次点击时起作用,但随后的点击不起作用.

如果需要显示快捷栏,我会认为按钮点击会强制合成内容重新组合,LaunchEffect键将为真.

@Composable
fun Login() {
    var username by remember { mutableStateOf("") }
    var password by remember { mutableStateOf("") }
    val scaffoldState = rememberScaffoldState()
    var shouldShowSnackBar by remember { mutableStateOf(false) }

    println("LoginScreen")

    LaunchedEffect(key1 = shouldShowSnackBar, block = {
        println("ShouldShowSnackBar")
        scaffoldState.snackbarHostState.showSnackbar(
            message = "Please enter a username and password",
            duration = SnackbarDuration.Short
        )
    })

   Scaffold(
        scaffoldState = scaffoldState
    ) {
        Column(modifier = Modifier.fillMaxWidth()) {
            OutlinedTextField(
                label = {
                    Text(text = "Username")
                },
                value = username,
                onValueChange = { newUsername ->
                    username = newUsername
                })

            OutlinedTextField(
                label = {
                    Text(text = "Password")
                },
                value = password,
                onValueChange = { newPassword ->
                    password = newPassword
                },
                visualTransformation = PasswordVisualTransformation())

            OutlinedButton(
                modifier = Modifier.fillMaxWidth(),
                onClick = {
                    shouldShowSnackBar = username.isEmpty() || password.isEmpty()
                    println("Button pressed: $shouldShowSnackBar")
                }) {
                Text(text = "Submit")
            }
        }
    }
}

推荐答案

您看到的是预期行为.在Jetpack Compose中,要触发重新组合,State/MuableState应该具有新值,并且组合在范围State/MuableState是只读的情况下被触发.

您需要将shouldShowSnackBar设置为False,并在shouldShowSnackBar为True时调用LaunchedEffect内部的BLOCK.

LaunchedEffect(key1 = shouldShowSnackBar, block = {
    if(shouldShowSnackBar){
        println("ShouldShowSnackBar")
        scaffoldState.snackbarHostState.showSnackbar(
            message = "Please enter a username and password",
            duration = SnackbarDuration.Short
        )
        shouldShowSnackBar = false
    }
})

Android相关问答推荐

如何使禁用状态下的material 3按钮与启用状态下的 colored颜色 相同?

如何在"不同活动"中添加不同按钮?

返回并再次打开webview时webview无法打开相机

需要 java 17 而不是 java 11:Android CI-CD GitHub Actions

有没有办法迭代类型安全的项目访问器?

Material 3的MaterialSwitch默认大小太大了?如何使它变小?

Android - 如何使 TextInputEditText 的高度恰好为 2 行?

如何在 Android Studio 中为带有 Room 的 SQLite 编写需要参数的查询?

当父布局的背景为浅色时,Android ProgressBar 背景 colored颜色 变为灰色

我可以从 Android 中的选定文本中获取周围的文本吗?

列语义在列中的第一个元素之后读取

Kotlin 协程、 retrofit 、android

如何在 Jetpack Compose 中的特定位置绘制图像

如何在没有人窃取令牌的情况下使用我的移动应用程序中的 API

Compose Accompaniist Pager 中的 TabRow/Tab 重组问题

我们也可以或应该对主要小部件使用预览 compose 功能吗?

如何在包含 Jetpack Compose 内容的布局中使用权重

在 Android Studio 中替换字符串中的 "

当我更改 ViewModel var 时,Kotlin + Compose 中的 Composable 不会更新

不能在kotlin的lazycolumn中使用列表