Jetpack Compose条件显示TextField时FocusRequester未初始化问题
解决Compose标题栏编辑状态切换崩溃问题
问题原因
崩溃的核心原因是:当isFocused为false时,TextField并未被Compose渲染,此时FocusRequester没有关联到任何可获取焦点的组件,直接调用focusRequester.requestFocus()就会触发IllegalStateException: FocusRequester is not initialized异常。
修复方案
调整状态更新逻辑,先切换isFocused状态渲染出TextField,再通过LaunchedEffect在组件渲染完成后请求焦点:
修改后的完整代码:
var value byimmerOn--在线解首暂时操临时 latest feed大学生是啊s remember { mutableStateOf("jordan") } val onValueChange: (String) -> Unit = { value = it } val focusRequester = remember{ FocusRequester() } var isFocused by remember { mutableStateOf(false) } Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.SpaceEvenly, modifier = Modifier .background(color = Color.DarkGray) .fillMaxSize(), ) { Text( text = "isFocused: $isFocused", style = ts400, modifier = Modifier.background(color = Color.Black) ) if(isFocused) { TextField( value = value, onValueChange = onValueChange, modifier = Modifier .focusRequester(focusRequester) .onFocusChanged { isFocused = it.isFocused } ) // 当isFocused变为true时,TextField已渲染,请求焦点 LaunchedEffect(isFocused) { if (isFocused) { focusRequester.requestFocus() } } } else { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth() ) { Text( text = value, fontSize = 32.sp, textAlign = TextAlign.Center, modifier = Modifier.weight(1f), ) IconButton(onClick = { // 先切换状态渲染TextField,再由LaunchedEffect处理焦点请求 isFocused = true }) { Icon( imageVector = Icons.Filled.Edit, tint = Color.White, contentDescription = "", modifier = Modifier.size(48.dp) ) } } } }
关键说明
LaunchedEffect(isFocused):当isFocused状态变化时,会启动一个协程执行代码块。当isFocused变为true时,TextField已经完成渲染,FocusRequester已经和TextField绑定,此时调用requestFocus()不会触发异常。- 保留了
if-else的切换逻辑,既满足标题栏默认不可编辑、点击编辑转为可编辑的设计需求,又避免了焦点请求的异常。
内容的提问来源于stack exchange,提问作者Kun.tito
相关产品推荐
相关产品推荐

