2 детектора жестов с одинаковым жестом на одной странице во флаттере - PullRequest
0 голосов
/ 08 июня 2018

Мы создаем страницу с 2 контейнерами, один из которых представляет собой большой контейнер, охватывающий весь экран, а другой - маленький внутри большого.Когда пользователи касаются маленького контейнера и перемещают его палец, он должен сдвинуть маленький контейнер.Когда они смахивают из маленького контейнера, он должен переместить большой контейнер (как карта в Tinder).

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

Есть ли способ использовать событие жеста, чтобы они не отправлялись вдругой компонент?

Я видел документ о GestureArena, но не нашел ни одного примера того, как он работает.Есть ли способ заставить компонент всегда выигрывать на арене (или всегда терять)?

Правка : перефразировано для ясности.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Проблема заключалась в следующем: жесты onHorizontalDrag и onVerticalDrag всегда будут предшествовать onPan и будут препятствовать вызову onPan (даже если GestureDetector прослушивание события onHorizontalDrag отстаеттот, кто слушает событие onPan).Добавление любого слушателя к onHorizontalDrag в маленьком контейнере (даже просто onHorizontalDragCancel) заставит маленький контейнер получить и поглотить событие (что означает, что большой под ним не получит его).

Чтобы исправить мойпроблема Я заменил слушателя onPanUpdate на onHorizontalDragUpdate и onVerticalDragUpdate (и то же самое для onPanStart и onPanEnd).Это не так хорошо, как использование onPan, потому что вы получаете DragUpdateDetails только для вертикального или горизонтального события (мне пришлось добавить немного логики, чтобы компенсировать это), но это предотвращает угон * базового GestureDetector для onPan событие.

0 голосов
/ 08 июня 2018

Очень простое решение:

Для вашего верхнего уровня GestureDetector вы применяете условие для ваших обратных вызовов:

// bool in a State
bool _isTopLevel = true;

// ... build code
  GestureDetector(
      onTap: _isTopLevel ? _tapEvent : null,
      child: GestureDetector(
        onTapDown: () => setState(() => _isTopLevel = false),
        onTapUp: () => setState(() => _isTopLevel = true),
        // ...
      ),
  )

Как только попадетсобытие перехватывается нижним уровнем GestureDetector, верхний уровень GestureDetector отключается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...