GestureDetector 不适用于 Dismissible Widget
GestureDetector is not working with Dismissible Widget
我正在尝试在使用 Dismissible 小部件时获得 拖动偏移量 。所以尝试用 GestureDetector 包装它,但它的 onHorizontalDragStart 不起作用。
尝试了任何一种方式,即将 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);
},
),
);
},
);
嵌套手势小部件
您遇到此问题的原因是因为这两个小部件都接收触摸输入,并且当您有两个接收触摸输入的小部件时,长话短说 child 赢得了这场战斗。说来话长。因此,来自 Dismissible
和 GestureDetector
的两个输入都会发送到所谓的 GestureArena
。那里的竞技场考虑了多种不同的因素,但故事的结局是 child 总是赢家。您可以通过使用自己的 GestureFactory
定义自己的 RawGestureDetector
来解决此问题,这将改变竞技场的执行方式。
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 的作者纳什,这是一篇很棒的文章,我强烈建议您查看。
我正在尝试在使用 Dismissible 小部件时获得 拖动偏移量 。所以尝试用 GestureDetector 包装它,但它的 onHorizontalDragStart 不起作用。
尝试了任何一种方式,即将 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);
},
),
);
},
);
嵌套手势小部件
您遇到此问题的原因是因为这两个小部件都接收触摸输入,并且当您有两个接收触摸输入的小部件时,长话短说 child 赢得了这场战斗。说来话长。因此,来自 Dismissible
和 GestureDetector
的两个输入都会发送到所谓的 GestureArena
。那里的竞技场考虑了多种不同的因素,但故事的结局是 child 总是赢家。您可以通过使用自己的 GestureFactory
定义自己的 RawGestureDetector
来解决此问题,这将改变竞技场的执行方式。
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 的作者纳什,这是一篇很棒的文章,我强烈建议您查看。