当我尝试在 onValueChange 中保存 OutlinedTextField 的值时,打字时光标向左跳一个位置

Lit*_*Mik 4 android-jetpack-compose android-jetpack-datastore

我在使用 OutlinedTextField 和连接到存储用户设置的数据存储时遇到一些问题。数据已保存并正确读取。但是,更新显示和光标似乎存在问题。当我输入文本时(可能是因为我打字太快),光标向左跳一位。这会破坏输入并且用户体验非常糟糕。

到目前为止我还没有找到解决问题的方法。你知道它可能是什么吗?非常感谢!

这就是我用于 OutlinedTextField 的代码:

OutlinedTextField(
    value = dataStoreState.nickname,
    onValueChange = {
        CoroutineScope(Dispatchers.IO).launch {
            viewModel.saveToDataStore(dataStoreState.copy(nickname = it))
        }
    },
    label = { Text(stringResource(id = R.string.enterNickname)) },
    keyboardOptions = KeyboardOptions.Default.copy(
        keyboardType = KeyboardType.Text,
        imeAction = ImeAction.Done
    ),
    modifier = Modifier.fillMaxWidth()
) 
Run Code Online (Sandbox Code Playgroud)

我尝试将文本值缓存在另一个变量中,但没有效果。然后我尝试更改保存功能,但我在这里也找不到正确的解决方案。

Fra*_*esc 6

对文本字段状态的更新必须是同步的,您不能让协程更新您的存储,并且只能在完成后更新文本字段。您必须重新处理此问题以确保状态立即更新,然后您可以将当前文本推送到快照流,对其进行反跳并从流中更新。

像这样的东西

var text by remember {
    mutableStateOf("")
}
LaunchedEffect(key1 = Unit) {
    text = datastoreState.nickname
    snapshotFlow { text }
        .debounce(500L)
        .distinctUntilChanged()
        .onEach {
            viewModel.saveToDataStore(dataStoreState.copy(nickname = it))
        }
        .launchIn(this)
}
OutlinedTextField(
    value = text,
    onValueChange = { text = it },
    label = { Text(stringResource(id = R.string.enterNickname)) },
    keyboardOptions = KeyboardOptions.Default.copy(
        keyboardType = KeyboardType.Text,
        imeAction = ImeAction.Done
    ),
    modifier = Modifier.fillMaxWidth()
)
Run Code Online (Sandbox Code Playgroud)