Jetpack Compose TextField出现竞态条件 打字时onValueChange随机追加初始值
你的代码写法完全符合Jetpack Compose官方的TextField使用规范,不存在逻辑错误。该问题是Compose 1.0.x版本的已知原生bug,和你的写法无关,核心原因是TextField组件和输入法(IME)的交互逻辑存在竞态条件:
当输入法快速触发多次onValueChange回调时,部分场景下Compose的状态同步逻辑会出现异常,错误地将未更新的旧状态值(也就是你的初始值InitialValue)和新输入的内容做拼接,而非直接使用回调返回的新值覆盖状态。
解决方案
- 优先方案:升级Compose版本,该bug在Compose 1.1.0-alpha03及后续版本已经被官方修复,升级到1.1.0稳定版及更高版本即可彻底解决问题。
- 临时兼容方案:如果当前项目暂时无法升级Compose版本,可以给
onValueChange增加去重判断,规避错误的状态更新:
setContent { var testingText by remember { mutableStateOf("InitialValue") } TextField( value = testingText, onValueChange = { newText -> if (newText != testingText) { testingText = newText } }, label = { Text("Testing") }, modifier = Modifier.fillMaxWidth(), ) }
- 额外验证:极小概率为模拟器自带输入法的兼容性问题,你也可以在模拟器中安装第三方输入法(如Gboard)复现验证,排除输入法本身的问题。
内容的提问来源于stack exchange,提问作者Eggman87
相关产品推荐
相关产品推荐

