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来管理底部表单的状态。在定时器触发后,检查控制器是否存在并且未关闭,然后手动关闭底部表单。这样就可以在一秒后关闭底部表单,同时确保在定时器触发时不会重复创建底部表单。

相关推荐
小陈工19 分钟前
Python Web开发入门(十一):RESTful API设计原则与最佳实践——让你的API既优雅又好用
开发语言·前端·人工智能·后端·python·安全·restful
星空22 分钟前
前段--A_2--HTML属性标签
前端·html
执笔画流年呀24 分钟前
7大排序算法
java·算法·排序算法
三万棵雪松37 分钟前
【Linux 物联网网关主控系统-Web部分(一)】
linux·前端·嵌入式linux
摸鱼仙人~1 小时前
增量快照 vs 结构化共享:适用场景全解析
前端·vue.js
zdl6861 小时前
springboot+全局异常处理
java·spring boot·spring
2301_771717211 小时前
Jackson的使用方法详解
java·服务器·前端
A923A1 小时前
【小兔鲜电商前台 | 项目笔记】第八天
前端·vue.js·笔记·项目·小兔鲜
DYuW5gBmH2 小时前
Chrome DevTools MCP 让 AI 无缝接管浏览器调试会话
前端·chrome·chrome devtools
立莹Sir2 小时前
Spring Bean生命周期设计思想与源码深度剖析:从表象到本质的全面升级
java·spring·rpc