0

我试图在使用Dismissible小部件时获得拖动偏移量。所以试图用GestureDetector包装它,但它的onHorizo​​ntalDragStart不起作用。尝试了任何一种方式,即将 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);
        },
      ),
    );
  },
);
4

1 回答 1

3

嵌套手势小部件

您遇到此问题的原因是因为这两个小部件都接收触摸输入,并且当您有两个小部件接收触摸输入时,长话短说孩子赢得了这场战斗。这是长篇大论。因此,您的Dismissible和的两个输入GestureDetector都被发送到所谓的 a GestureArena。那里的竞技场考虑了多种不同的因素,但故事的结局是孩子总是赢。您可以通过定义自己的来解决此问题,RawGestureDetectorGestureFactory将改变竞技场的执行方式。

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);
            }
          },
        );
      },
    );

我想将所有功劳归功于Flutter Deep Dive: Gestures的作者 Nash,这是一篇很棒的文章,我强烈建议您查看。

于 2020-04-15T06:34:52.643 回答