Flutter Pinput组件问题:输入单个OTP框后键盘自动关闭失焦
解决Pinput输入单个OTP后键盘关闭、后续输入框无法聚焦的问题
问题原因
你手动指定了单个focusNode: _focusNodes[0],这会强制将所有输入框的焦点绑定到第一个节点,打断Pinput组件内部的自动焦点切换逻辑,导致输入一个字符后焦点异常、键盘自动收起。
解决方案
移除单个focusNode绑定
直接删除代码中的focusNode: _focusNodes[0]这一行,让Pinput组件自动管理每个输入框的焦点切换逻辑,这是最直接的修复方式。(可选)如需自定义焦点管理,使用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), ), ), )
- 检查其他干扰逻辑
- 确认
_handlePinCompleted方法中没有主动调用收起键盘、失去焦点的代码 - 排查页面内是否有其他监听输入事件的逻辑,会强制修改焦点状态
内容的提问来源于stack exchange,提问作者Er. Vishal Dubey
相关产品推荐
相关产品推荐

