Flutter手势菜单插件gestu_menu的使用

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

Flutter手势菜单插件gestu_menu的使用

Gestu Menu 是一个提供可自定义和动画效果的手势菜单插件,包含主菜单项和子菜单项。

特性

  • 支持主菜单项和子菜单项。
  • 支持前缀和后缀图标。
  • 可以自定义选中项的颜色。
  • 展开和收缩有动画效果。

安装

pubspec.yaml 文件中添加 gestu_menu 依赖:

dependencies:
  gestu_menu: ^0.0.2

然后运行 flutter pub get 来安装该包。

使用

以下是一个完整的示例代码,展示了如何使用 gestu_menu 插件:

import 'package:flutter/material.dart';
import 'package:gestu_menu/gestu_menu.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是你的应用的根节点。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Gestu Menu',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Demo Menu Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          const SizedBox(height: 8),
          GestuMenuPrimaryItem<String>(
            title: 'Main Option',
            prefixIconData: Icons.space_dashboard_outlined,
            expandedIndicatorRight: true,
            onTap: (value) {
              debugPrint('action button: $value');
            },
            items: const [
              GestuMenuSecondaryItemWidget(
                prefixIconData: Icons.bubble_chart,
                title: 'Menu Item Selected',
                counter: 1,
                isSelected: true,
                index: 'hola',
                // onTap: (value) {},
              ),
              GestuMenuSecondaryItemWidget(
                prefixIconData: Icons.bar_chart_outlined,
                title: 'Menu Item',
                counter: 2,
                index: 'Adios',
                // onTap: (value) {},
              ),
            ],
          ),
          const SizedBox(height: 8),
          Expanded(
            child: ListView(
              children: [
                GestuMenuPrimaryItem(
                  title: 'First Option',
                  prefixIconData: Icons.dashboard,
                  expandedIndicatorRight: true,
                  items: [
                    GestuMenuSecondaryItemWidget(
                      prefixIconData: Icons.bubble_chart,
                      title: 'Menu Item Selected',
                      counter: 1,
                      isSelected: true,
                      index: 1,
                      onTap: (value) {},
                    ),
                    GestuMenuSecondaryItemWidget(
                      prefixIconData: Icons.bar_chart_outlined,
                      title: 'Menu Item',
                      counter: 2,
                      index: 2,
                      onTap: (value) {},
                    ),
                  ],
                ),
                GestuMenuPrimaryItem(
                  title: 'Second Option',
                  prefixIconData: Icons.security_outlined,
                  expandedIndicatorRight: true,
                  items: [
                    GestuMenuSecondaryItemWidget(
                      prefixIconData: Icons.developer_board,
                      title: 'Menu Item',
                      suffixIconData: Icons.check_box,
                      index: 1,
                      onTap: (value) {},
                    ),
                    GestuMenuSecondaryItemWidget(
                      prefixIconData: Icons.developer_mode,
                      title: 'Menu Item',
                      suffixIconData: Icons.check_box_outline_blank,
                      index: 2,
                      onTap: (value) {},
                    ),
                  ],
                ),
                GestuMenuSecondaryItemWidget(
                  isPrimary: true,
                  prefixIconData: Icons.verified_user,
                  title: 'Third Option',
                  index: 2,
                  onTap: (value) {},
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}

更多关于Flutter手势菜单插件gestu_menu的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter手势菜单插件gestu_menu的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用gestu_menu插件的示例代码。gestu_menu是一个用于创建手势菜单的Flutter插件,允许用户通过手势触发菜单项。

首先,确保你已经在pubspec.yaml文件中添加了gestu_menu依赖:

dependencies:
  flutter:
    sdk: flutter
  gestu_menu: ^最新版本号  # 替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个简单的示例代码,展示如何使用gestu_menu插件:

import 'package:flutter/material.dart';
import 'package:gestu_menu/gestu_menu.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Gestu Menu Demo'),
        ),
        body: Center(
          child: GestuMenuExample(),
        ),
      ),
    );
  }
}

class GestuMenuExample extends StatefulWidget {
  @override
  _GestuMenuExampleState createState() => _GestuMenuExampleState();
}

class _GestuMenuExampleState extends State<GestuMenuExample> {
  final List<String> menuItems = ['Item 1', 'Item 2', 'Item 3', 'Item 4'];

  @override
  Widget build(BuildContext context) {
    return Container(
      child: GestuMenu(
        onMenuItemClick: (index) {
          // 菜单项点击事件处理
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(
              content: Text('Clicked: ${menuItems[index]}'),
            ),
          );
        },
        menuItems: menuItems.map((item) => GestureMenuItem(
          title: Text(item),
        )).toList(),
        menuDirection: MenuDirection.rightToLeft, // 菜单展开方向
        menuAngle: 45, // 菜单项之间的角度
        menuRadius: 150, // 菜单半径
        itemSpacing: 20, // 菜单项之间的间距
        itemPadding: EdgeInsets.all(10), // 菜单项内边距
        menuBackgroundColor: Colors.white, // 菜单背景颜色
        itemBackgroundColor: Colors.blue, // 菜单项背景颜色
        itemTitleStyle: TextStyle(color: Colors.white), // 菜单项文字样式
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个MyApp类,它是应用的根widget。
  2. MyApp类中有一个Scaffold,其中包含一个Center widget,Center widget中包含我们的GestuMenuExample widget。
  3. GestuMenuExample是一个StatefulWidget,在其State中,我们定义了菜单项列表menuItems
  4. GestuMenu widget接受多个参数,包括:
    • onMenuItemClick:一个回调函数,当菜单项被点击时调用。
    • menuItems:一个GestureMenuItem列表,每个菜单项都包含一个标题(在这个例子中是文本)。
    • menuDirection:菜单的展开方向。
    • menuAngle:菜单项之间的角度。
    • menuRadius:菜单的半径。
    • itemSpacing:菜单项之间的间距。
    • itemPadding:菜单项的内边距。
    • menuBackgroundColor:菜单的背景颜色。
    • itemBackgroundColor:菜单项的背景颜色。
    • itemTitleStyle:菜单项的文字样式。

运行这个示例代码,你会看到一个居中的手势菜单,当你点击菜单项时,会显示一个SnackBar,显示被点击的菜单项内容。

希望这个示例代码对你有帮助!

回到顶部