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

Flutter点击按钮后TextField自动获焦弹出键盘如何解决

问题根因

异常焦点回弹的核心原因有两个:

  • 现有焦点切换逻辑存在缺陷:当最后一个输入框输入完成后,代码仍调用focusNode.nextFocus(),由于后续没有可聚焦的输入组件,Flutter会自动将焦点回退到最后一个可用的TextField,触发软键盘弹出。
  • 点击Done按钮前没有主动处理输入框焦点状态,按钮本身默认未设置可聚焦属性,无法承接从输入框移出的焦点。
修复步骤

1. 优化输入框焦点切换逻辑

修改_changeFocus方法,判断当前焦点是否在最后一个输入框,填完最后一位时直接取消焦点,不再执行nextFocus():

void _changeFocus(FocusNode focusNode, String text) {
  final code = codeTextEditingController1.text +
      codeTextEditingController2.text +
      codeTextEditingController3.text +
      codeTextEditingController4.text;

  if (text.isEmpty) {
    focusNode.previousFocus();
  } else {
    if (focusNode != myFocusNode4) {
      focusNode.nextFocus();
    } else {
      // 最后一位输入完成,直接失焦收起键盘
      FocusScope.of(context).unfocus();
    }
  }

  widget.activationCodeCubit.setActivationCode(code);
}

2. 按钮点击时主动失焦

在Done按钮的点击回调中,先执行全局失焦收起键盘,再执行业务校验逻辑,从根源避免焦点回弹:

DefaultButtonGlow(
  text: 'Done',
  color: constants.Colors.purpleMain,
  onPressed: () {
    // 主动移出所有输入焦点,收起软键盘
    FocusScope.of(context).unfocus();
    activationCodeCubit.checkActivationCode();
  },
)

可选兼容方案

如果上述修改后仍存在偶发弹键盘问题,可以给Done按钮配置独立焦点节点,设置为可聚焦状态,让输入框移出的焦点直接落到按钮上,不会回退到输入组件:

  • 给按钮新增focusNode: FocusNode()属性
  • 确认按钮组件的canRequestFocus属性为true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:27:17