Вложенные функции GestureDetector OnTap

У меня есть вложенные GestureDetetor, но проблема в том, что выполняется только дочерний GestureDetector onTap. Я не хочу переопределять дочерний onTap, скорее, я хочу, чтобы onTap родителя и ребенка выполнялись. Вот мой код:

    GestureDetector(
        onTap: () {
            todo1(); 
        },
        child: GestureDetector(
            onTap: () {
                todo2();
            },
            child: Text("Nested Gesture")))

Как мне изменить это, чтобы вызывать как todo1(), так и todo2() onTap?

редактировать: дочерний виджет представляет собой повторно используемый пользовательский виджет, который имеет свою собственную реализацию, но теперь используется родителем, который также имеет собственную реализацию в дополнение к своему дочернему элементу.


person aLL    schedule 16.05.2019    source источник
comment
Это, для меня, не имеет смысла. Вы добавили два вложенных детектора getture только для вызова двух разных методов? почему бы не позвонить им обоим из одного и того же onTap() .   -  person danypata    schedule 16.05.2019
comment
@danypata - я понимаю, откуда это взялось, но в моем случае дочерний виджет представляет собой повторно используемый пользовательский виджет, который имеет свою собственную реализацию, но теперь используется родителем, у которого также есть собственная реализация в дополнение к его дочернему элементу.   -  person aLL    schedule 16.05.2019


Ответы (2)


Я сделал быстрый пользовательский распознаватель жестов — он отменяет жест, только если пользователь переместился слишком далеко от начальной точки касания.

Пример использования:

UniversalTapHandler(
  onTap: () {
    print("Tap 1");
  },
  child: UniversalTapHandler(
    onTap: () {
      print("Tap 2");
    },
    child: Text("Nested Gesture"),
  )
)

Исходный код:

class UniversalTapHandler extends RawGestureDetector {
  UniversalTapHandler({
    @required GestureTapCallback onTap,
    @required Widget child,
  }):
    super(
      gestures: <Type, GestureRecognizerFactory>{
        _UniversalPointerHandler: GestureRecognizerFactoryWithHandlers<_UniversalPointerHandler>(
          () => _UniversalPointerHandler(onTap: onTap),
          (_) {},
        ),
      },
      child: child,
    );
}

class _UniversalPointerHandler extends OneSequenceGestureRecognizer {
  _UniversalPointerHandler({
    @required this.onTap,
  }): super();

  final GestureTapCallback onTap;

  final _maxDistance = 18; // as in official recognizer by default
  Offset _startPosition;

  void _reset() {
    _startPosition = null;
  }

  @override
  void addPointer(PointerDownEvent event) {
    _startPosition = event.position;
    startTrackingPointer(event.pointer);
    resolve(GestureDisposition.accepted);
  }

  @override
  void handleEvent(PointerEvent event) {
    if (event is PointerUpEvent) {
      stopTrackingPointer(event.pointer);
      if (_startPosition != null) {
        onTap();
      }
    }
    if (event is PointerMoveEvent && _startPosition != null) {
      if ((event.position - _startPosition).distance > _maxDistance) {
        rejectGesture(event.pointer);
        _reset();
      }
    }
    if (event is PointerCancelEvent || event is PointerExitEvent || event is PointerRemovedEvent) {
      _reset();
    }
  }

  @override
  void resolve(GestureDisposition disposition) {
    if (disposition == GestureDisposition.rejected) {
      _reset();
    }
    super.resolve(disposition);
  }

  @override
  void didStopTrackingLastPointer(int pointer) {}

  @override
  String get debugDescription => "_UniversalPointerHandler: Custom Gesture Recognizer";
}

ОБНОВЛЕНИЕ Не забудьте импортировать это:

import 'package:flutter/gestures.dart';
person George    schedule 16.05.2019

Вы можете вызвать todo1() во вложенном обратном вызове onTap:

  GestureDetector(
        onTap: () {
            todo1(); 
        },
        child: GestureDetector(
            onTap: () {
                todo2();
                todo1();
            },
            child: Text("Nested Gesture")))
person chesszhang    schedule 26.04.2021