Jetpack Compose中BasicTextField触发IllegalStateException崩溃求助
解决Jetpack Compose中BasicTextField清空后输入崩溃的问题
问题原因
你的EditableText组件中,BasicTextField的decorationBox在文本为空时仅渲染提示文本,未调用innerTextField()。这会导致TextField的核心输入组件未被添加到布局树中,当清空文本后再次输入时,系统尝试访问核心组件的布局坐标,但该组件未附加到布局,从而抛出LayoutCoordinate operations are only valid when isAttached is true异常。
修复方案
无论文本是否为空,都必须调用innerTextField()以保证核心输入组件始终存在。通过Box将提示文本与输入组件重叠,利用文本状态控制提示的显示:
@Composable fun EditableText( text: String, hint: String, onValueChange: (String) -> Unit, modifier: Modifier = Modifier ) { BasicTextField( modifier = modifier, value = text, onValueChange = onValueChange, textStyle = headline.copy(color = Color.White, textAlign = TextAlign.Start), singleLine = true, decorationBox = { innerTextField -> Box { // 始终调用innerTextField,确保核心输入组件存在于布局树 innerTextField() // 文本为空时显示提示文本 if (text.isEmpty()) { Text( text = hint, textAlign = TextAlign.Start, style = headline.copy( color = Color.White.copy(alpha = 0.75f), textAlign = TextAlign.Start ) ) } } } ) }
修复说明
innerTextField()是BasicTextField核心输入逻辑的入口,必须始终执行以维持组件的正常布局状态。提示文本通过Box与输入组件重叠,既实现了占位提示效果,又不会破坏TextField的内部布局依赖,彻底避免了布局坐标相关的崩溃问题。
内容的提问来源于stack exchange,提问作者Pavel Maiseichyk
相关产品推荐
相关产品推荐

