GestureDetector не работает с Dismissible Widget - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь получить смещение для перетаскивания при использовании виджета Dismissible . Поэтому попытался обернуть его с помощью GestureDetector , но его onHor HorizontalDragStart не работает.
Попробовал в любом случае ie, поставив GestureDetector как потомка Dismissible, но затем Dismissible остановлен работает .
Как это решить? Спасибо ...

ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    var item = items[index];
    return GestureDetector(
      onHorizontalDragStart: (e) {
        print(e);
      },
      child: Dismissible(
        key: ValueKey(item),
        background: Container(
          color: Colors.teal,
        ),
        child: ListTile(
          title: Text("item $item"),
        ),
        onDismissed: (d) {
          items.remove(item);
        },
      ),
    );
  },
);

1 Ответ

2 голосов
/ 15 апреля 2020

Вложенные виджеты жестов

Причиной возникновения этой проблемы является то, что оба этих виджета получают сенсорный ввод, а когда у вас есть два виджета, которые получают сенсорный ввод, короткая история о ребенке выигрывает эту битву. Вот длинная история. Таким образом, оба ваших ввода от ваших Dismissible и GestureDetector отправляются на то, что называется GestureArena. Здесь арена учитывает множество различных факторов, но в конце истории ребенок всегда побеждает. Вы можете решить эту проблему, определив свой собственный RawGestureDetector с его собственным GestureFactory, который изменит способ работы арены.

ListView.builder(
      physics: AlwaysScrollableScrollPhysics(),
      itemCount: items.length,
      itemBuilder: (BuildContext context, int index) {
        var item = items[index];
        return Listener(
          child: Dismissible(
            key: ValueKey(item),
            child: ListTile(
              title: Text('This is some text'),
            ),
            onDismissed: (DismissDirection direction) {
              items.remove(index);
            },
          ),
          onPointerMove: (PointerMoveEvent move) {
            if (move.localDelta.dx > 1) {//Ideally this number whould be 
//(move.localDelta.dx != 0) but that is too sensitive so you can play with 
//this number till you find something you like. 
              print(move.position);
            }
          },
        );
      },
    );

Я хочу отдать должное Na sh, автору Flutter Deep Dive: Gestures это отличная статья, я настоятельно рекомендую вам ознакомиться с ней.

...