Flutter抽屉行为管理插件drawerbehavior的使用

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

Flutter抽屉行为管理插件drawerbehavior的使用

简介

drawerbehavior 是一个Flutter库,提供了额外的抽屉行为功能,如在抽屉滑动时移动视图或缩放视图的高度。该插件支持多种效果,包括缩放、3D效果、右抽屉、带头部和尾部的抽屉等。

Alt Text

安装与配置

1. 添加依赖

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

dependencies:
  drawerbehavior: latest_version

2. 安装包

通过命令行安装包:

$ flutter packages get

或者使用编辑器自带的 flutter packages get 功能。

3. 导入库

在 Dart 文件中导入 drawerbehavior 库:

import 'package:drawerbehavior/drawerbehavior.dart';

示例代码

以下是一个完整的示例,展示了如何使用 drawerbehavior 创建带有缩放效果的抽屉:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Drawer Behavior Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: DrawerScale(),
    );
  }
}

class DrawerScale extends StatefulWidget {
  @override
  _DrawerScaleState createState() => _DrawerScaleState();
}

class _DrawerScaleState extends State<DrawerScale> {
  late int selectedMenuItemId;

  @override
  void initState() {
    selectedMenuItemId = menu.items[0].id;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return DrawerScaffold(
      appBar: AppBar(
          title: Text("Drawer - Scale"),
          actions: [IconButton(icon: Icon(Icons.add), onPressed: () {})]),
      drawers: [
        SideDrawer(
          percentage: 0.6, // 抽屉打开时占据屏幕的比例
          menu: menu, // 菜单项
          direction: Direction.left, // 抽屉方向
          animation: true, // 是否启用动画
          color: Theme.of(context).primaryColor, // 抽屉背景色
          selectedItemId: selectedMenuItemId, // 当前选中的菜单项ID
          onMenuItemSelected: (itemId) {
            setState(() {
              selectedMenuItemId = itemId;
            });
          },
        )
      ],
      builder: (context, id) => IndexedStack(
        index: id,
        children: menu.items
            .map((e) => Center(
                  child: Text("Page~${e.title}"),
                ))
            .toList(),
      ),
    );
  }
}

// 示例菜单数据
final menu = Menu([
  MenuItem(id: 0, title: "Home"),
  MenuItem(id: 1, title: "Settings"),
  MenuItem(id: 2, title: "About"),
]);

迁移指南

Null-safety Release

  • mainDrawer (DrawerScaffold) -> defaultDirection (DrawerScaffold)
    new DrawerScaffold(
      defaultDirection: Direction.right,
      ...
    );
    

其他迁移

  • contentView (Screen) -> builder (ScreenBuilder)
    builder: (context, id) => Center(child: _widget),
    
  • menuView (MenuView) -> drawers (List<SideDrawer>)
    drawers: [
      SideDrawer(
        menu: menu,
        direction: Direction.left,
        ...
      )
    ],
    
  • percentage (DrawerScaffold) -> drawers (List<SideDrawer>)
    DrawerScaffold(
      drawers: [
        SideDrawer(
          percentage: 0.6,
          ...
        )
      ]
      ...
    );
    

自定义选项

DrawerScaffold

DrawerScaffoldController controller;
List<SideDrawer> drawers;
ScreenBuilder builder;
bool enableGestures; // 默认: true
PreferredSizeWidget appBar;
double cornerRadius; // 默认: 16
double backgroundColor; // 默认: Theme.of(context).scaffoldBackgroundColor
Widget floatingActionButton;
Widget bottomNavigationBar;
FloatingActionButtonLocation floatingActionButtonLocation;
FloatingActionButtonAnimator floatingActionButtonAnimator;
List<BoxShadow> contentShadow;
Widget bottomSheet;
bool extendBodyBehindAppBar;
List<Widget> persistentFooterButtons;
bool primary;
bool resizeToAvoidBottomInset;
bool resizeToAvoidBottomPadding;

