Flutter多底部弹窗管理插件multiple_bottom_sheets的使用

Flutter多底部弹窗管理插件multiple_bottom_sheets的使用

特性

multiple_bottom_sheets 是一个小型库,允许您创建带有底部弹窗的多标签页。

  • 自定义折叠与展开的App Bar
  • 可定制数量的底部弹窗

开始使用

安装

在您的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  multiple_bottom_sheets: <last_version>

然后运行 flutter pub get 来安装。


使用示例

以下是一个完整的示例代码,展示如何使用 multiple_bottom_sheets 创建多底部弹窗。

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(
      theme: ThemeData(
        colorScheme: ColorScheme.fromSwatch().copyWith(secondary: Colors.grey),
      ),
      debugShowCheckedModeBanner: false,
      home: const Home(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: CardsHost(
        appBar: CollapsableAppBar(
          expanded: Image(
            image: const AssetImage('assets/pic.jpg'), // 替换为您的图片路径
            fit: BoxFit.fitWidth,
            width: double.infinity,
            alignment: Alignment.center,
          ),
          collapsed: Center(
            child: Text(
              'collapsed',
              style: TextStyle(color: Colors.white, fontSize: 16),
            ),
          ),
        ),
        children: [
          HostedCardChild(
            decoration: cardDecor,
            child: Column(
              children: const [
                CardHeader("one", color: Colors.red),
                CardBody(),
              ],
            ),
          ),
          HostedCardChild(
            decoration: cardDecor,
            child: Column(
              children: const [
                CardHeader("two", color: Colors.green),
                CardBody(),
              ],
            ),
          ),
          HostedCardChild(
            decoration: cardDecor,
            child: Column(
              children: const [
                CardHeader("three", color: Colors.blue),
                CardBody(),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

// 卡片装饰
Decoration cardDecor = BoxDecoration(
  color: Colors.white,
  borderRadius: const BorderRadius.only(
    topLeft: Radius.circular(16),
    topRight: Radius.circular(16),
  ),
  boxShadow: [
    BoxShadow(
      color: Colors.grey.withOpacity(0.5),
      spreadRadius: 5,
      blurRadius: 7,
      offset: const Offset(0, 3), // 阴影位置调整
    ),
  ],
);

// 卡片头部
class CardHeader extends StatelessWidget {
  final String text;
  final Color color;

  const CardHeader(this.text, {Key? key, required this.color}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    const ts = TextStyle(
      fontSize: 11,
      fontWeight: FontWeight.w600,
    );

    return Container(
      width: double.infinity,
      padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 18),
      child: Text(
        text,
        style: ts.copyWith(color: color),
      ),
    );
  }
}

// 卡片主体内容
class CardBody extends StatelessWidget {
  const CardBody({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        for (int i = 0; i < 20; i++) const ScrollChild(),
      ],
    );
  }
}

// 滚动子项
class ScrollChild extends StatelessWidget {
  const ScrollChild({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.only(top: 8, bottom: 8, left: 8, right: 8),
      decoration: const ShapeDecoration(
        color: Colors.black12,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.all(Radius.circular(8)),
        ),
      ),
      child: const SizedBox(height: 40, width: double.infinity),
    );
  }
}
1 回复

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


multiple_bottom_sheets 是一个 Flutter 插件,用于管理多个底部弹窗(Bottom Sheets)。它允许你在应用中同时显示多个底部弹窗,并且可以轻松地管理它们的堆叠和关闭。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  multiple_bottom_sheets: ^1.0.0  # 请使用最新版本

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

基本用法

  1. 导入插件

    在你的 Dart 文件中导入 multiple_bottom_sheets 插件:

    import 'package:multiple_bottom_sheets/multiple_bottom_sheets.dart';
  2. 初始化 MultipleBottomSheets

    在你的 MaterialAppCupertinoApp 中,使用 MultipleBottomSheets 包裹你的应用内容:

    class MyApp extends StatelessWidget {
      [@override](/user/override)
      Widget build(BuildContext context) {
        return MaterialApp(
          home: MultipleBottomSheets(
            child: HomeScreen(),
          ),
        );
      }
    }
  3. 显示底部弹窗

    使用 MultipleBottomSheets.of(context).showBottomSheet 方法来显示底部弹窗:

    void showMyBottomSheet(BuildContext context) {
      MultipleBottomSheets.of(context).showBottomSheet(
        builder: (context) {
          return Container(
            height: 200,
            color: Colors.white,
            child: Center(
              child: Text('This is a bottom sheet'),
            ),
          );
        },
      );
    }
  4. 关闭底部弹窗

    你可以使用 MultipleBottomSheets.of(context).closeBottomSheet 方法来关闭当前显示的底部弹窗:

    void closeMyBottomSheet(BuildContext context) {
      MultipleBottomSheets.of(context).closeBottomSheet();
    }
  5. 管理多个底部弹窗

    multiple_bottom_sheets 插件允许你同时显示多个底部弹窗,并且可以通过 closeAllBottomSheets 方法关闭所有底部弹窗:

    void closeAllBottomSheets(BuildContext context) {
      MultipleBottomSheets.of(context).closeAllBottomSheets();
    }

示例代码

以下是一个完整的示例,展示了如何使用 multiple_bottom_sheets 插件来显示和管理多个底部弹窗:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MultipleBottomSheets(
        child: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Multiple Bottom Sheets Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () => showMyBottomSheet(context),
              child: Text('Show Bottom Sheet 1'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => showMyBottomSheet2(context),
              child: Text('Show Bottom Sheet 2'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => closeAllBottomSheets(context),
              child: Text('Close All Bottom Sheets'),
            ),
          ],
        ),
      ),
    );
  }

  void showMyBottomSheet(BuildContext context) {
    MultipleBottomSheets.of(context).showBottomSheet(
      builder: (context) {
        return Container(
          height: 200,
          color: Colors.white,
          child: Center(
            child: Text('This is Bottom Sheet 1'),
          ),
        );
      },
    );
  }

  void showMyBottomSheet2(BuildContext context) {
    MultipleBottomSheets.of(context).showBottomSheet(
      builder: (context) {
        return Container(
          height: 200,
          color: Colors.white,
          child: Center(
            child: Text('This is Bottom Sheet 2'),
          ),
        );
      },
    );
  }

  void closeAllBottomSheets(BuildContext context) {
    MultipleBottomSheets.of(context).closeAllBottomSheets();
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!