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

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

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

just_bottom_sheet 是一个功能强大的Flutter插件,它允许开发者轻松实现带有嵌套滚动和滑动关闭手势的底部弹出菜单。以下是该插件的主要特性和使用方法。

主要特性

  • 高度可定制化
  • 支持通过拖动手柄或拖动手柄与滚动关闭
  • 支持任何滚动内容,包括Slivers
  • 更多功能即将推出

使用方法

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  just_bottom_sheet: ^latest_version

记得替换 ^latest_version 为最新版本号。

2. 示例代码

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

import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:just_bottom_sheet/drag_zone_position.dart';
import 'package:just_bottom_sheet/just_bottom_sheet.dart';
import 'package:just_bottom_sheet/just_bottom_sheet_configuration.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'JustBottomSheet Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        backgroundColor: Colors.white,
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
      ),
      home: const MyHomePage(title: 'JustBottomSheet Example'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final scrollController = ScrollController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Image.asset("assets/images/flutter.png"),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          showJustBottomSheet(
            context: context,
            dragZoneConfiguration: JustBottomSheetDragZoneConfiguration(
              dragZonePosition: DragZonePosition.outside,
              child: ClipRRect(
                borderRadius: BorderRadius.circular(4),
                child: Container(
                  height: 4,
                  width: 30,
                  color: Theme.of(context).brightness == Brightness.light
                      ? Colors.grey[300]
                      : Colors.white,
                ),
              ),
            ),
            configuration: JustBottomSheetPageConfiguration(
              height: MediaQuery.of(context).size.height,
              builder: (context) {
                return ListView.builder(
                  padding: EdgeInsets.zero,
                  controller: scrollController,
                  itemBuilder: (context, row) {
                    if (row == 5) {
                      return const _NestedPageView();
                    }
                    return Material(
                      color: Colors.transparent,
                      child: ListTile(
                        title: Text("Row #$row"),
                      ),
                    );
                  },
                  itemCount: 25,
                );
              },
              scrollController: scrollController,
              closeOnScroll: true,
              cornerRadius: 16,
              backgroundColor: Theme.of(context).canvasColor.withOpacity(0.5),
              backgroundImageFilter: ImageFilter.blur(
                sigmaX: 30,
                sigmaY: 30,
              ),
            ),
          );
        },
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

  [@override](/user/override)
  State<_NestedPageView> createState() => _NestedPageViewState();
}

class _NestedPageViewState extends State<_NestedPageView> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Material(
      child: SizedBox(
        height: 300,
        child: PageView(
          children: [
            Container(
              width: 300,
              color: Colors.green,
              child: const Center(
                child: Text("green"),
              ),
            ),
            Container(
              width: 300,
              color: Colors.red,
              child: const Center(
                child: Text("red"),
              ),
            ),
            Container(
              width: 300,
              color: Colors.orange,
              child: const Center(
                child: Text("orange"),
              ),
            ),
            Container(
              width: 300,
              color: Colors.amber,
              child: const Center(
                child: Text("amber"),
              ),
            ),
            Container(
              width: 300,
              color: Colors.cyan,
              child: const Center(
                child: Text("cyan"),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用just_bottom_sheet插件来创建底部弹出菜单的示例代码。

首先,确保你已经在pubspec.yaml文件中添加了just_bottom_sheet依赖:

dependencies:
  flutter:
    sdk: flutter
  just_bottom_sheet: ^3.0.0 # 请检查最新版本号

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

接下来,你可以在你的Flutter项目中按如下方式使用just_bottom_sheet插件:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Just Bottom Sheet Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () => _showBottomSheet(context),
          child: Text('Show Bottom Sheet'),
        ),
      ),
    );
  }

  void _showBottomSheet(BuildContext context) {
    showCupertinoBottomSheet<void>(
      context: context,
      builder: (BuildContext context) {
        return Container(
          height: 200,
          color: Colors.white,
          child: JustBottomSheet(
            builder: (BuildContext context) {
              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                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.settings),
                    title: Text('Option 3'),
                    onTap: () {
                      Navigator.pop(context, 'Option 3');
                    },
                  ),
                ],
              );
            },
            backgroundColor: Colors.white,
            elevation: 8,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(12),
            ),
          ),
        );
      },
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,包含一个按钮,点击按钮时会弹出一个底部菜单。底部菜单使用了just_bottom_sheet插件,并包含了三个选项。每个选项点击后会关闭底部菜单,并返回相应的选项值(虽然在这个示例中我们没有处理返回的值,但在实际应用中你可以根据需要处理这些返回值)。

注意:showCupertinoBottomSheet用于iOS风格的底部弹出菜单。如果你想要一个更Material Design风格的底部菜单,可以使用showModalBottomSheet,但just_bottom_sheet的设计主要是为了增强和自定义iOS风格的底部菜单。

希望这个示例能帮助你理解如何在Flutter项目中使用just_bottom_sheet插件!

回到顶部