You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:51:27