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

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

在本教程中,我们将学习如何使用perfect_bottom_sheet插件在Flutter应用中实现一个底部弹出菜单。perfect_bottom_sheet是一个功能强大的库,可以用来创建可自定义高度的底部弹出菜单。

安装插件

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

dependencies:
  perfect_bottom_sheet: ^版本号

然后运行以下命令以获取依赖:

flutter pub get

创建基本的底部弹出菜单

我们将在主页面上添加一个按钮,点击该按钮时会弹出一个底部菜单。底部菜单将包含一个列表视图。

示例代码

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  var expandable = true;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'Press the plus button to open bottom sheet',
            ),
            GestureDetector(
              onTap: () {
                setState(() {
                  expandable = !expandable;
                });
                print(expandable);
              },
              child: Container(
                color: Colors.black12,
                child: Text(
                  'Expandable $expandable',
                  style: Theme.of(context).textTheme.headlineMedium,
                ),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(
            PerfectBottomSheetRoute(
              expandable: expandable,
              backgroundColor: Colors.transparent,
              builder: (context, _) {
                return Material(
                  color: Colors.white,
                  child: ListView(
                    padding: EdgeInsets.only(
                      bottom: MediaQuery.of(context).padding.bottom,
                      top: 20,
                    ),
                    controller: _,
                    children: List.generate(
                      500,
                      (index) => Text("$index"),
                    ),
                  ),
                );
              },
            ),
          );
        },
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

代码解释

  1. 导入必要的包

    import 'package:flutter/material.dart';
    import 'package:perfect_bottom_sheet/perfect_bottom_sheet.dart';
    
  2. 主应用入口

    void main() {
      runApp(const MyApp());
    }
    
  3. 定义主应用类

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
            useMaterial3: true,
          ),
          home: const MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
  4. 定义主页面类

    class MyHomePage extends StatefulWidget {
      const MyHomePage({super.key, required this.title});
    
      final String title;
    
      @override
      State<MyHomePage> createState() => _MyHomePageState();
    }
    
  5. 定义主页面状态类

    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
      var expandable = true;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            backgroundColor: Theme.of(context).colorScheme.inversePrimary,
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                const Text(
                  'Press the plus button to open bottom sheet',
                ),
                GestureDetector(
                  onTap: () {
                    setState(() {
                      expandable = !expandable;
                    });
                    print(expandable);
                  },
                  child: Container(
                    color: Colors.black12,
                    child: Text(
                      'Expandable $expandable',
                      style: Theme.of(context).textTheme.headlineMedium,
                    ),
                  ),
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              Navigator.of(context).push(
                PerfectBottomSheetRoute(
                  expandable: expandable,
                  backgroundColor: Colors.transparent,
                  builder: (context, _) {
                    return Material(
                      color: Colors.white,
                      child: ListView(
                        padding: EdgeInsets.only(
                          bottom: MediaQuery.of(context).padding.bottom,
                          top: 20,
                        ),
                        controller: _,
                        children: List.generate(
                          500,
                          (index) => Text("$index"),
                        ),
                      ),
                    );
                  },
                ),
              );
            },
            tooltip: 'Increment',
            child: const Icon(Icons.add),
          ),
        );
      }
    }
    

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

1 回复

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


perfect_bottom_sheet 是一个用于 Flutter 的插件,它可以帮助你轻松地创建一个底部弹出菜单。这个插件提供了多种自定义选项,使得你可以根据自己的需求来定制底部弹出菜单的外观和行为。

安装

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

dependencies:
  flutter:
    sdk: flutter
  perfect_bottom_sheet: ^1.0.0  # 请检查最新版本

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

基本用法

以下是一个简单的示例,展示了如何使用 perfect_bottom_sheet 来创建一个底部弹出菜单:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Perfect Bottom Sheet Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              PerfectBottomSheet.show(
                context,
                builder: (BuildContext context) {
                  return Container(
                    height: 200,
                    padding: EdgeInsets.all(16),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Text('This is a bottom sheet'),
                        SizedBox(height: 20),
                        ElevatedButton(
                          onPressed: () {
                            Navigator.pop(context);
                          },
                          child: Text('Close'),
                        ),
                      ],
                    ),
                  );
                },
              );
            },
            child: Text('Show Bottom Sheet'),
          ),
        ),
      ),
    );
  }
}

参数说明

PerfectBottomSheet.show 方法接受以下参数:

  • context: 当前的 BuildContext
  • builder: 一个返回 Widget 的函数,用于构建底部弹出菜单的内容。
  • enableDrag: 是否允许用户通过拖动来关闭底部弹出菜单,默认为 true
  • isDismissible: 是否允许用户通过点击外部来关闭底部弹出菜单,默认为 true
  • backgroundColor: 底部弹出菜单的背景颜色,默认为 Colors.white
  • elevation: 底部弹出菜单的阴影高度,默认为 0.0
  • shape: 底部弹出菜单的形状,默认为 null
  • clipBehavior: 底部弹出菜单的裁剪行为,默认为 Clip.none

高级用法

你可以通过传递不同的参数来自定义底部弹出菜单的外观和行为。例如,你可以设置 shape 来改变底部弹出菜单的形状,或者设置 backgroundColor 来改变背景颜色。

PerfectBottomSheet.show(
  context,
  builder: (BuildContext context) {
    return Container(
      height: 200,
      padding: EdgeInsets.all(16),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('This is a custom bottom sheet'),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              Navigator.pop(context);
            },
            child: Text('Close'),
          ),
        ],
      ),
    );
  },
  enableDrag: false,
  isDismissible: false,
  backgroundColor: Colors.blue,
  elevation: 10.0,
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
  ),
);
回到顶部