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

相关推荐
猿究院_夏燊17 分钟前
Spring Bean 生命周期
java·后端·spring
Wang's Blog42 分钟前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
信誓旦旦的程序猿1 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河1 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
Jlzn88881 小时前
华东电芯分选通道数怎么配才不堵线
java·人工智能·架构·自动化·制造
香吧香2 小时前
GRPC连接机制---长连接分析
java·网络与传输协议
我是人✓2 小时前
SpringBoot项目的五种创建方式
java·spring boot·后端
原则猫2 小时前
UDP 到底怎么实现可靠的
前端
Java后端的Ai之路2 小时前
14、ReactJS - 路由(Router)
前端·react.js·状态模式
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 阿里云 OSS 入门案例:从创建 Bucket 到上传拿到可访问 URL
java·阿里云·交友