我正在制作一个图片库,我需要用户能够长按一个图像显示一个弹出菜单,这将让他删除图像。
我的代码,到目前为止:
return GestureDetector(
onLongPress: () {
showMenu(
items: <PopupMenuEntry>[
PopupMenuItem(
value: this._index,
child: Row(
children: <Widget>[
Icon(Icons.delete),
Text("Delete"),
],
),
)
],
context: context,
);
},
child: Image.memory(
this._asset.thumbData.buffer.asUint8List(),
fit: BoxFit.cover,
gaplessPlayback: true,
),
);
它产生:
但是,我也不知道如何在调用longPress函数时完全删除图像的小部件。
5条答案
按热度按时间k0pti3hp1#
OP和第一个回答者使用
PopupMenuButton
绕过了最初的问题,在他们的案例中运行良好。但是我认为更普遍的问题是,如何定位自己的菜单以及如何接收用户的响应 * 而不使用PopupMenuButton
* 是值得回答的,因为有时我们希望在自定义小部件上有一个弹出菜单,我们希望它出现在一些手势上,而不是简单的点击(例如,OP的最初意图是长按)。我开始制作一个简单的应用程序,演示以下内容:
1.使用
GestureDetector
捕获长按1.使用函数
showMenu()
显示弹出菜单,并将其放置在手指触摸的位置附近1.如何接收用户的选择
1.如何创建一个表示多个值的
PopupMenuEntry
(常用的PopupMenuItem
只能表示一个值)结果是,当你长按一个大的黄色区域时,会出现一个弹出菜单,你可以在上面选择
+1
或-1
,大的数字会相应地增加或减少:跳到代码的末尾,查看整个代码主体。注解被分散在那里,用来解释我正在做什么。这里有一些需要注意的事情:
showMenu()
的position
参数还需要一些努力。它是一个RelativeRect
,表示如何将较小的矩形放置在较大的矩形中。在我们的示例中,较大的矩形是整个屏幕,较小的矩形是触摸区域。Flutter根据以下规则(简单英语)定位弹出菜单:引用
PopupMenuButton
's official implementation来查看它如何使用showMenu()
来显示菜单总是很有用的。showMenu()
返回Future
。使用Future.then()
注册回调以处理用户选择。另一个选项是使用await
。1.记住
PopupMenuEntry
是StatefulWidget
的一个子类,你可以在其中放置任意数量的子部件,这就是你在PopupMenuEntry
中表示多个值的方法,如果你想让它表示两个值,只要让它包含两个按钮,不管你想怎么放置它们。1.要关闭弹出菜单,请使用
Navigator.pop()
。Flutter将弹出菜单视为一个较小的“页面”。当我们显示弹出菜单时,实际上是将一个“页面”推到导航器的堆栈中。要关闭弹出菜单,我们将其从堆栈中弹出,从而完成前面提到的Future
。下面是完整的代码:
qnakjoqk2#
如果您打算使用gridView或listview在屏幕上布局图像,您可以使用手势检测器 Package 每个项目,然后您应该将图像保存在列表中的某个位置,然后只需从列表中删除图像并调用setState()。
类似于下面的代码(这段代码可能无法编译,但它应该能给予你一些启发)
编辑:您也可以使用弹出菜单,如下所示
w8f9ii693#
以Nick Lee和hacker1024的答案为基础,但不是将解决方案转换为mixin,而是将其转换为一个小部件:
然后你可以这样使用它:
根据需要调整代码。
c0vxltue4#
Nick Lee的答案可以很容易地转换成mixin,然后可以在任何你想使用弹出菜单的地方使用。
混合:
然后,使用它:
unguejic5#
2023年的答案
在Flutter 3.7中,现在有一个ContextMenuRegion小部件,你可以把它 Package 在任何现有的小部件上,当用户长按或右键单击(取决于平台)时,你给予它的菜单就会出现。