You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何实现等待AwesomeDialog关闭后再执行后续代码?

嘿,我懂你想要的效果——让弹出AwesomeDialog后,后续代码暂停执行,直到对话框被关闭对吧?现在的问题是show()方法是非阻塞的,所以代码会直接跳到print("cccccccccccccccccccc")。这里给你两种实用的解决方案:


方案一:用Completer实现通用的等待逻辑(推荐)

这种方法不管用户是点击确定按钮,还是通过其他方式关闭对话框(比如点击空白处),都会等待对话框关闭后再执行后续代码。只需要把按钮的点击回调改成异步,并用Completer来监听对话框的关闭事件:

import 'package:awesome_dialog/awesome_dialog.dart';
import 'package:flutter/material.dart';
import 'dart:async'; // 别忘了导入这个包

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Page(),
    );
  }
}

class Page extends StatefulWidget {
  @override
  _PageState createState() => _PageState();
}

class _PageState extends State<Page> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () async { // 标记为异步函数
            print("aaaaaaaaaaaaaaaaaaaa");
            
            // 创建Completer来追踪对话框的关闭状态
            final dialogCompleter = Completer<void>();
            
            AwesomeDialog(
              context: context,
              dialogType: DialogType.INFO,
              animType: AnimType.BOTTOMSLIDE,
              title: 'Register Status',
              desc: "Register Successfull",
              btnOkOnPress: () {
                print("bbbbbbbbbbbbbbbbb");
                dialogCompleter.complete(); // 点击确定时完成Future
              },
              // 处理对话框被外部关闭的情况(比如点击空白区域)
              onDissmissCallback: () {
                dialogCompleter.complete(); // 对话框关闭时完成Future
              },
              width: 400,
            )..show();
            
            // 等待对话框关闭后再执行后续代码
            await dialogCompleter.future;
            print("cccccccccccccccccccc");
          },
          child: Text("Show Dialog"),
        ),
      ),
    );
  }
}

方案二:直接把后续代码放到按钮回调中(适合仅需确定按钮触发的场景)

如果你的需求是只有用户点击确定按钮后才执行print("cccccccccccccccccccc"),那可以直接把这段代码移到btnOkOnPress里面:

// 简化后的onPressed逻辑
onPressed: () {
  print("aaaaaaaaaaaaaaaaaaaa");
  AwesomeDialog(
    context: context,
    dialogType: DialogType.INFO,
    animType: AnimType.BOTTOMSLIDE,
    title: 'Register Status',
    desc: "Register Successfull",
    btnOkOnPress: () {
      print("bbbbbbbbbbbbbbbbb");
      print("cccccccccccccccccccc"); // 移到这里
    },
    width: 400,
  )..show();
},

这样修改后,输出顺序就会变成你想要的:

aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
cccccccccccccccccccc

内容的提问来源于stack exchange,提问作者Honey Last

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:32:39