Flutter浮动操作按钮菜单插件fab_circular_menu_plus的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter浮动操作按钮菜单插件fab_circular_menu_plus的使用

FAB Circular Menu

Pub package License Null safety Platform

fab_circular_menu_plus 是一个Flutter包,用于创建一个美观的圆形菜单,通过浮动操作按钮(FAB)实现。它最初受到 Mayur KshirsagarFAB Microinteraction 设计启发,并由 Mariano Cordova 实现为 Flutter 插件

Showcase

安装

只需将 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 并将其设置为 FabCircularMenuPluskey 属性,然后使用该键获取当前状态并打开、关闭或检查菜单状态。

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

1 回复

更多关于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),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml文件中添加fab_circular_menu_plus依赖。

  2. 初始化动画控制器:在_MyHomePageState中初始化一个AnimationController来控制菜单的打开和关闭动画。

  3. FAB菜单项:在FabCircularMenuPlus中定义多个FabCircularMenuItem,每个菜单项都有一个图标、标签和点击事件处理函数。

  4. 布局:使用Scaffold布局,将FAB菜单放置在bottomNavigationBar中,并将主FAB按钮放置在floatingActionButton中。这里使用了FloatingActionButtonLocation.centerDocked来定位主FAB按钮。

  5. 点击事件处理:在_onMenuItemClicked方法中处理菜单项的点击事件,这里简单地显示了一个SnackBar来指示点击了哪个菜单项。

运行这段代码后,你应该会看到一个带有主FAB按钮和圆形菜单项的界面,点击主FAB按钮会打开菜单,点击菜单项会显示相应的SnackBar。

回到顶部