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——但实际上只是让事件推迟了
有没有一种方法可以让你急切地接受OnTappdown和onDoubleTap?(事实上,如果我在双击时得到两个事件,这是可以的)


我想这是一种很有技巧的方法,但是你可以使用
监听器
进行
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());