Flutter侧边菜单插件flutter_side_menu的使用

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

Flutter侧边菜单插件flutter_side_menu的使用

Flutter Side Menu 是一个高度可定制的侧边菜单插件,适用于导航、过滤等功能。本文将介绍如何在Flutter项目中使用 flutter_side_menu 插件。

添加依赖

首先,在你的 pubspec.yaml 文件中添加 flutter_side_menu 依赖:

dependencies:
  flutter:
    sdk: flutter
  # 添加 flutter_side_menu
  flutter_side_menu: ^{latest version}

请确保替换 {latest version} 为实际的最新版本号。

导入包

在你的 Dart 代码中导入 flutter_side_menu 包:

import 'package:flutter_side_menu/flutter_side_menu.dart';

属性说明

以下是 SideMenu 组件的一些常用属性:

属性 类型 默认值 描述
builder SideMenuBuilder null 返回包含头部、尾部、项目或自定义子组件的 SideMenuData
controller SideMenuController null 控制侧边菜单的打开、关闭或切换
mode SideMenuMode SideMenuMode.auto 确定菜单状态(auto, open 或 compact)
position SideMenuPosition SideMenuPosition.left 菜单的位置(左或右)
minWidth double 50.0 最小宽度
maxWidth double 250.0 最大宽度
hasResizer bool true 是否启用调整大小功能
backgroundColor Color Color(0xffffffff) 背景颜色

示例代码

以下是一个完整的示例,展示如何在应用中实现左右两个侧边菜单:

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

