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

Flutter v1.12.13+hotfix.5中FocusNode异常行为及正确用法咨询

问题分析与解决方案

这个问题的核心是Flutter v1.12.13+hotfix.5中焦点恢复逻辑的变化:当你从SecondRoute返回时,原来的TextFormField会自动重新获取焦点,触发你在FocusNode listener里的Navigator.push,导致循环打开页面。

正确的FocusNode用法(修复版)

你可以在触发页面跳转后立即取消焦点,避免返回时再次触发监听逻辑:

@override
void initState() {
  super.initState();
  focusNode.addListener(() async {
    if (focusNode.hasFocus) {
      // 先取消焦点,防止返回时重新触发
      focusNode.unfocus();
      await Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => SecondRoute()),
      );
    }
  });
}

更优的替代方案(针对只读输入框)

因为你的TextFormField设置了readOnly: true,其实完全可以不用FocusNode,直接使用onTap回调来处理跳转,这样更直观,也能避免焦点管理带来的问题:

TextFormField(
  style: TextStyle(color: Theme.of(context).brightness == Brightness.dark ? Colors.white : Colors.grey),
  readOnly: true,
  validator: validateField,
  controller: controller,
  onTap: () {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => SecondRoute()),
    );
  },
);

为什么旧版本没问题?

在Flutter v1.12之前的版本中,页面pop后焦点不会自动恢复到之前的控件上,所以你的原始写法不会触发重复跳转。但v1.12.x调整了焦点管理逻辑,优化了用户体验(比如输入框跳转返回后继续编辑),但也导致了这种场景下的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:13:47