无法在 Textfield Android Jetpack Compose 上设置字符数限制

Yuk*_*uki 5 android textfield kotlin android-jetpack-compose

我正在使用 Jetpack Compose 开发 Android 应用程序。我想在 Textfield 上设置字符数限制,但如果我尝试此代码,用户最多可以输入 1201 个字符(maxChar+1),并且如果用户输入 1201 个字符(超过 maxChar),则无法删除任何字母。

@Composable
fun PostEdit(navController: NavController, content: String, id: String) {
    var editedContent = remember { mutableStateOf("$content")}
    val maxChar = 1200
    ...

         OutlinedTextField(
                value = editedContent.value,         
                onValueChange = { newValue: String ->
                    if (editedContent.value.length <= maxChar) {
                        editedContent.value = newValue
                    }
                },
                label = { Text("Content", fontSize = 20.sp, color = Brown) },
                ...
Run Code Online (Sandbox Code Playgroud)

从不同的角度来看,我也设置了字符数限制,并且是成功的。不同的是,这次“var intro”中没有参数。这是代码。

@Composable
fun Signup(navController: NavController) 
    var intro by remember { mutableStateOf("") }
    val maxChar = 100
    ...
         OutlinedTextField(
                value = intro,
                onValueChange = {
                    if (it.length <= maxChar) {
                        intro = it
                    }
                },
                label = { Text("Introduction", fontSize = 20.sp, color = Brown) },
                ...

Run Code Online (Sandbox Code Playgroud)

有人可以帮助我吗?谢谢。

z.g*_*g.y 3

第二个 ( intro) 您使用的是隐式it参数而不是intro状态变量

 onValueChange = { // <-- implicit `it`
         if (it.length <= maxChar) {
              intro = it 
          }
 }
Run Code Online (Sandbox Code Playgroud)

而在第一个 ( editedContent) 上,您使用的是状态变量,因此当editedContentlength到达1200并且您键入另一个字符时,它仍然会满足您的onValueChange条件<=,从而使之满足1201,并且当您尝试这样做时delete,条件将不再满足,不将会发生改变editedContent

onValueChange = { newValue: String -> // <--  use this
     if (editedContent.value.length <= maxChar) {
          editedContent.value = newValue 
     }
}
Run Code Online (Sandbox Code Playgroud)

所以按照你在第二个和第一个上所做的那样做,它就会起作用

 onValueChange = { newValue: String ->
     if (newValue.length <= maxChar) {
          editedContent.value = newValue
     }
 }
Run Code Online (Sandbox Code Playgroud)