/// 监听抽屉滑动事件
Function(SideDrawer, double) onSlide;
/// 监听抽屉打开事件
Function(SideDrawer) onOpened;
/// 监听抽屉关闭事件
Function(SideDrawer) onClosed;

SideDrawer

double percentage; // 默认: 0.8
double elevation; // 默认: 4
double cornerRadius;
double degree; // 15-45度
double peekSize; // 56px
Menu menu;
String selectedItemId;
Direction direction;
Duration duration;
Curve curve;
bool animation; // 默认: false
bool slide; // 默认: false
bool peekMenu; // 默认: false
bool hideOnItemPressed; // 默认: true
Function(String) onMenuItemSelected;
Widget headerView;
Widget footerView;
DecorationImage background;
Color color;
Color selectorColor;
TextStyle textStyle;
Alignment alignment;
EdgeInsets padding;
Function(BuildContext, MenuItem, bool) itemBuilder;

MenuItem

String id;
String title;
IconData icon;

更多示例

更多详细的示例代码可以在 GitHub仓库 中找到。

贡献者

感谢以下贡献者的努力:

trademunch
trademunch
anjarnaufals
anjarnaufals
Vladimir Vlach
Vladimir Vlach
Chris Hayen
Chris Hayen

希望以上内容能帮助你更好地理解和使用 drawerbehavior 插件。如果有任何问题或建议,请随时提出!


更多关于Flutter抽屉行为管理插件drawerbehavior的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter抽屉行为管理插件drawerbehavior的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,DrawerBehavior 通常与 Drawer 组件一起使用,用于管理抽屉导航菜单的行为,特别是在响应不同的屏幕尺寸和方向时。虽然 Flutter 的标准库中并没有直接名为 DrawerBehavior 的类,但我们可以通过 Scaffold 组件的 drawer 属性和响应式布局来实现类似的功能。

下面是一个示例,展示了如何使用 Scaffold 组件和 Drawer 来创建一个具有抽屉导航行为的界面。这个示例将包括一个主屏幕和一个可以从左侧滑出的抽屉菜单。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Drawer Behavior Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Drawer Behavior Demo'),
      ),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: <Widget>[
            DrawerHeader(
              child: Text('Drawer Header'),
              decoration: BoxDecoration(
                color: Colors.blue,
              ),
            ),
            ListTile(
              leading: Icon(Icons.home),
              title: Text('Home'),
              onTap: () {
                Navigator.of(context).pop(); // 关闭抽屉
                // 可以在这里添加跳转到首页的逻辑
              },
            ),
            ListTile(
              leading: Icon(Icons.settings),
              title: Text('Settings'),
              onTap: () {
                Navigator.of(context).pop(); // 关闭抽屉
                // 可以在这里添加跳转到设置页的逻辑
              },
            ),
            // 可以添加更多的 ListTile
          ],
        ),
      ),
      body: Center(
        child: Text('Swipe from the left to open the drawer!'),
      ),
    );
  }
}

代码解释:

  1. MaterialApp: 应用的根组件,包含应用的标题和主题。
  2. MyApp: 无状态小部件,作为应用的入口。
  3. MyHomePage: 无状态小部件,包含主要的界面布局。
    • Scaffold: 提供了一个 Material Design 布局结构,包括 appBardrawer
    • AppBar: 应用栏,显示应用的标题。
    • Drawer: 抽屉菜单,包含 DrawerHeader 和多个 ListTile
      • DrawerHeader: 抽屉的头部,可以显示一个标题和一些装饰。
      • ListTile: 列表项,每个列表项都有一个图标和标题,点击时会触发一个回调(在这个例子中,只是关闭抽屉,但你可以添加自己的导航逻辑)。
  4. Center: 居中文本,提示用户从左侧滑动以打开抽屉。

这个示例展示了如何在 Flutter 中实现一个基本的抽屉导航菜单。虽然 Flutter 没有一个名为 DrawerBehavior 的直接类,但你可以通过 ScaffoldDrawer 组件的组合来实现所需的抽屉行为。如果需要更复杂的抽屉行为管理,可以考虑使用第三方库或者扩展现有的组件。

回到顶部