我想通过点击TextField
外部或屏幕上的任何位置来隐藏屏幕键盘。然后我用GestureDetector
包装我的Scaffold
,如下所示。我已经用CCD_ 4和CCD_。
GestureDetector(
behavior: HitTestBehavior.opaque,
onTapDown: (_) {
printLog("hide keyboard ${_.localPosition}");
FocusManager.instance.primaryFocus?.unfocus();
},
child: Scaffold()
在简单的小部件(少量的小部件(上一切都很好。但当我渲染了很多小部件时,隐藏键盘的功能有时只会调用。并不是每一个动作都在我的屏幕上发生。
例如在我的脚手架上:
ListView.builder(
itemCount: 50,
itemBuilder: ((context, index) => GestureDetector(
onTap: () {
printLog("tap on card");
},
child: Container(
margin: const EdgeInsets.symmetric(vertical: 3),
height: 60,
color: Colors.blueGrey,
),)))
这里是控制台日志。正如我们所看到的(第4行(,print('[Debug] hide keyboard Offset()')
并没有调用我屏幕上发生的每一个onTap()
。
I/flutter (15284): [Debug] hide keyboard Offset(281.5, 330.2)
(2)I/flutter (15284): [Debug] tap on card
I/flutter (15284): [Debug] hide keyboard Offset(253.5, 292.0)
(3)I/flutter (15284): [Debug] tap on card => i tapped 3 times on my card
I/flutter (15284): [Debug] tap on card => until the 4th tap, keybord not hide
I/flutter (15284): [Debug] hide keyboard Offset(186.2, 279.3)
I/flutter (15284): [Debug] tap on card
但当我在卡上执行longpress
时,函数隐藏键盘总是会被调用。我假设在捕获onTap时GestureDetector
上存在延迟。因此用户需要比平时敲击更长的时间。但这不是一件好事,因为我不能告诉用户每次使用应用程序时在屏幕上按更长的时间。.
我想要实现的是,每次在我的
Textfield
之外点击,它都应该立即调用隐藏键盘功能
更新最新版本
我们可以使用一个名为CCD_ 11的新属性。无需使用GestureDetector
包装所有小部件
TextFormField(
onTapOutside: (event) =>
FocusManager.instance.primaryFocus?.unfocus(),
controller: _ctrl,
旧答案
参考文献:https://stackoverflow.com/a/53063398/12838877
所以我将CCD_ 13改变为CCD_。它更快。
文件显示:
与其侦听原始指针事件,不如考虑侦听使用手势检测器的高级手势。
,现在工作正常。
@override
Widget build(BuildContext context) {
return Listener(
behavior: HitTestBehavior.opaque,
onPointerDown: (_) {
printLog("hide keyboard ${_.localPosition}");
FocusManager.instance.primaryFocus?.unfocus();
},
child: Scaffold()