Flutter浮动操作按钮菜单插件fab_circular_menu_plus的使用
Flutter浮动操作按钮菜单插件fab_circular_menu_plus的使用
FAB Circular Menu
fab_circular_menu_plus
是一个Flutter包,用于创建一个美观的圆形菜单,通过浮动操作按钮(FAB)实现。它最初受到 Mayur Kshirsagar 的 FAB Microinteraction 设计启发,并由 Mariano Cordova 实现为 Flutter 插件。
安装
只需将 fab_circular_menu_plus
添加到您的 pubspec.yml
文件中:
dependencies:
fab_circular_menu_plus: ^0.0.1
示例代码
以下是一个完整的示例,展示了如何使用 fab_circular_menu_plus
创建一个带有四个菜单项的浮动操作按钮菜单:
import 'package:flutter/material.dart';
import 'package:fab_circular_menu_plus/fab_circular_menu_plus.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final GlobalKey<FabCircularMenuPlusState> fabKey = GlobalKey();
@override
Widget build(BuildContext context) {
final primaryColor = Theme.of(context).primaryColor;
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: const Color(0xFF192A56),
child: Center(
child: ElevatedButton(
onPressed: () {
// The menu can be handled programmatically using a key
if (fabKey.currentState?.isOpen ?? false) {
fabKey.currentState?.close();
} else {
fabKey.currentState?.open();
}
},
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
),
child: Text('Toggle menu programmatically',
style: TextStyle(color: primaryColor)),
),
),
),
floatingActionButton: Builder(
builder: (context) => FabCircularMenuPlus(
key: fabKey,
// Cannot be `Alignment.center`
alignment: Alignment.bottomRight,
ringColor: Colors.white.withAlpha(25),
ringDiameter: 500.0,
ringWidth: 150.0,
fabSize: 64.0,
fabElevation: 8.0,
fabIconBorder: const CircleBorder(),
// Also can use specific color based on whether
// the menu is open or not:
// fabOpenColor: Colors.white
// fabCloseColor: Colors.white
// These properties take precedence over fabColor
fabColor: Colors.white,
fabOpenIcon: Icon(Icons.menu, color: primaryColor),
fabCloseIcon: Icon(Icons.close, color: primaryColor),
fabMargin: const EdgeInsets.all(16.0),
animationDuration: const Duration(milliseconds: 800),
animationCurve: Curves.easeInOutCirc,
onDisplayChange: (isOpen) {
_showSnackBar(
context, "The menu is ${isOpen ? "open" : "closed"}");
},
children: <Widget>[
RawMaterialButton(
onPressed: () {
_showSnackBar(context, "You pressed 1");
},
shape: const CircleBorder(),
padding: const EdgeInsets.all(24.0),
child: const Icon(Icons.looks_one, color: Colors.white),
),
RawMaterialButton(
onPressed: () {
_showSnackBar(context, "You pressed 2");
},
shape: const CircleBorder(),
padding: const EdgeInsets.all(24.0),
child: const Icon(Icons.looks_two, color: Colors.white),
),
RawMaterialButton(
onPressed: () {
_showSnackBar(context, "You pressed 3");
},
shape: const CircleBorder(),
padding: const EdgeInsets.all(24.0),
child: const Icon(Icons.looks_3, color: Colors.white),
),
RawMaterialButton(
onPressed: () {
_showSnackBar(context,
"You pressed 4. This one closes the menu on tap");
fabKey.currentState?.close();
},
shape: const CircleBorder(),
padding: const EdgeInsets.all(24.0),
child: const Icon(Icons.looks_4, color: Colors.white),
)
],
),
),
),
);
}
void _showSnackBar(BuildContext context, String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message),
duration: const Duration(milliseconds: 1000),
),
);
}
}
自定义属性
您可以使用以下属性来自定义小部件的外观:
属性 | 描述 | 默认值 |
---|---|---|
alignment | 设置小部件对齐方式 | Alignment.bottomRight |
ringColor | 设置环的颜色 | accentColor |
ringDiameterLimitFactor | 设置环直径限制因子 | 1.5 |
ringDiameter | 设置环直径 | screenWidth * ringDiameterLimitFactor (竖屏) screenHeight * ringDiameterLimitFactor (横屏) |
ringWidthLimitFactor | 设置环宽度限制因子 | 0.2 |
ringWidth | 设置环宽度 | ringDiameter * ringWidthLimitFactor |
fabSize | 设置FAB大小 | 64.0 |
fabElevation | 设置FAB的阴影高度 | 8.0 |
fabColor | 设置FAB颜色 | primaryColor |
fabOpenColor | 设置菜单打开时FAB的颜色 | - |
fabCloseColor | 设置菜单关闭时FAB的颜色 | - |
fabChild | 设置FAB中的子元素 | - |
fabOpenIcon | 设置菜单打开时FAB的图标 | Icon(Icons.menu) |
fabCloseIcon | 设置菜单关闭时FAB的图标 | Icon(Icons.close) |
fabMargin | 设置小部件边距 | EdgeInsets.all(16.0) |
animationDuration | 更改动画持续时间 | Duration(milliseconds: 800) |
animationCurve | 修改动画曲线 | Curves.easeInOutCirc |
onDisplayChange | 每次菜单打开或关闭时调用此回调,传递当前状态作为参数 | - |
程序化处理菜单
可以通过使用 key
来程序化地处理菜单。创建一个 GlobalKey
并将其设置为 FabCircularMenuPlus
的 key
属性,然后使用该键获取当前状态并打开、关闭或检查菜单状态。
final GlobalKey<FabCircularMenuPlusState> fabKey = GlobalKey();
// 在需要的地方调用
if (fabKey.currentState?.isOpen ?? false) {
fabKey.currentState?.close();
} else {
fabKey.currentState?.open();
}
贡献
如果您希望为这个项目做出贡献,请随时提交 PR。欢迎任何改进和建议!
希望这些信息能帮助您更好地理解和使用 fab_circular_menu_plus
插件!如果有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter浮动操作按钮菜单插件fab_circular_menu_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter浮动操作按钮菜单插件fab_circular_menu_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用fab_circular_menu_plus
插件来实现浮动操作按钮(FAB)菜单的示例代码。fab_circular_menu_plus
是一个流行的Flutter插件,用于创建带有多个子按钮的圆形FAB菜单。
首先,确保你已经在pubspec.yaml
文件中添加了fab_circular_menu_plus
依赖:
dependencies:
flutter:
sdk: flutter
fab_circular_menu_plus: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目的main.dart
文件或其他Dart文件中,你可以使用以下代码来实现FAB菜单:
import 'package:flutter/material.dart';
import 'package:fab_circular_menu_plus/fab_circular_menu_plus.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'FAB Circular Menu Plus Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
late AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 300),
vsync: this,
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void _onMenuItemClicked(int index) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Clicked on item $index")),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('FAB Circular Menu Plus Demo'),
),
body: Center(
child: Text('FAB Circular Menu Plus Example'),
),
floatingActionButton: FloatingActionButton.extended(
onPressed: () {},
icon: Icon(Icons.add),
label: Text('Main FAB'),
backgroundColor: Colors.blue,
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
bottomNavigationBar: BottomAppBar(
shape: CircularNotchedRectangle(),
notchMargin: 4.0,
child: FabCircularMenuPlus(
animationController: _controller,
child: Icon(Icons.add),
backgroundColor: Colors.blue,
menuItems: [
FabCircularMenuItem(
icon: Icons.directions_car,
label: 'Item 1',
onClick: () => _onMenuItemClicked(0),
),
FabCircularMenuItem(
icon: Icons.directions_transit,
label: 'Item 2',
onClick: () => _onMenuItemClicked(1),
),
FabCircularMenuItem(
icon: Icons.directions_bike,
label: 'Item 3',
onClick: () => _onMenuItemClicked(2),
),
FabCircularMenuItem(
icon: Icons.directions_walk,
label: 'Item 4',
onClick: () => _onMenuItemClicked(3),
),
],
),
),
);
}
}
解释
-
依赖添加:在
pubspec.yaml
文件中添加fab_circular_menu_plus
依赖。 -
初始化动画控制器:在
_MyHomePageState
中初始化一个AnimationController
来控制菜单的打开和关闭动画。 -
FAB菜单项:在
FabCircularMenuPlus
中定义多个FabCircularMenuItem
,每个菜单项都有一个图标、标签和点击事件处理函数。 -
布局:使用
Scaffold
布局,将FAB菜单放置在bottomNavigationBar
中,并将主FAB按钮放置在floatingActionButton
中。这里使用了FloatingActionButtonLocation.centerDocked
来定位主FAB按钮。 -
点击事件处理:在
_onMenuItemClicked
方法中处理菜单项的点击事件,这里简单地显示了一个SnackBar来指示点击了哪个菜单项。
运行这段代码后,你应该会看到一个带有主FAB按钮和圆形菜单项的界面,点击主FAB按钮会打开菜单,点击菜单项会显示相应的SnackBar。