【问题标题】:How to show a dialog with FutureBuilder when press a button?按下按钮时如何显示带有 FutureBuilder 的对话框?
【发布时间】:2018-09-01 08:54:29
【问题描述】:

我使用 FutureBuilder 上传图像 FirebaseStorage,当我按下上传按钮时,我想显示一个等待对话框。在 FireStorage 上成功上传图像,但没有显示任何内容。我的代码有什么问题?我认为 FutureBuilder 返回 Widget 并按下按钮无效。也许这就是问题所在。或者我以错误的方式调用 FutureBuilder。您对我的错误代码有什么提示或建议吗?

这是我的代码;



    Widget buildBody(BuildContext context) {
        return new SingleChildScrollView(
          child: new Column(
            children: [
              new SizedBox(
                width: double.infinity,
                child: new RaisedButton(
                  child: new Text('Upload'),
                  onPressed:  () {
                    futureBuilder();
                  },
                ),
              ),
            ],
          ),
        );
      }

     Future mediaUpload() async {
        final fileName = DateTime.now().millisecondsSinceEpoch.toString() + '.jpg';
        final StorageReference storage = FirebaseStorage.instance.ref().child(fileName);
        final StorageUploadTask task = storage.putFile(_image);
        return task.future;
      }

      Widget futureBuilder() {
        return new FutureBuilder(
          future: mediaUpload(),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.none:
                print('ConnectionState.none');
                return new Text('Press button to start.');
              case ConnectionState.active:
                print('ConnectionState.active');
                return new Text('');
              case ConnectionState.waiting:
                waitingDialog(context);
                return waitingDialog(context);
              case ConnectionState.done:
                print('ConnectionState.done');
                if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
                print(snapshot.data.downloadUrl);
                Navigator.of(context).pushReplacementNamed('home');
                return new Text('Result: ${snapshot.data.downloadUrl}');
            }
          },
        );
      }

      waitingDialog(BuildContext context) {
        return showDialog(
          context: context,
          barrierDismissible: false,
          builder: (BuildContext context) {
            return new Center(
              child: new SizedBox(
                width: 40.0,
                height: 40.0,
                child: const CircularProgressIndicator(
                  value: null,
                  strokeWidth: 2.0,
                ),
              ),
            );
          },
        );
      }

【问题讨论】:

    标签: firebase dart flutter future builder


    【解决方案1】:

    我不是 100% 确定为什么 FutureBuilder 不起作用。但我有一个猜测。在上面的示例中,FutureBuilder 未附加到 widgetTree(screen)。未附加意味着来自FutureBuilder返回值不会显示在屏幕上。在这种情况下,Text 基于未附加到屏幕的snapshot.connectionState 返回。

    解决方法: (我测试过,它有效,请您验证一下)

    futureBuilder(BuildContext context) {
      mediaUpload().then((task) {          // fire the upload
        Navigator.of(context).maybePop();  // remove the dialog on success upload
      });                                  // we can use task(which returned from
                                           // mediaUpload()) to get the values like downloadUrl.
      waitingDialog(context);             // show the spinner dialog
    }
    

    【讨论】:

    • 谢谢你,Dinesh 它就像一个魅力。但是如何与 FutureBuilder 一起使用呢?我不明白。
    • 我会尝试找出为什么FutureBuilder 在这种情况下不起作用。我查看了FutureBuilder,但什么也没得到。我认为我的猜测是正确的:-P。如果我发现了什么,我会告诉你的。请也这样做
    • 我也想弄清楚。如果我得到任何东西,我也会告诉你。
    • 从未来的构建器调用警报对话框的任何解决方案?
    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 2021-12-14
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多