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)
我尝试将文本值缓存在另一个变量中,但没有效果。然后我尝试更改保存功能,但我在这里也找不到正确的解决方案。
对文本字段状态的更新必须是同步的,您不能让协程更新您的存储,并且只能在完成后更新文本字段。您必须重新处理此问题以确保状态立即更新,然后您可以将当前文本推送到快照流,对其进行反跳并从流中更新。
像这样的东西
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)
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |