【发布时间】:2018-07-23 14:09:48
【问题描述】:
我试图实现 peek & pop 效果 - 当用户点击并按住卡片时,会打开一个对话框,并在用户不再点击屏幕时关闭:
Listener(
onPointerDown: (PointerDownEvent e) {
// open dialog
showDialog(
context: context,
builder: (context) => Container(
child: Card(),
));
},
onPointerUp: (PointerUpEvent e) {
// dismiss dialog
if (Navigator.of(context).canPop()) {
Navigator.of(context).pop('dialog');
}
},
child: Card()
)
效果很好,当我按住卡片时会显示对话框,当我不再按住卡片时会关闭。
但我希望在调用 onPointerDown 之前有一些延迟,例如来自 GestureDectector 的 onLongPress - 当我长按时我能够显示对话框,但是当我离开屏幕时从未调用过 onTapUp:
GestureDetector(
onLongPress: () {
// open dialog
showDialog(
context: context,
builder: (context) => Container(child: Card()));
},
onTapUp: (TapUpDetails d) {
// dismiss dialog
if (Navigator.of(context).canPop()) {
Navigator.of(context).pop();
}
},
child: Card()
)
我尝试通过以下方式执行此操作,但也从未调用过 onTapUp:
GestureDetector(
onTapDown: (TapDownDetails d) {
// open dialog
showDialog(context: context, builder: (context) => Card());
},
onTapUp: (TapUpDetails d) {
// dismiss dialog
if (Navigator.of(context).canPop()) {
Navigator.of(context).pop();
}
},
child: Card())
但以下显示水龙头已正确注册:
GestureDetector(
onTapDown: (TapDownDetails d) {
print("down")
},
onTapUp: (TapUpDetails d) {
print("up")
},
child: Card()
)
环顾四周后,我注意到flutter PR 添加了 onLongPressUp - 我将这些更改添加到我的颤振中,然后尝试重新实现我以前的代码,如下所示:
GestureDetector(
onLongPress: () {
// open dialog
showDialog(
context: context,
builder: (context) => Container(child: Card()));
},
onLongPressUp: () {
// dismiss dialog
if (Navigator.of(context).canPop()) {
Navigator.of(context).pop();
}
},
child: Card()
)
对话框在长按时显示,但当我不再长按时从未关闭 - 似乎没有调用 onLongPressUp,但以下显示它正在正确注册我的点击:
GestureDetector(
onLongPress: () {
print("longpress")
},
onLongPressUp: () {
print("longpressup")
},
child: Card()
)
在所有这些中,只有使用 Listener 我才能通过点击向下和向上点击来打开和关闭对话框,但我想在调用 onPointerDown 之前添加一个延迟,我还尝试在 onPointerDown 添加一个 Timer但似乎不起作用。
有什么解决办法吗?
【问题讨论】:
-
我来晚了一点,但你知道,从我的理解来看,这似乎是 BuildContext 的问题。显然,函数正在被调用,并且当您将导航器替换为堆栈时这会起作用,因此问题一定是导航器无法识别它可以弹出的事实。也许这是整个框架的一个更深层次的潜在问题?