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

Flutter Pinput组件问题:输入单个OTP框后键盘自动关闭失焦

解决Pinput输入单个OTP后键盘关闭、后续输入框无法聚焦的问题

问题原因

你手动指定了单个focusNode: _focusNodes[0],这会强制将所有输入框的焦点绑定到第一个节点,打断Pinput组件内部的自动焦点切换逻辑,导致输入一个字符后焦点异常、键盘自动收起。

解决方案

  1. 移除单个focusNode绑定
    直接删除代码中的focusNode: _focusNodes[0]这一行,让Pinput组件自动管理每个输入框的焦点切换逻辑,这是最直接的修复方式。

  2. (可选)如需自定义焦点管理,使用focusNodes数组
    如果确实需要手动控制焦点节点,要传入复数形式的focusNodes参数(对应每个输入框的焦点节点),而非单个focusNode,示例代码如下:

// 先初始化对应长度的FocusNode数组
final List<FocusNode> _focusNodes = List.generate(4, (_) => FocusNode());

// 修改后的Pinput组件代码
Pinput(
  length: 4,
  controller: _otpController,
  autofocus: true,
  closeKeyboardWhenCompleted: false, // 保持键盘开启
  focusNodes: _focusNodes, // 传入焦点节点数组,而非单个节点
  defaultPinTheme: PinTheme(
    width: 55,
    height: 55,
    textStyle: const TextStyle(
      fontSize: 26,
      color: Colors.black,
    ),
    decoration: BoxDecoration(
      color: Colors.grey.shade200,
      borderRadius: BorderRadius.circular(10),
      border: Border.all(color: Colors.white),
    ),
  ),
  textInputAction: TextInputAction.next,
  showCursor: true,
  onChanged: (String pin) {
    setState(() {
      _isOtpComplete = pin.length == 4;
    });
  },
  onCompleted: _handlePinCompleted,
  focusedPinTheme: PinTheme(
    width: 55,
    height: 55,
    textStyle: const TextStyle(
      fontSize: 26,
      color: Colors.black,
    ),
    decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.circular(10),
      border: Border.all(color: AppColors.appColor_purple, width: 2),
    ),
  ),
)
  1. 检查其他干扰逻辑
  • 确认_handlePinCompleted方法中没有主动调用收起键盘、失去焦点的代码
  • 排查页面内是否有其他监听输入事件的逻辑,会强制修改焦点状态

内容的提问来源于stack exchange,提问作者Er. Vishal Dubey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:45:06