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
相关产品推荐
相关产品推荐

