flutter showDialog回调的问题

一、问题描述

点击方法触发弹框,但是点击确定后回调函数一直接收不到return的值。

调用方法

_submit(this.userId, this.roomId, this.uuid, this.mac, "0").then((val){
      if(val == "0"){ //此处接不到值
        逻辑代码处理
      );

 });

方法体

Future _submit(String userId, String roomId, String uuid, String mac, String isReplace) async {
    Map resultMap;
    try {
      //HTTP请求
    } catch (e) {
      print('请求异常' + e.toString());
    }
    if(resultMap["code"] == "0"){
      return "0"; // 此处返回可以接到
    } else {
      showDialog(
          context: context,
          builder: (context) {
            return AlertDialog(
              content: new SingleChildScrollView(
                child: ListBody(
                  children: <Widget>[Text("提示文字"), Text("")],
                ),
              ),
              actions: <Widget>[
                FlatButton(
                  child: Text("确定"),
                  onPressed: () async {
                    Map resultMap1;
                    try {
                      //HTTP请求
                    } catch (e) {
                      print('请求异常' + e.toString());
                    }
                    if(resultMap1["code"] == "0"){
                      return "1"; //此处无法接到
                    } else {
                        //处理失败提示
                      )
                      );
                    }
                  }
                ),
                FlatButton(
                  child: Text("取消"),
                  onPressed: () {
                    Navigator.pop(context);
                  },
                )
              ],
            );
          });
    }
  }

二、原因

看了一些介绍之后发现,其实原因很简单。因为dialog其实是另一个页面,准确地来说是另一个路由,因为dialog的关闭也是通过navigator来pop的,所以它的地位跟你当前主页面一样。也就是说,此时,在showDialog内部直接返回在调用函数的回调方法是接收不到的,因为已经不在同一个页面里了。

三、解决方案

需要传递回去就需要使用Navigator.pop将参数返回到调用showDialog的页面,再处理。

///await showDialog方法的返回
String result = await showDialog(
          context: context,
          builder: (context) {
            return AlertDialog(
              content: new SingleChildScrollView(
                child: ListBody(
                  children: <Widget>[Text("提示文字"), Text("")],
                ),
              ),
              actions: <Widget>[
                FlatButton(
                  child: Text("确定"),
                  onPressed: () async {
                    Map resultMap1;
                    try {
                      //HTTP请求
                    } catch (e) {
                      print('请求异常' + e.toString());
                    }
                    if(resultMap1["code"] == "0"){
                      Navigator.pop(context, "1"); //返回到上一个页面,退出showDialog页面
                    } else {
                      Scaffold.of(context).showSnackBar(SnackBar(
                          content: Text("替换失败"),
                          backgroundColor: Colors.red, 
                          duration: Duration(milliseconds: 500)
                      )
                      );
                    }
                  }
                ),
                FlatButton(
                  child: Text("取消"),
                  onPressed: () {
                    Navigator.pop(context);
                  },
                )
              ],
            );
          });
      return result; // 返回给_submit的回调方法,此时就可以接收到值了
    }
  }

四、参考资料:

Flutter更新showDialog中的内容 - 简书

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这章来聊聊flutter的路由管理,也可以理解为页面导航,用来处理页面之间的跳转、参数传递、动画展示等功能。 路由...
    风少侠阅读 5,439评论 1 12
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,286评论 0 21
  • 万事皆 Widget Widget 是每个 Flutter 应用的基础。每个 Widget 是一部分用户界面上不可...
    三季人阅读 1,741评论 1 2
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,761评论 0 17
  • 还是习惯性地选择了紫色 到底什么时候开始又如此地执着着 记得当时 偶然之间知道有朋友喜欢着自己的颜色 就那么地觉得...
    禾小沫阅读 194评论 0 1