Flutter扩展菜单功能插件flutter_expanded_menu的使用
Flutter扩展菜单功能插件flutter_expanded_menu的使用
flutter_expanded_menu
是一个用于在 Flutter 应用中实现可展开/折叠菜单的小部件。
预览
![截图]
开始使用
1. 添加依赖
首先,在你的应用的 pubspec.yaml
文件中添加以下代码:
dependencies:
flutter_expanded_menu: 0.0.1
2. 导入包
然后,在你的 Dart 代码中导入该包:
import 'package:flutter_expanded_menu/flutter_expanded_menu.dart';
示例
下面是一个完整的示例,展示了如何使用 flutter_expanded_menu
插件来创建一个带有不同方向和位置的菜单。
import 'package:flutter/material.dart';
import 'package:flutter_expanded_menu/flutter_expanded_menu.dart';
// 假设你已经定义了Item类
class Item {
final String title;
final String iconPath;
final int count;
Item(this.title, this.iconPath, this.count);
}
class ItemWidget extends StatelessWidget {
final Item data;
ItemWidget({required this.data});
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(8.0),
),
child: Column(
children: [
Image.asset(data.iconPath, width: 24, height: 24),
SizedBox(height: 4),
Text(data.title),
],
),
);
}
}
class AnchorWidget extends StatelessWidget {
final List<Item> items;
final bool isExpand;
AnchorWidget({required this.items, required this.isExpand});
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(8.0),
),
child: Row(
children: items.map((item) => Text(item.title)).toList(),
),
);
}
}
class MenuDataChangedListener extends ValueNotifier<bool> {
MenuDataChangedListener(bool value) : super(value);
void toggle() {
value = !value;
}
}
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
MenuDataChangedListener notifier = MenuDataChangedListener(true);
var items = [
Item("健康监控", "assets/images/ic_health_manager.png", 6),
Item("地图管理", "assets/images/ic_map_manager.png", 0),
Item("排班管理", "assets/images/ic_schedule_manager.png", 0),
Item("任务管理", "assets/images/ic_task_manager.png", 0),
Item("机器设置", "assets/images/ic_robot_settings.png", 2),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter Expanded Menu Demo'),
),
body: Stack(
children: [
Positioned(
left: 10,
top: 10,
child: ExpandedMenuWidget<Item>(
size: 48,
direction: Axis.horizontal,
anchorDirection: AxisDirection.left,
itemsContainerAlignment: Alignment.topLeft,
menuItems: items,
notifier: notifier,
itemBuilder: (_, index, item) {
return ItemWidget(data: item);
},
anchorBuilder: (_, items, isExpand) {
return AnchorWidget(items: items, isExpand: isExpand);
},
onAnchorTap: (isExpand) {},
onItemTap: (item) {},
),
),
Positioned(
left: 10,
top: 100,
child: ExpandedMenuWidget<Item>(
size: 48,
direction: Axis.horizontal,
anchorDirection: AxisDirection.left,
itemsContainerAlignment: Alignment.topRight,
menuItems: items,
notifier: notifier,
itemBuilder: (_, index, item) {
return ItemWidget(data: item);
},
anchorBuilder: (_, items, isExpand) {
return AnchorWidget(items: items, isExpand: isExpand);
},
onAnchorTap: (isExpand) {},
onItemTap: (item) {},
),
),
Positioned(
left: 10,
top: 200,
child: ExpandedMenuWidget<Item>(
size: 48,
direction: Axis.horizontal,
anchorDirection: AxisDirection.left,
itemsContainerAlignment: Alignment.topCenter,
menuItems: items,
notifier: notifier,
itemBuilder: (_, index, item) {
return ItemWidget(data: item);
},
anchorBuilder: (_, items, isExpand) {
return AnchorWidget(items: items, isExpand: isExpand);
},
onAnchorTap: (isExpand) {},
onItemTap: (item) {},
),
),
Positioned(
right: 10,
top: 300,
child: ExpandedMenuWidget<Item>(
size: 48,
direction: Axis.horizontal,
anchorDirection: AxisDirection.right,
itemsContainerAlignment: Alignment.topRight,
menuItems: items,
notifier: notifier,
itemBuilder: (_, index, item) {
return ItemWidget(data: item);
},
anchorBuilder: (_, items, isExpand) {
return AnchorWidget(items: items, isExpand: isExpand);
},
onAnchorTap: (isExpand) {},
onItemTap: (item) {},
),
),
Positioned(
left: 10,
top: 400,
child: ExpandedMenuWidget<Item>(
size: 48,
direction: Axis.vertical,
anchorDirection: AxisDirection.up,
itemsContainerAlignment: Alignment.topLeft,
menuItems: items,
notifier: notifier,
itemBuilder: (_, index, item) {
return ItemWidget(data: item);
},
anchorBuilder: (_, items, isExpand) {
return AnchorWidget(items: items, isExpand: isExpand);
},
onAnchorTap: (isExpand) {},
onItemTap: (item) {},
),
),
Positioned(
right: 10,
bottom: 10,
child: ExpandedMenuWidget<Item>(
size: 48,
direction: Axis.vertical,
anchorDirection: AxisDirection.down,
itemsContainerAlignment: Alignment.bottomLeft,
menuItems: items,
notifier: notifier,
itemBuilder: (_, index, item) {
return ItemWidget(data: item);
},
anchorBuilder: (_, items, isExpand) {
return AnchorWidget(items: items, isExpand: isExpand);
},
onAnchorTap: (isExpand) {},
onItemTap: (item) {},
),
),
],
),
);
}
}
许可证
版权所有 (c) 2023, porum
根据Apache许可证2.0版("许可证")获得许可;
除非符合许可证,否则不得使用此文件。
您可以在以下位置获得许可证的副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,根据许可证分发的软件
按"原样"分发,无任何明示或暗示的担保或条件。
有关许可证下管理权限和
限制的特定语言,请参阅许可证。
更多关于Flutter扩展菜单功能插件flutter_expanded_menu的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter扩展菜单功能插件flutter_expanded_menu的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_expanded_menu
是一个用于在 Flutter 应用中实现扩展菜单功能的插件。它允许你创建一个可以展开和折叠的菜单,通常用于显示更多的选项或操作。以下是如何使用 flutter_expanded_menu
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 flutter_expanded_menu
依赖:
dependencies:
flutter:
sdk: flutter
flutter_expanded_menu: ^0.0.1 # 请检查最新的版本号
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 flutter_expanded_menu
:
import 'package:flutter_expanded_menu/flutter_expanded_menu.dart';
3. 使用 ExpandedMenu
ExpandedMenu
是 flutter_expanded_menu
插件中的主要组件。你可以使用它来创建一个可以展开和折叠的菜单。
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Expanded Menu Example'),
),
body: Center(
child: ExpandedMenu(
title: Text('Menu Title'),
children: [
ListTile(
title: Text('Option 1'),
onTap: () {
print('Option 1 selected');
},
),
ListTile(
title: Text('Option 2'),
onTap: () {
print('Option 2 selected');
},
),
ListTile(
title: Text('Option 3'),
onTap: () {
print('Option 3 selected');
},
),
],
),
),
);
}
}
4. 自定义样式
你可以通过 ExpandedMenu
的 style
参数来自定义菜单的样式,例如背景颜色、边框、圆角等。
ExpandedMenu(
title: Text('Custom Style Menu'),
style: ExpandedMenuStyle(
backgroundColor: Colors.blue[100],
borderRadius: BorderRadius.circular(10),
elevation: 5,
),
children: [
ListTile(
title: Text('Option 1'),
onTap: () {
print('Option 1 selected');
},
),
ListTile(
title: Text('Option 2'),
onTap: () {
print('Option 2 selected');
},
),
],
)
5. 处理展开/折叠事件
你可以通过 onExpand
和 onCollapse
回调来处理菜单展开和折叠的事件。
ExpandedMenu(
title: Text('Menu with Events'),
onExpand: () {
print('Menu expanded');
},
onCollapse: () {
print('Menu collapsed');
},
children: [
ListTile(
title: Text('Option 1'),
onTap: () {
print('Option 1 selected');
},
),
ListTile(
title: Text('Option 2'),
onTap: () {
print('Option 2 selected');
},
),
],
)
6. 完整示例
以下是一个完整的示例,展示了如何在 Flutter 应用中使用 flutter_expanded_menu
:
import 'package:flutter/material.dart';
import 'package:flutter_expanded_menu/flutter_expanded_menu.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Expanded Menu Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Expanded Menu Example'),
),
body: Center(
child: ExpandedMenu(
title: Text('Menu Title'),
style: ExpandedMenuStyle(
backgroundColor: Colors.blue[100],
borderRadius: BorderRadius.circular(10),
elevation: 5,
),
onExpand: () {
print('Menu expanded');
},
onCollapse: () {
print('Menu collapsed');
},
children: [
ListTile(
title: Text('Option 1'),
onTap: () {
print('Option 1 selected');
},
),
ListTile(
title: Text('Option 2'),
onTap: () {
print('Option 2 selected');
},
),
ListTile(
title: Text('Option 3'),
onTap: () {
print('Option 3 selected');
},
),
],
),
),
);
}
}