Flutter-底部分享弹窗(showModalBottomSheet)

showModalBottomSheet 构造函数的样式

复制代码
Future<T?> showModalBottomSheet<T>({
  required BuildContext context,             // 上下文对象,通常是当前页面的上下文
  bool isScrollControlled = false,           // 控制底部弹窗的大小,如果为 true,则弹窗可以根据内容大小自动调整
  bool isDismissible = true,                 // 是否点击外部区域时可以关闭弹窗
  bool enableDrag = true,                   // 是否允许拖动弹窗来关闭
  double? backgroundColor,                  // 背景颜色
  ShapeBorder? shape,                       // 弹窗的形状(圆角、矩形等)
  Color? barrierColor,                      // 点击外部区域的背景颜色
  required WidgetBuilder builder,           // 弹出框的内容
})

需求描述

当弹窗正在展示的时候,就不会二次展示

可以使用PersistentBottomSheetController,它提供了对底部表单的更细粒度的控制。以下是修改后的代码:

复制代码
import 'package:flutter/material.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> {
  PersistentBottomSheetController bottomSheetController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Popup Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 点击按钮时触发底部表单
            startBottomSheet();
          },
          child: Text('显示底部表单'),
        ),
      ),
    );
  }

  void startBottomSheet() {
    // 如果底部表单已经存在,则不再新建底部表单
    if (bottomSheetController == null || bottomSheetController?.isClosed == true) {
      bottomSheetController = showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Container(
            height: 200.0,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text('底部表单内容'),
                ElevatedButton(
                  onPressed: () {
                    // 关闭底部表单
                    Navigator.of(context).pop();
                  },
                  child: Text('关闭'),
                ),
              ],
            ),
          );
        },
      );

      // 一秒后关闭底部表单
      Future.delayed(Duration(seconds: 1), () {
        // 使用控制器关闭底部表单
        if (bottomSheetController != null && !bottomSheetController.isClosed) {
          bottomSheetController.close();
        }
      });
    }
  }
}

在这个示例中,使用PersistentBottomSheetController来管理底部表单的状态。在定时器触发后,检查控制器是否存在并且未关闭,然后手动关闭底部表单。这样就可以在一秒后关闭底部表单,同时确保在定时器触发时不会重复创建底部表单。

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!5 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里5 天前
java中的继承和多态的区别
java
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕5 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖5 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商