Flutter可扩展模态底部表单插件extendable_modal_sheet的使用

Flutter可扩展模态底部表单插件extendable_modal_sheet的使用

特性

ExtendableModalSheet 是一个高度可定制且可扩展的模态底部表单小部件。它旨在高效处理长列表视图和大内容,并提供了诸如根据滚动位置调整圆角半径、背景模糊、吸附行为等动态属性。

  • 自定义大小:控制模态底部表单的初始、最小和最大大小。
  • 圆角:根据滚动位置自动调整圆角半径。
  • 背景模糊:在背景上应用模糊或其他图像过滤效果。
  • 吸附行为:启用吸附到预定义大小的功能。
  • 可取消:允许用户取消模态底部表单。
  • 填充和背景颜色:自定义内容填充和背景颜色。
  • 高效的列表处理:优化了处理大型列表和内容的方式。

平滑滚动

自定义滚动属性以创建所需的模态底部表单。

平滑滚动体验

属性

  • mainWidget:模态底部表单的主要内容。
  • bottomWidget:可选的底部小部件,用于显示在模态底部表单的底部。
  • initialChildSize:模态底部表单相对于父容器的初始大小(默认值:0.5)。
  • minChildSize:模态底部表单相对于父容器的最小大小(默认值:0.25)。
  • maxChildSize:模态底部表单相对于父容器的最大大小(默认值:1.0)。
  • turningRadiusPoint:圆角半径变化的点(默认值:80)。
  • cornersRadius:模态底部表单的圆角半径(默认值:24)。
  • radiusChangeAnimationDuration:模态底部表单半径变化的持续时间(默认值:350毫秒)。
  • contentPadding:模态底部表单内部内容的填充(默认值:EdgeInsets.zero)。
  • backdropFilter:可选的背景模糊效果(默认值:ImageFilter.blur(sigmaX: 6, sigmaY: 6))。
  • dismissible:模态底部表单是否可以被用户取消(默认值:true)。
  • blendMode:背景模糊效果使用的混合模式(默认值:BlendMode.srcOver)。
  • snap:模态底部表单是否应该吸附到预定义大小(默认值:false)。
  • snapAnimationDuration:吸附动画的持续时间(默认值:null)。
  • snapSizes:吸附到的大小列表(默认值:null)。
  • shouldCloseOnMinExtent:当达到最小范围时是否关闭模态底部表单(默认值:true)。
  • backgroundColor:模态底部表单的背景颜色(默认值:Colors.white)。

使用方法

在您的Dart文件中导入该包:

import 'package:extendable_modal_sheet/extendable_modal_sheet.dart';

使用 ExtendableModalSheet 小部件:

showModalBottomSheet(
  context: context,
  builder: (context) => ExtendableModalSheet(
    mainWidget: YourMainWidget(),
    bottomWidget: YourBottomWidget(), // 可选
    initialChildSize: 0.5,
    minChildSize: 0.25,
    maxChildSize: 1.0,
    turningRadiusPoint: 80,
    cornersRadius: 24,
    contentPadding: EdgeInsets.zero,
    backdropFilter: ImageFilter.blur(sigmaX: 6, sigmaY: 6),
    dismissible: true,
    blendMode: BlendMode.srcOver,
    snap: true,
    snapAnimationDuration: Duration(milliseconds: 200),
    snapSizes: [0.25, 0.5, 0.75, 1.0],
    shouldCloseOnMinExtent: true,
    backgroundColor: Colors.white,
  ),
);

完整示例代码

以下是一个完整的示例代码,展示了如何使用 ExtendableModalSheet 插件。

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Extendable Modal Sheet'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  void _showDialog() async {
    await showModalBottomSheet(
        isDismissible: true,
        context: context,
        isScrollControlled: true,
        backgroundColor: Colors.transparent,
        useRootNavigator: true,
        builder: (ctx) => const MyModal());
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _showDialog,
        tooltip: 'showDialog',
        child: const Icon(Icons.add),
      ), // 这个逗号使自动格式化更美观
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) => ExtendableModalSheet(
        backgroundColor: Colors.grey.shade100,
        mainWidget: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: List.generate(
                20,
                (index) => (index == 0)
                    ? Container(
                        width: double.infinity,
                        height: 64,
                        margin: const EdgeInsets.all(8),
                        decoration: BoxDecoration(
                            color: Colors.black87,
                            borderRadius: BorderRadius.circular(12)),
                        child: const Center(
                          child: Text(
                            '!! Enjoy using This dialog !!',
                            style: TextStyle(color: Colors.white),
                          ),
                        ),
                      )
                    : Container(
                        width: double.infinity,
                        height: 64,
                        margin: const EdgeInsets.all(8),
                        decoration: BoxDecoration(
                            color: Colors.blueAccent.shade400,
                            borderRadius: BorderRadius.circular(12)),
                      )),
          ),
        ),
        bottomWidget: Padding(
          padding: const EdgeInsets.all(16.0),
          child: ElevatedButton(
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.black87),
              ),
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: const Text(
                'dismiss',
                style: TextStyle(fontSize: 24, color: Colors.white),
              )),
        ),
      );
}

更多关于Flutter可扩展模态底部表单插件extendable_modal_sheet的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可扩展模态底部表单插件extendable_modal_sheet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用extendable_modal_sheet插件的示例代码。这个插件允许你创建一个可扩展的模态底部表单,这在需要动态显示更多信息时非常有用。

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

dependencies:
  flutter:
    sdk: flutter
  extendable_modal_sheet: ^latest_version  # 请替换为最新的版本号

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

接下来,在你的Dart文件中,你可以按照以下方式使用ExtendableModalSheet

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Extendable Modal Sheet Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              showModalBottomSheet(
                context: context,
                builder: (context) => ExtendableModalSheet(
                  expandedHeight: 300,  // 扩展后的高度
                  header: Center(child: Text('Header')),
                  builder: (context, isExpanded) {
                    return Container(
                      padding: EdgeInsets.all(16.0),
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                          Text('This is the content of the modal sheet.'),
                          SizedBox(height: 20),
                          ElevatedButton(
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                            child: Text('Close'),
                          ),
                          if (isExpanded)
                            Column(
                              children: <Widget>[
                                SizedBox(height: 20),
                                Text('This is additional content when expanded.'),
                                SizedBox(height: 20),
                                ElevatedButton(
                                  onPressed: () {
                                    // 可以在这里添加点击事件,比如收缩表单
                                    ExtendableModalSheet.of(context).collapse();
                                  },
                                  child: Text('Collapse'),
                                ),
                              ],
                            ),
                        ],
                      ),
                    );
                  },
                ),
              );
            },
            child: Text('Show Modal Sheet'),
          ),
        ),
      ),
    );
  }
}

代码解释

  1. 依赖项:在pubspec.yaml中添加extendable_modal_sheet依赖项。
  2. 主应用:创建一个简单的Flutter应用,包含一个按钮,点击按钮时会显示模态底部表单。
  3. showModalBottomSheet:使用showModalBottomSheet来显示模态表单。
  4. ExtendableModalSheet
    • expandedHeight:定义表单扩展后的高度。
    • header:定义表单的头部。
    • builder:一个函数,返回表单的内容。这个函数接收两个参数:BuildContextbool isExpandedisExpanded表示表单是否处于扩展状态。
  5. 内容:在表单内容中,我们添加了一个文本和一个关闭按钮。如果表单处于扩展状态(isExpandedtrue),我们还添加了一些额外的内容和收缩按钮。

这样,你就可以在Flutter应用中创建一个可扩展的模态底部表单了。希望这个示例对你有所帮助!

回到顶部