flutter 自定义弹窗封装弹窗----在弹窗内实现部分窗体生命周期

小部件组件
可以在里面加装其他事件如HTTP接口访问

import 'package:flutter/material.dart';

///执行弹窗动画封装
class ExecutionDialog extends StatefulWidget {
  // final String? title;
  // final String? message;
  // final Function? onExecute;
  //
  // const ExecutionDialog({super.key, this.title, this.message, this.onExecute});

  const ExecutionDialog({
    super.key,
  });

  
  _ExecutionDialogState createState() => _ExecutionDialogState();
}

//封装执行动画 完整的自我生命周期
class _ExecutionDialogState extends State<ExecutionDialog> {
  ///固定预制参数
  Map<int, Widget> stateToWidgetMap = {
    0: Container(
      width: 65.0, // 设置容器的宽度
      height: 65.0, // 设置容器的高度
      child: const CircularProgressIndicator(
        strokeWidth: 5.0, // 设置进度圈的线宽
        valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
      ),
    ),
    1: const Image(
      image: AssetImage('assets/ic_timeout.png'),
      width: 65,
    ),
    2: const Image(
      image: AssetImage('assets/ic_sucess.png'),
      width: 65,
    ),
    3: const Image(
      image: AssetImage('assets/ic_failed.png'),
      width: 65,
    ),
    // 添加更多状态和对应的Widget
  };

  var strlist = ["执行中..", "执行超时", "指令成功", "执行错误"];

  List<Color> listcolor=[Colors.blue,Colors.yellow[700]!,Colors.blue,Colors.red[700]!];

  ///bool _isExecuting = false;
  int ixx = 0;

  void _incrementCounter() {
    // setState(() {
    //
    // });
    ixx++;
    if (ixx == strlist.length) {
      ixx = 0;
    }
    // else if (ixx == 2) {
    //   Future.delayed(Duration(milliseconds: 500)).then((_) {
    //     _incrementCounter();
    //     Navigator.pop(context);
    //   });
    // }
    setState(() {});
  }

  void _incrementCounter2() {
    // 模拟加载过程,这里使用Future.delayed
    Future.delayed(Duration(seconds: 2)).then((_) {
      _incrementCounter();

      ///(context as Element).markNeedsBuild();
      //ixx++;

      //setState(() {});
      // 加载完成后关闭弹窗
      // Navigator.pop(context);
    });

    // 模拟加载过程,这里使用Future.delayed
    Future.delayed(Duration(seconds: 4)).then((_) {
      _incrementCounter();
    });

    // 模拟加载过程,这里使用Future.delayed
    Future.delayed(Duration(seconds: 6)).then((_) {
      _incrementCounter();
    });
    Future.delayed(Duration(seconds: 8)).then((_) {
      _incrementCounter();
    });
    Future.delayed(Duration(seconds: 11)).then((_) {
      _incrementCounter();
      Navigator.pop(context);
    });
  }

  
  void initState() {
    super.initState();

    ///模拟定时器
    _incrementCounter2();
  }

  
  Widget build(BuildContext context) {
    return AlertDialog(
      content: SizedBox(
        height: 160,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center, // 水平居中
          mainAxisAlignment: MainAxisAlignment.center, // 垂直居中
          children: [
            /* const Text(
              '提示',
              style: TextStyle(
                fontSize: 16,
                color: Colors.black,
              ),
            ),

            ///分割线条
            Container(
              height: 2, // 线条的高度
              color: Colors.black, // 线条的颜色
              width: double.infinity, // 线条的宽度,尽可能宽
              margin:
                  EdgeInsets.symmetric(horizontal: 40, vertical: 20), // 左右边距
            ),*/

            stateToWidgetMap[ixx] ?? const Text('未知状态'),


            // CircularProgressIndicator(),
          ],
        ),
      ),
      actions: <Widget>[
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              strlist[ixx],
              style: TextStyle(
                fontSize: 16,
                color: listcolor[ixx] ?? Colors.black,//
                fontWeight: FontWeight.bold,
              ),
            ),
          ],
        )
      ],
    );
  }

  
  void dispose() {
    stateToWidgetMap.clear();
    strlist.clear();
    listcolor.clear();
    ///回收界面
    super.dispose();
  }
}

使用 ----以弹窗形式

  void _showDialog2() {
    showDialog(
      context: context,
      //点击背景不消失
      barrierDismissible: false,
      builder: (BuildContext context) {
        // 使用StatefulBuilder来局部管理Dialog中的状态
        return const ExecutionDialog();
      },
    );
  }

///点击触发弹窗
ElevatedButton(
              onPressed: _showDialog2,
              child: Text('Show Dialog'),
            ),



  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 Flutter 代码示例,实现一个自定义弹窗: ```dart import 'package:flutter/material.dart'; class MyDialog extends StatelessWidget { final String title; final String message; final VoidCallback onConfirm; MyDialog({ @required this.title, @required this.message, @required this.onConfirm, }); @override Widget build(BuildContext context) { return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: Column( mainAxisSize: MainAxisSize.min, children: <Widget>[ Padding( padding: EdgeInsets.all(16), child: Text( title, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 20, ), ), ), Padding( padding: EdgeInsets.symmetric(horizontal: 16), child: Text( message, textAlign: TextAlign.center, style: TextStyle(fontSize: 16), ), ), SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ FlatButton( child: Text('取消'), onPressed: () { Navigator.of(context).pop(); }, ), SizedBox(width: 16), RaisedButton( child: Text('确定'), onPressed: onConfirm, ), ], ), ], ), ); } } ``` 在这个示例中,我们定义了一个 `MyDialog` 类,它接收一个标题、一个消息和一个确认回调函数作为参数。在 `build` 方法中,我们使用 `Dialog` 来实现弹窗,使用 `Column` 和 `Row` 来组织弹窗中的内容。弹窗中包含一个标题、消息、一个“取消”按钮和一个“确定”按钮。我们使用 `FlatButton` 和 `RaisedButton` 来分别实现这两个按钮。 要使用这个自定义弹窗,只需要在需要的地方创建一个 `MyDialog` 实例,并将它传递给 `showDialog` 方法即可: ```dart showDialog( context: context, builder: (BuildContext context) { return MyDialog( title: '标题', message: '这是一条消息。', onConfirm: () { // 确认回调函数 }, ); }, ); ``` 在这个示例中,我们将 `MyDialog` 实例作为 `builder` 函数的返回值,传递给 `showDialog` 方法。当用户点击弹窗中的“确定”按钮时,传递给 `MyDialog` 的确认回调函数将被调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值