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

1 回复

更多关于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

ExpandedMenuflutter_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. 自定义样式

你可以通过 ExpandedMenustyle 参数来自定义菜单的样式,例如背景颜色、边框、圆角等。

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. 处理展开/折叠事件

你可以通过 onExpandonCollapse 回调来处理菜单展开和折叠的事件。

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');
              },
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部