Bug背景
今天在弄输入框的时候,发现用户手动关闭键盘后,因为自定义组件的特殊性,我在点击输入框后并没有唤起键盘。
一般点击输入框或者某个组件:
GestureDetector(onTap: () {FocusScope.of(context).requestFocus(_focusNode);},child: YourWidget(),
),
我们直接聚焦,就可以弹起键盘。
将带有焦点的控件与TextField
或TextFormField
小部件关联起来,并使用focusNode
属性将其与之前创建的FocusNode
实例关联:
TextField(focusNode: _focusNode,// 其他属性
),
但是在我这边的需求里,当用户手动关闭键盘时,他还在聚焦,我这时候,点击输入框,但是它并不会弹起来,于是
首先:
1.使用KeyboardVisibilityBuilder
来监听键盘的可见性状态。在builder
回调中,根据isKeyboardVisible
的值来判断键盘是否关闭。
首先,在pubspec.yaml
文件中添加keyboard_visibility
插件的依赖:
dependencies:keyboard_visibility: ^0.7.0
import 'package:keyboard_visibility/keyboard_visibility.dart';KeyboardVisibilityBuilder(builder: (context, isKeyboardVisible) {if (isKeyboardVisible) {// 键盘是打开的print('键盘是打开的');} else {// 键盘是关闭的print('键盘是关闭的');}return YourWidget();},
),
在我的组件的onTap事件里:
if (_focusNode.hasFocus&&!isKeyboardVisible) {_focusNode.unfocus();await Future.delayed(Duration(milliseconds: 200));FocusScope.of(context).requestFocus(_focusNode);}
单独处理,输入框在聚焦情况下,用户手动关闭键盘,下次点击输入框仍无法弹起,先让组件失焦然后聚焦就可以弹起键盘了。