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

Flutter Web在iOS模拟器Safari中点击Done按钮后键盘再次弹出问题

问题:iOS模拟器中Flutter Web数字TextField点击Done后键盘重复弹出

在iOS模拟器测试Flutter响应式Web应用时,数字类型的TextField点击键盘上的Done按钮后,键盘会立即再次弹出,效果如下:

效果演示

相关代码:

SizedBox(
  width: context.isDesktop ? 300 : (context.width - 40),
  height: 50,
  child: TextField(
    controller: _textController,
    autocorrect: false,
    enableSuggestions: false,
    keyboardType: TextInputType.number,
    style: DesignFont.regular(20),
    decoration: const InputDecoration(
      hintText: Localized.enterPinCode,
      border: OutlineInputBorder(
        borderRadius: BorderRadius.all(Radius.circular(2)),
        borderSide: BorderSide(color: StyleColor.border),
      ),
    ),
  ),
)
解决方案

这是Flutter Web在iOS环境下的特定兼容性问题,核心原因是点击Done后TextField意外重新获取焦点。可以通过主动管理焦点解决:

方法1:使用FocusNode控制焦点

  1. 先定义一个FocusNode实例:
final FocusNode _pinFocusNode = FocusNode();
  1. 修改TextField,绑定focusNode并在onSubmitted回调中主动失焦:
SizedBox(
  width: context.isDesktop ? 300 : (context.width - 40),
  height: 50,
  child: TextField(
    focusNode: _pinFocusNode,
    controller: _textController,
    autocorrect: false,
    enableSuggestions: false,
    keyboardType: TextInputType.number,
    textInputAction: TextInputAction.done, // 明确指定Done动作
    style: DesignFont.regular(20),
    onSubmitted: (_) => _pinFocusNode.unfocus(),
    decoration: const InputDecoration(
      hintText: Localized.enterPinCode,
      border: OutlineInputBorder(
        borderRadius: BorderRadius.all(Radius.circular(2)),
        borderSide: BorderSide(color: StyleColor.border),
      ),
    ),
  ),
)

方法2:直接通过全局焦点管理器失焦

如果不想单独维护FocusNode,也可以在onSubmitted中直接调用全局焦点管理器的失焦方法:

onSubmitted: (_) => FocusManager.instance.primaryFocus?.unfocus(),

两种方法都能在点击Done后强制移除TextField的焦点,阻止键盘再次弹出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:16:04