下面我将为你详细介绍Flutter3.7新增Menu菜单组件的使用教程。
1. Menu菜单组件简介
Menu组件是Flutter 3.7版本新增的一种常用的UI组件,它可以显示一个弹出式菜单,类似于常见的下拉框或右键菜单。当用户点击触发菜单组件时,会弹出一个菜单列表,用户可以在里面选择所需的选项。
2. Menu菜单组件的基本使用
使用Menu菜单组件的基本步骤如下:
步骤1:引入Menu组件库
在Flutter项目的pubspec.yaml文件中引入Menu组件库:
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
popup_menu: ^0.1.8
步骤2:创建Menu组件
在Flutter的页面中使用PopupMenuButton组件创建一个触发菜单的按钮,并将需要显示的菜单列表作为参数传入:
PopupMenuButton(
itemBuilder: (BuildContext context) => <PopupMenuEntry>[
PopupMenuItem(
child: Text('选项一'),
value: '选项一',
),
PopupMenuItem(
child: Text('选项二'),
value: '选项二',
),
PopupMenuDivider(),
PopupMenuItem(
child: Text('选项三'),
value: '选项三',
),
],
)
步骤3:处理菜单选项的回调事件
使用onSelected属性来指定菜单选项的回调事件,当用户选择一个菜单项时,该事件会被触发并且传入该菜单项的value值:
PopupMenuButton(
onSelected: (String value) {
print('您选择了:$value');
},
itemBuilder: (BuildContext context) => <PopupMenuEntry>[
PopupMenuItem(
child: Text('选项一'),
value: '选项一',
),
PopupMenuItem(
child: Text('选项二'),
value: '选项二',
),
PopupMenuDivider(),
PopupMenuItem(
child: Text('选项三'),
value: '选项三',
),
],
)
3. Menu菜单组件的高级使用
Menu菜单组件还支持一些高级功能,如设置分离线、子菜单、图标等,下面将分别进行介绍。
设置分离线
使用PopupMenuDivider()可以在菜单中插入分离线,例如:
PopupMenuButton(
onSelected: (String value) {
print('您选择了:$value');
},
itemBuilder: (BuildContext context) => <PopupMenuEntry>[
PopupMenuItem(
child: Text('选项一'),
value: '选项一',
),
PopupMenuItem(
child: Text('选项二'),
value: '选项二',
),
PopupMenuDivider(),
PopupMenuItem(
child: Text('选项三'),
value: '选项三',
),
],
)
设置子菜单
使用PopupMenuButton组件的子类PopupMenuItem提供了一个属性叫做submenu,可以指定一个子菜单列表,这样子菜单就可以呈现为一个可嵌套的 多级菜单 ,例如:
const List<Map> menuList = [
{
'name': '选项一',
'icon': Icons.access_alarm,
'sublist': [
{'name': '子选项一', 'icon': Icons.ac_unit},
{'name': '子选项二', 'icon': Icons.accessibility_new},
{'name': '子选项三', 'icon': Icons.accessible_forward},
],
},
{'name': '选项二', 'icon': Icons.accessibility},
{'name': '选项三', 'icon': Icons.account_balance},
];
PopupMenuButton(
onSelected: (String value) {
print('您选择了:$value');
},
itemBuilder: (BuildContext context) {
return menuList.map<PopupMenuEntry>((item) {
if (item['sublist'] == null) {
return PopupMenuItem(
value: item['name'],
child: Row(
children: <Widget>[
Icon(item['icon']),
SizedBox(width: 8),
Text(item['name']),
],
),
);
} else {
return PopupMenuItem(
value: 'sublist',
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Icon(item['icon']),
SizedBox(width: 8),
Text(item['name']),
],
),
PopupMenuDivider(),
Column(
children: item['sublist'].map<PopupMenuItem>((subitem) {
return PopupMenuItem(
value: subitem['name'],
child: Row(
children: <Widget>[
Icon(subitem['icon']),
SizedBox(width: 8),
Text(subitem['name']),
],
),
);
}).toList(),
),
],
),
);
}
}).toList();
},
)
设置图标
使用PopupMenuButton的icon属性可以为按钮设置一个图标,例如:
PopupMenuButton(
icon: Icon(Icons.more_vert),
...
)
4. 示例说明
下面的示例演示了使用Menu组件来创建一个邮件应用的功能菜单,其中菜单中包含了一些常用的选项、分离线和子菜单:
import 'package:flutter/material.dart';
import 'package:popup_menu/popup_menu.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Menu Demo',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
final List<Map> menuList = [
{
'name': '新建',
'icon': Icons.add,
'sublist': [
{'name': '新建邮件', 'icon': Icons.mail},
{'name': '新建通讯录', 'icon': Icons.contacts},
{'name': '新建日程', 'icon': Icons.calendar_today},
],
},
{'name': '刷新', 'icon': Icons.refresh},
{'name': '收件箱', 'icon': Icons.inbox},
{'name': '已发送', 'icon': Icons.send},
{'name': '已删除', 'icon': Icons.delete},
PopupMenuDivider(),
{'name': '设置', 'icon': Icons.settings},
{'name': '帮助', 'icon': Icons.help},
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Menu Demo'),
actions: <Widget>[
PopupMenuButton(
icon: Icon(Icons.more_vert),
itemBuilder: (BuildContext context) {
return menuList.map<PopupMenuEntry>((item) {
if (item['sublist'] == null) {
return PopupMenuItem(
value: item['name'],
child: Row(
children: <Widget>[
Icon(item['icon']),
SizedBox(width: 8),
Text(item['name']),
],
),
);
} else {
return PopupMenuItem(
value: 'sublist',
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Icon(item['icon']),
SizedBox(width: 8),
Text(item['name']),
],
),
PopupMenuDivider(),
Column(
children: item['sublist'].map<PopupMenuItem>((subitem) {
return PopupMenuItem(
value: subitem['name'],
child: Row(
children: <Widget>[
Icon(subitem['icon']),
SizedBox(width: 8),
Text(subitem['name']),
],
),
);
}).toList(),
),
],
),
);
}
}).toList();
},
),
],
),
body: Center(
child: Text('点击右上角按钮打开功能菜单'),
),
);
}
}
在这个示例中,我们使用PopupMenuButton组件来创建一个触发菜单的按钮,并使用menuList数组来指定菜单选项和子菜单。其中,当菜单项包含子菜单时,我们使用PopupMenuItem的submenu属性来指定子菜单内容,同时使用PopupMenuDivider来插入分离线。最后,在菜单选项被选中时,onSelected回调函数会被触发并传回所选的菜单项的内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flutter3.7新增Menu菜单组件的使用教程分享 - Python技术站