带有HitTestBehavior.oque的手势检测器无法正常工作以隐藏键盘屏幕



我想通过点击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()

相关内容

  • 没有找到相关文章

最新更新