- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想在 flutter 中制作一个可重用的 PopupMenuButton,这样我就可以调用该小部件并动态分配 PopupMenuItem。
这是我所做的,但它引发了框架错误。我对 flutter 比较陌生。
这是应该可重用的类:
class PopupMenu {
PopupMenu({@required this.title, @required this.onTap});
final String title;
final VoidCallback onTap;
}
class PopupmMenuButtonBuilder {
setPopup(List<PopupMenu> popupItem) {
return PopupMenuButton<String>(
onSelected: (_) {
popupItem.forEach((item) => item.onTap);
},
itemBuilder: (BuildContext context) {
popupItem.forEach(
(item) {
return <PopupMenuItem<String>>[
PopupMenuItem<String>(
value: item.title,
child: Text(
item.title,
),
),
];
},
);
},
);
}
}
然后我这样调用小部件:
child: PopupmMenuButtonBuilder().setPopup([
PopupMenu(title: 'Item 1', onTap: () => print('item 1 selected')),
PopupMenu(title: 'Item 2', onTap: () => print('item 2 selected')),
]),
它显示了 3 点图标按钮,但是当我点击该图标时它抛出了这个错误:
I/flutter ( 8509): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
I/flutter ( 8509): The following assertion was thrown while handling a gesture:
I/flutter ( 8509): 'package:flutter/src/material/popup_menu.dart': Failed assertion: line 723 pos 10: 'items != null &&
I/flutter ( 8509): items.isNotEmpty': is not true.
I/flutter ( 8509): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter ( 8509): more information in this error message to help you determine and fix the underlying cause.
I/flutter ( 8509): In either case, please report this assertion by filing a bug on GitHub:
I/flutter ( 8509): https://github.com/flutter/flutter/issues/new?template=BUG.md
I/flutter ( 8509): When the exception was thrown, this was the stack:
I/flutter ( 8509): #2 showMenu (package:flutter/src/material/popup_menu.dart:723:10)
I/flutter ( 8509): #3 _PopupMenuButtonState.showButtonMenu (package:flutter/src/material/popup_menu.dart:898:5)
I/flutter ( 8509): #4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:511:14)
I/flutter ( 8509): #5 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:566:30)
I/flutter ( 8509): #6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:166:24)
I/flutter ( 8509): #7 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:240:9)
I/flutter ( 8509): #8 TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:211:7)
I/flutter ( 8509): #9 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
I/flutter ( 8509): #10 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:225:20)
I/flutter ( 8509): #11 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:199:22)
I/flutter ( 8509): #12 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
I/flutter ( 8509): #13 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)I/flutter ( 8509): #14 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)I/flutter ( 8509): #18 _invoke1 (dart:ui/hooks.dart:233:10)
I/flutter ( 8509): #19 _dispatchPointerDataPacket (dart:ui/hooks.dart:154:5)
I/flutter ( 8509): (elided 5 frames from class _AssertionError and package dart:async)
I/flutter ( 8509): Handler: onTap
I/flutter ( 8509): Recognizer:
I/flutter ( 8509): TapGestureRecognizer#8968f(debugOwner: GestureDetector, state: ready, won arena, finalPosition:
I/flutter ( 8509): Offset(339.0, 54.0), sent tap down)
I/flutter ( 8509): ════════════════════════════════════════════════════════════════════════════════════════════════════
最佳答案
您的 itemBuilder
需要返回一个 List
。它实际上并没有返回任何东西——注意 return
是如何在 forEach
内部的,所以它只是从 lambda 返回。一般来说,forEach
有时应该 be avoided .此外,PopupMenuButtonBuilder
类是多余的 - 它可以替换为静态或顶级函数。
另一件不清楚的事情是为什么要为每个选择调用每个 onTap
。正如您目前拥有的那样,它将调用每个回调!
试试这个:
class PopupMenu {
PopupMenu({@required this.title, @required this.onTap});
final String title;
final VoidCallback onTap;
static PopupMenuButton<String> createPopup(List<PopupMenu> popupItems) {
return PopupMenuButton<String>(
onSelected: (value) {
popupItems.firstWhere((e) => e.title == value).onTap();
},
itemBuilder: (context) => popupItems
.map((item) => PopupMenuItem<String>(
value: item.title,
child: Text(
item.title,
),
))
.toList(),
);
}
}
关于flutter - 如何在 Flutter 中制作可重用的 PopupMenuButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56661112/
我要定位PopupMenuButton的菜单到我的应用程序的侧面,但它总是与侧面留下大约 10 个逻辑像素的间隙: 我已经尝试给 offset属性为负 dx值,但这似乎没有任何作用。据我所知 Popu
我在 appTitle 上有一个简单的 PopupMenuButton 实现。在这里: PopupMenuItem _buildMenuItem(int size) { return PopupM
我在 appTitle 上有一个简单的 PopupMenuButton 实现。在这里: PopupMenuItem _buildMenuItem(int size) { return PopupM
我在 flutter 移动应用程序中使用 PopupMenuButton。我想定位菜单,使调用按钮根据屏幕居中对齐。以下是它目前在 iPhone 12 Max Pro 和 iPhone 8 上的显示方
我曾经使用 IconButton 的 onpressed 从我的 AppBar 导航到设置页面,这很有效。现在我正尝试从 PopupMenuItem 的 onTap 触发导航,但页面不导航。两个小部件
我正在使用 PopupMenuButton在我的聊天应用程序中。我想通过点击更多选项项目(与 Whatsapp 相同)来更改我的项目列表。 似乎 Whatsapp 刚刚关闭了 PopupMenuBut
任何想法如何从 Flutter PopupmenuButton 中删除巨大的填充?像shrinkWrap甚至可以使用的替代小部件之类的东西?它破坏了我的元素的对齐方式。 我尝试设置 padding到
在我的 flutter 移动应用程序中,我使用了一个放置在 View 底部的 PopupMenuButton。如果我点击它,软键盘会被关闭,因为我猜文本输入失去了焦点。所以弹出菜单没有显示在正确的位置
我在 FloatingActionButton 中有一个 PopupMenuButton。但它的 InkWell 不是圆形的,而是标准的方形。我怎样才能做到这一点? 最佳答案 使用 InkWell 的
我想在 flutter 中制作一个可重用的 PopupMenuButton,这样我就可以调用该小部件并动态分配 PopupMenuItem。 这是我所做的,但它引发了框架错误。我对 flutter 比
我正在尝试创建一个 PopupMenuButton .我用过PopupMenuButton class . PopupMenuButton( padding: EdgeInsets.only(ri
当我为 PopupMenuButton 设置 initialValue 时,下拉菜单与状态栏重叠。我怎样才能避免这种情况?另外,如何在应用栏下方设置 PopupMenuButton 的下拉位置? 最佳
我正在尝试通过 PopupMenuButton 删除我的卡片。 但是我无法将有关当前卡的任何信息传递给它的 onSelected 方法,它接受 String 并返回 void。 onSelected:
当按下 PopupMenuButton 时,当前选定的值会突出显示, 但是当按下 DropdownButton 时,当前选定的值不会突出显示。 有没有办法突出显示 DropdownButton 的选定
我试图在单击导航栏项目时显示菜单。这是我的尝试: @override Widget build(BuildContext context) { return DefaultTabCon
我有一个 PaginatedDataTable,它有一个带有 PopupMenuButton 的 DataCell。 WidgetTester 可以毫无问题地找到每个 DataCell,但我似乎无法引
我只是在玩新的 Google Map flutter 包。 我要换 MapType使用 PopupMenuButton 的 map ,如混合、卫星、无等.下面是我的代码。 import 'packag
我想单击一个项目菜单 (PopupMenuItem) 并使用 Navigator.push 转到另一条路线,但方法内未定义上下文。 import 'package:flutter/material.d
我是一名优秀的程序员,十分优秀!