Flutter 3.7.0中FocusTrap组件已移除,求替代方案(附Pinput示例)
Flutter 3.7.0 移除 FocusTrap 后的替代方案
Flutter 3.7.0 正式移除了FocusTrap组件,你可以通过**FocusTraversalGroup + FocusScope**的组合实现原组件的核心功能——将焦点限定在指定子组件树内,这也是官方推荐的替代方案。
替代方案说明
FocusTraversalGroup:定义焦点遍历的边界,焦点在遍历过程中不会跳出这个组的范围FocusScope:管理指定范围内的焦点状态,可绑定自定义的focusNode,对应原FocusTrap的focusNode参数
修改后的Pinput库示例代码
将原代码中的FocusTrap替换为上述组合即可,完整代码如下:
return _PinputFormField( enabled: isEnabled, validator: _validator, child: FocusTraversalGroup( child: FocusScope( node: effectiveFocusNode, child: MouseRegion( cursor: _effectiveMouseCursor, onEnter: (PointerEnterEvent event) => _handleHover(true), onExit: (PointerExitEvent event) => _handleHover(false), child: IgnorePointer( ignoring: !isEnabled || !widget.useNativeKeyboard, child: AnimatedBuilder( animation: _effectiveController, builder: (_, Widget? child) => Semantics( maxValueLength: widget.length, currentValueLength: _currentLength, onTap: widget.readOnly ? null : _semanticsOnTap, onDidGainAccessibilityFocus: handleDidGainAccessibilityFocus, child: child, ), child: _gestureDetectorBuilder.buildGestureDetector( behavior: HitTestBehavior.translucent, child: Stack( alignment: Alignment.topCenter, children: [ _buildEditable(textSelectionControls), _buildFields(), ], ), ), ), ), ), ), ), );
额外说明
如果需要更贴近原FocusTrap的API体验,也可以使用第三方包focus_trap,但优先推荐官方原生方案以减少依赖。
内容的提问来源于stack exchange,提问作者Ушаков Владимир
相关产品推荐
相关产品推荐

