模态框中执行switch以及其他更新状态不更新的问题

因为模态框等于是重新打开了另一个路由,所以你在AlertDialog这个widget中间更新状态不会实时更改状态

普通模态框

showDialog(
        // barrierDismissible: false, //点击外层不会关闭窗口
        context: context,
        builder: (context) => AlertDialog(
              title: Text('Caution'),
              content: Text('11111111'),
              actions: <Widget>[
                new FlatButton(
                  child: new Text("Yes"),
                  onPressed: () {},
                ),
              ],
            ));

如果只是单纯的一些提示或者确认操作,这样就可以满足了,但是有时候需要在模态框上实时更新状态,比如switch或者输入框密码回显之类的,就需要这样在AlertDialog外层包一层StatefulBuilder 写法

showDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) {
        return StatefulBuilder(
          builder: (context, state) {//state重新定义一个setState
            return AlertDialog(
              content: SingleChildScrollView(
                scrollDirection: Axis.vertical,
                child: Container(
                    height: val['encrypt'] == "wpa2" ? 320 : 250,
                    child: Flex(
                      direction: Axis.vertical,
                      children: <Widget>[
                        Container(
                          padding: EdgeInsets.symmetric(vertical: 10),
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: <Widget>[
                              Text('Remember'),
                              Container(
                                  child: Switch(
                                value: savedWifi,
                                onChanged: (bool value) {
                                  state(() { //////////setState改成state或者其他你上面定义的
                                    savedWifi = !savedWifi;
                                  });
                                },
                              ))
                            ],
                          ),
                        ),
                      ],
                    )),
              ),
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(15.0)),
              actions: <Widget>[
                FlatButton(
                  child: new Text("Cancel"),
                  onPressed: () {
                    state(() {
                      password.clear();
                      username.clear();
                      _isObscure = false;
                    });
                    Navigator.of(context).pop();
                  },
                ),
                FlatButton(
                  child: new Text("Apply"),
                  onPressed: () {
                    Navigator.of(context).pop();
                    _joinWifi(val, 'join');
                    password.clear();
                    username.clear();
                  },
                ),
              ],
            );
          },
        );
      },
    );
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,751评论 0 17
  • 原文在此,此处只为学习 Widget与ElementWidget主要接口Stateless WidgetState...
    lltree阅读 4,551评论 0 1
  • 前言 上一篇我们简单地了解了 Dart 语言,接着我们就开始学习 Flutter 的基础 Widget 吧。 1....
    南小夕阅读 2,651评论 0 8
  • 《怎样成为精力管理的高手》 精力的金字塔模型,从下到上依次为: 体能(运动、饮食、睡眠、健康)、 情绪(正面情绪、...
    笔尖上的王者阅读 629评论 0 1
  • 早在去年寒假的时候,我就看到王老师发到群里的全县拓展训练安排。一直是期待的。6月3日晚上,我和儿子整理好行李...
    倬儿不凡阅读 1,031评论 0 5