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

Flutter TextField自动聚焦失效:切换显示时无法获取焦点求解决

修复TextFormField自动聚焦失效问题

问题原因

当你在setState中直接调用FocusScope.of(context).requestFocus(foldertitlefocus)时,TextFormField还未完成重建和挂载,此时请求焦点不会生效。autofocus: true也可能因为AppBar的布局特性或者组件重建时机的问题失效。

解决方案

  • 确保FocusNode正确初始化并在组件销毁时释放
  • 使用WidgetsBinding.instance.addPostFrameCallback延迟请求焦点,等待组件渲染完成后再执行

修改后的完整代码

// 在State类中初始化FocusNode和Controller
final FocusNode foldertitlefocus = FocusNode();
final TextEditingController foldertitle = TextEditingController();
bool caneditfoldername = false;

@override
void dispose() {
  // 释放资源避免内存泄漏
  foldertitlefocus.dispose();
  foldertitle.dispose();
  super.dispose();
}

// AppBar部分代码修改
appBar: AppBar(
  actions: [
    IconButton(
      onPressed: () {
        setState(() {
          caneditfoldername = true;
        });
        // 等待当前帧渲染完成后请求焦点
        WidgetsBinding.instance.addPostFrameCallback((_) {
          if (foldertitlefocus.mounted) {
            FocusScope.of(context).requestFocus(foldertitlefocus);
          }
        });
      },
      icon: Icon(
        Icons.edit_rounded,
        size: MediaQuery.of(context).size.height * .028,
      ),
    )
  ],
  title: widget.two == false
      ? const Text("Add")
      : caneditfoldername
          ? Padding(
              padding: EdgeInsets.only(
                  right: MediaQuery.of(context).size.width * .23),
              child: TextFormField(
                focusNode: foldertitlefocus,
                controller: foldertitle,
                autofocus: true,
              ),
            )
          : const Text("My passwords.."),
),

关键说明

  • PostFrameCallback:确保在当前帧所有组件都完成渲染后再执行焦点请求,此时TextFormField已存在于Widget树中,焦点请求才能生效。
  • 检查focusNode.mounted:避免在组件已被销毁的情况下调用requestFocus引发错误。
  • 释放资源:必须在State的dispose方法中销毁FocusNode和TextEditingController,防止内存泄漏。

内容的提问来源于stack exchange,提问作者user21055008

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:15:19