Flutter底部弹出菜单插件bottom_sheet_plus的使用

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

Flutter底部弹出菜单插件bottom_sheet_plus的使用

本文将详细介绍如何在Flutter应用中使用bottom_sheet_plus插件来创建一个底部弹出菜单。bottom_sheet_plus插件提供了丰富的功能,如拖拽支持、阻尼效果等。

开始之前

首先,你需要在项目中引入bottom_sheet_plus插件。在pubspec.yaml文件中添加依赖:

dependencies:
  bottom_sheet_plus: ^x.x.x

然后运行flutter pub get命令以安装该库。

初始化AnimationController

在使用bottom_sheet_plus之前,需要初始化AnimationControllerAnimationController用于控制底部弹出菜单的动画效果。

late AnimationController controller;

[@override](/user/override)
void initState() {
  super.initState();
  controller = AnimationController(
    vsync: this,
    value: 1.0,
    duration: const Duration(milliseconds: 500),
    reverseDuration: const Duration(milliseconds: 500),
  );
}

[@override](/user/override)
void dispose() {
  controller.dispose();
  super.dispose();
}

使用Scaffold的bottomSheet属性

你可以通过ScaffoldbottomSheet属性来添加底部弹出菜单。以下是示例代码:

Scaffold(
  appBar: AppBar(
    elevation: 0.5,
    backgroundColor: Colors.white,
    title: const Text(
      '底部弹出菜单',
      style: TextStyle(fontSize: 17, color: Colors.black),
    ),
  ),
  bottomSheet: BottomSheetViewPlus(
    animationController: controller,
    elevation: 1.0,
    backgroundColor: Colors.deepOrange[200],
    isDragMode: true,
    enableHalf: true,
    isPersistent: true,
    constraints: BoxConstraints(
      maxHeight: MediaQuery.of(context).size.height * 0.75,
      minHeight: 150,
    ),
    onBehaviorChanged: _onBehaviorChanged,
    shape: const RoundedRectangleBorder(
      borderRadius: BorderRadius.only(
        topLeft: Radius.circular(16),
        topRight: Radius.circular(16),
      ),
    ),
    builder: (context) => Container(),
  ),
)

使用Align组件

你也可以通过Align组件来实现同样的效果。以下是示例代码:

Align(
  alignment: Alignment.bottomCenter,
  child: BottomSheetViewPlus(
    animationController: controller,
    elevation: 1.0,
    backgroundColor: Colors.deepOrange[200],
    isDragMode: true,
    enableHalf: true,
    isPersistent: true,
    constraints: BoxConstraints(
      maxHeight: MediaQuery.of(context).size.height * 0.75,
      minHeight: 150,
    ),
    onBehaviorChanged: _onBehaviorChanged,
    shape: const RoundedRectangleBorder(
      borderRadius: BorderRadius.only(
        topLeft: Radius.circular(16),
        topRight: Radius.circular(16),
      ),
    ),
    builder: (context) => Container(),
  ),
)

完整示例

以下是一个完整的示例代码,展示了如何在Flutter应用中使用bottom_sheet_plus插件来创建一个底部弹出菜单。

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

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
  late AnimationController controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    controller = AnimationController(
      vsync: this,
      value: 1.0,
      duration: const Duration(milliseconds: 500),
      reverseDuration: const Duration(milliseconds: 500),
    );
  }

  [@override](/user/override)
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      themeMode: ThemeMode.light,
      home: Scaffold(
        appBar: AppBar(
          elevation: 0.5,
          backgroundColor: Colors.white,
          title: const Text(
            '底部弹出菜单',
            style: TextStyle(fontSize: 17, color: Colors.black),
          ),
        ),
        bottomSheet: BottomSheetViewPlus(
          animationController: controller,
          elevation: 1.0,
          backgroundColor: Colors.deepOrange[200],
          isDragMode: true,
          enableHalf: true,
          isPersistent: true,
          constraints: BoxConstraints(
            maxHeight: MediaQuery.of(context).size.height * 0.75,
            minHeight: 150,
          ),
          onBehaviorChanged: _onBehaviorChanged,
          shape: const RoundedRectangleBorder(
            borderRadius: BorderRadius.only(
              topLeft: Radius.circular(16),
              topRight: Radius.circular(16),
            ),
          ),
          builder: (context) => Container(),
        ),
      ),
    );
  }

  BottomSheetBehavior? behavior = BottomSheetBehavior.EXPANDED;

  /// 状态回调
  void _onBehaviorChanged(BottomSheetBehavior behavior) {
    if (this.behavior == behavior) {
      return;
    }
    setState(() {
      this.behavior = behavior;
    });
  }
}

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

1 回复

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


当然,bottom_sheet_plus 是一个用于 Flutter 的强大插件,它扩展了 Flutter 原生的 BottomSheet 功能,提供了更多的定制选项和易用性。以下是如何在 Flutter 项目中使用 bottom_sheet_plus 的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  bottom_sheet_plus: ^0.x.x  # 请使用最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来是一个简单的示例,展示如何使用 bottom_sheet_plus 来显示一个底部弹出菜单:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  void _showBottomSheet() {
    showBottomSheetPlus<void>(
      context: context,
      builder: (BuildContext context) {
        return Container(
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.vertical(top: Radius.circular(12)),
          ),
          child: Padding(
            padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                ListTile(
                  leading: Icon(Icons.star),
                  title: Text('Option 1'),
                  onTap: () {
                    Navigator.pop(context); // 关闭底部弹出菜单
                    // 执行 Option 1 的逻辑
                  },
                ),
                ListTile(
                  leading: Icon(Icons.favorite),
                  title: Text('Option 2'),
                  onTap: () {
                    Navigator.pop(context); // 关闭底部弹出菜单
                    // 执行 Option 2 的逻辑
                  },
                ),
                ListTile(
                  leading: Icon(Icons.share),
                  title: Text('Option 3'),
                  onTap: () {
                    Navigator.pop(context); // 关闭底部弹出菜单
                    // 执行 Option 3 的逻辑
                  },
                ),
              ],
            ),
          ),
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('BottomSheetPlus Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _showBottomSheet,
          child: Text('Show Bottom Sheet'),
        ),
      ),
    );
  }
}

在这个示例中,我们定义了一个简单的 Flutter 应用,其中包含一个按钮。点击按钮时,会调用 _showBottomSheet 方法,该方法使用 showBottomSheetPlus 函数来显示一个底部弹出菜单。底部弹出菜单包含三个选项,每个选项都是一个 ListTile,点击时会关闭菜单并执行相应的逻辑(虽然在这个示例中只是简单地关闭菜单)。

这个示例展示了 bottom_sheet_plus 的基本用法,你可以根据需要进一步自定义底部弹出菜单的样式和行为。

回到顶部