void main() => runApp(
      MaterialApp(
        home: Material(
          child: Scaffold(
            body: Row(
              children: [
                // 左侧菜单
                SideMenu(
                  builder: (data) => SideMenuData(
                    header: const Text('Header'),
                    items: [
                      SideMenuItemDataTile(
                        isSelected: true,
                        onTap: () {},
                        title: 'Item 1',
                        icon: const Icon(Icons.home),
                      ),
                    ],
                    footer: const Text('Footer'),
                  ),
                ),
                Expanded(
                  child: Container(
                    color: Colors.white,
                    child: const Center(
                      child: Text(
                        'body',
                      ),
                    ),
                  ),
                ),
                // 右侧菜单
                SideMenu(
                  position: SideMenuPosition.right,
                  builder: (data) => const SideMenuData(
                    customChild: Text('Custom view'),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );

更复杂的示例

下面是一个更复杂的示例,展示了如何使用控制器和更多的自定义选项:

import 'package:flutter/material.dart';
import 'package:flutter_side_menu/flutter_side_menu.dart';
import 'package:badges/badges.dart' as badges;

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _controller = SideMenuController();
  int _currentIndex = 0;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Row(
          children: [
            // 左侧菜单
            SideMenu(
              controller: _controller,
              backgroundColor: Colors.blueGrey,
              mode: SideMenuMode.open,
              builder: (data) {
                return SideMenuData(
                  defaultTileData: SideMenuItemTileDefaults(
                    hoverColor: Colors.black,
                  ),
                  animItems: SideMenuItemsAnimationData(),
                  header: const Text('Header'),
                  items: [
                    const SideMenuItemDataTitle(title: 'Section Header'),
                    SideMenuItemDataTile(
                      isSelected: _currentIndex == 0,
                      onTap: () => setState(() => _currentIndex = 0),
                      title: 'Item 1',
                      hoverColor: Colors.blue,
                      titleStyle: const TextStyle(color: Colors.white),
                      icon: const Icon(Icons.home_outlined),
                      selectedIcon: const Icon(Icons.home),
                      tooltipBuilder: (tile) => Tooltip(
                        message: "Tooltip message",
                        child: tile,
                      ),
                      badgeBuilder: (tile) => badges.Badge(
                        badgeContent: const Center(
                          child: Text(
                            '23',
                            style: TextStyle(
                              fontSize: 8,
                              color: Colors.white,
                            ),
                          ),
                        ),
                        position: badges.BadgePosition.custom(
                          end: 12.0,
                          bottom: 0.0,
                          top: 0.0,
                        ),
                        child: tile,
                      ),
                    ),
                    SideMenuItemDataTile(
                      isSelected: _currentIndex == 1,
                      onTap: () => setState(() => _currentIndex = 1),
                      title: 'Item 2',
                      selectedTitleStyle: const TextStyle(
                          fontWeight: FontWeight.w700, color: Colors.yellow),
                      icon: const Icon(Icons.table_bar_outlined),
                      selectedIcon: const Icon(Icons.table_bar),
                      titleStyle: const TextStyle(color: Colors.deepPurpleAccent),
                    ),
                    const SideMenuItemDataTitle(
                      title: 'Account',
                      textAlign: TextAlign.center,
                    ),
                    SideMenuItemDataTile(
                      isSelected: _currentIndex == 2,
                      onTap: () => setState(() => _currentIndex = 2),
                      title: 'Item 3',
                      icon: const Icon(Icons.play_arrow),
                    ),
                    SideMenuItemDataTile(
                      isSelected: _currentIndex == 3,
                      onTap: () => setState(() => _currentIndex = 3),
                      title: 'Item 4',
                      icon: const Icon(Icons.car_crash),
                    ),
                  ],
                  footer: const Text('Footer'),
                );
              },
            ),
            Expanded(
              child: Container(
                color: Colors.white,
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(
                      'body',
                      style: Theme.of(context).textTheme.displaySmall,
                    ),
                    ElevatedButton(
                      onPressed: () {
                        _controller.toggle();
                      },
                      child: const Text('change side menu state'),
                    )
                  ],
                ),
              ),
            ),
            // 右侧菜单
            SideMenu(
              position: SideMenuPosition.right,
              builder: (data) => const SideMenuData(
                customChild: Text('custom view'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

以上代码展示了如何使用 flutter_side_menu 创建一个带有左右侧边栏的应用,并且可以通过点击按钮来控制侧边栏的状态。希望这些信息对你有所帮助!


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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用flutter_side_menu插件的示例代码。这个插件允许你轻松地在应用中实现侧边菜单功能。

首先,你需要在你的pubspec.yaml文件中添加flutter_side_menu依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_side_menu: ^x.y.z  # 请替换为最新版本号

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

接下来,你可以按照以下步骤在你的Flutter应用中实现侧边菜单:

主应用代码

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Side Menu Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SideMenuScreen(),
    );
  }
}

class SideMenuScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Side Menu'),
      ),
      body: FlutterSideMenu(
        // 设置侧边菜单的打开和关闭动画
        animationDuration: const Duration(milliseconds: 200),
        // 设置侧边菜单的宽度
        menuWidth: MediaQuery.of(context).size.width * 0.8,
        // 设置侧边菜单的背景颜色
        backgroundColor: Colors.white,
        // 设置侧边菜单的阴影
        decoration: BoxDecoration(
          color: Colors.white,
          boxShadow: [
            BoxShadow(
              color: Colors.grey.withOpacity(0.5),
              spreadRadius: 5,
              blurRadius: 7,
              offset: Offset(0, 3), // changes position of shadow
            ),
          ],
        ),
        // 侧边菜单项
        menu: Container(
          child: ListView(
            // 添加菜单项
            children: <Widget>[
              ListTile(
                leading: Icon(Icons.home),
                title: Text('Home'),
                onTap: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => HomeScreen()),
                  );
                },
              ),
              ListTile(
                leading: Icon(Icons.settings),
                title: Text('Settings'),
                onTap: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => SettingsScreen()),
                  );
                },
              ),
              // 可以添加更多菜单项
            ],
          ),
        ),
        // 主内容
        header: Container(
          decoration: BoxDecoration(
            color: Colors.blue,
          ),
          child: Center(
            child: Text(
              'Main Content',
              style: TextStyle(color: Colors.white),
            ),
          ),
        ),
        // 主内容页面
        body: Center(
          child: Text('Welcome to Flutter Side Menu'),
        ),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: Text('You are on Home Screen'),
      ),
    );
  }
}

class SettingsScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Settings Screen'),
      ),
      body: Center(
        child: Text('You are on Settings Screen'),
      ),
    );
  }
}

解释

  1. 依赖安装:在pubspec.yaml文件中添加flutter_side_menu依赖。
  2. 主应用结构MyApp是一个无状态小部件,它设置了应用的主题并指定了主屏幕为SideMenuScreen
  3. 侧边菜单屏幕SideMenuScreen使用了FlutterSideMenu小部件来创建侧边菜单。
    • animationDuration:侧边菜单打开和关闭的动画时长。
    • menuWidth:侧边菜单的宽度。
    • backgroundColordecoration:侧边菜单的背景颜色和装饰。
    • menu:侧边菜单项,这里使用了ListView来创建多个ListTile菜单项。
    • headerbody:主内容区域,这里header只是一个装饰性的容器,而body显示了欢迎文本。
  4. 菜单项点击事件:每个ListTile都有一个onTap事件,点击后会导航到不同的屏幕(HomeScreenSettingsScreen)。
  5. 其他屏幕HomeScreenSettingsScreen是简单的无状态小部件,分别显示不同的文本。

这个示例展示了如何使用flutter_side_menu插件在Flutter应用中实现一个基本的侧边菜单功能。你可以根据自己的需求进一步定制和扩展这个示例。

回到顶部