Flutter 如何同时接收onTapDown(急切地)和onDoubleTap?
我想进行一些互动:Flutter 如何同时接收onTapDown(急切地)和onDoubleTap?,flutter,Flutter,我想进行一些互动: 首次触摸(ONTAPPOWN)时(如清除现有选择),以及 当发生双击(onDoubleTap)时(例如,高亮显示新选择) 使用手势检测器: 如果只注册onTapDown,则在第一次触摸时立即调用回调 如果我同时注册了onTapDown和onDoubleTap,并且用户执行了一个简单的点击,那么在调用onTapDown事件之前需要相当长的时间(1/2秒?)。如果我在点击之后更新显示,对于用户来说,这感觉就像是渲染jank——但实际上只是让事件推迟了 有没有一种方法可以让
- 首次触摸(ONTAPPOWN)时(如清除现有选择),以及
- 当发生双击(onDoubleTap)时(例如,高亮显示新选择)
- 如果只注册onTapDown,则在第一次触摸时立即调用回调
- 如果我同时注册了onTapDown和onDoubleTap,并且用户执行了一个简单的点击,那么在调用onTapDown事件之前需要相当长的时间(1/2秒?)。如果我在点击之后更新显示,对于用户来说,这感觉就像是渲染jank——但实际上只是让事件推迟了
我想这是一种很有技巧的方法,但是你可以使用
监听器进行onPointerDown
。双击时,以下代码应记录两次
import 'package:flutter/material.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(title: 'Flutter Playground', home: Material(child: SafeArea(child: content())));
Widget content() {
final controller = TextEditingController(text: "-");
return Center(
child: Column(
children: [
GestureDetector(
onDoubleTap: () {
controller.text = "double tap";
print("double tap");
},
child: Listener(
onPointerDown: (_) {
controller.text = "tap down";
print("tap down");
},
child: Container(
color: Colors.green,
width: 200,
height: 200,
child: Center(
child: Text("Tap me"),
),
),
)),
Container(
color: Colors.red,
width: 200,
height: 200,
child: Center(
child: TextField(controller: controller),
),
)
],
),
);
}
}
main() => runApp(MyApp());
import 'package:flutter/material.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(title: 'Flutter Playground', home: Material(child: SafeArea(child: content())));
Widget content() {
final controller = TextEditingController(text: "-");
return Center(
child: Column(
children: [
GestureDetector(
onDoubleTap: () {
controller.text = "double tap";
print("double tap");
},
child: Listener(
onPointerDown: (_) {
controller.text = "tap down";
print("tap down");
},
child: Container(
color: Colors.green,
width: 200,
height: 200,
child: Center(
child: Text("Tap me"),
),
),
)),
Container(
color: Colors.red,
width: 200,
height: 200,
child: Center(
child: TextField(controller: controller),
),
)
],
),
);
}
}
main() => runApp(MyApp());