即使没有完成用户焦点交互,在初始化时也会调用 Compose TextField Modifier.onFocusChanged {} 事件

jes*_*nte 8 android android-jetpack-compose android-compose-textfield

可使用代码重现:

var value by remember { mutableStateOf("Hello\nWorld\nInvisible") }

TextField(
    value = value,
    onValueChange = { value = it },
    label = { Text("Enter text") },
    modifier = Modifier
        .onFocusChanged { Log.d("TAG", "1 OnFocusChangedCalled: $it") }
)

TextField(
    value = value,
    onValueChange = { value = it },
    label = { Text("Enter text") },
    modifier = Modifier
        .onFocusChanged { Log.d("TAG", "2 OnFocusChangedCalled: $it") }
)
Run Code Online (Sandbox Code Playgroud)

只需打开视图,Logcat 就会显示:

D/TAG: 1 OnFocusChangedCalled: Inactive
D/TAG: 2 OnFocusChangedCalled: Inactive
Run Code Online (Sandbox Code Playgroud)

对于传统的 XML 布局,onFocusChangedListener 仅在用户实际与字段交互时触发。

使用撰写布局,仅当用户从文本字段中删除焦点时,我才尝试进行错误验证。

然而,这种行为导致我的验证在视图初始化后立即触发。

如何使 onFocusChanged 验证仅在用户从字段中删除焦点后发生,而不是在初始化时发生?

Gab*_*tti 4

onValueChange您可以在属性而不是修饰符中移动验证onFocusChanged

作为解决方法,您可以在字段获得焦点时存储一个键,然后在失去焦点时检查该值。

就像是:

 var focusedTextKey by remember { mutableStateOf("") }

 TextField(
    value = value,
    onValueChange = { value = it },
    label = { Text("Enter text") },
    modifier = Modifier
        .onFocusChanged {
            Log.d("TAG", "1 OnFocusChangedCalled: $it")

            if (it.isFocused) {
                focusedTextKey = "NAME"
            } else {
                if (focusedTextKey == "NAME") {
                    //validate the value
                }
                focusedTextKey = ""
            }
        }
    )
Run Code Online (Sandbox Code Playgroud)