如何在 FutureBuilder 中显示对话框

How to showDialog in FutureBuilder

在颤动中, 我使用 FutureBuilder 显示来自 API 的数据。 我想在出现错误时弹出一个错误对话框。

但是,当我调用 showDialog() 时它抛出错误

setState() or markNeedsBuild() called during build.

这是我的代码

    return FutureBuilder(
      future: xxx,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          //DO SOMETHING

        } else if (snapshot.hasError) {
          //TODO: Show Error

          showDialog(
              context: context,
              builder: (BuildContext context) {
                return AlertDialog(
                  title: Text("Error"),
                  content: Text("HAHAHA"),
                  actions: <Widget>[
                    FlatButton(
                      child: Text("No"),
                    ),
                    FlatButton(
                        child: Text("Yes")
                    ),
                  ],
                );
              }
          );

          return Container();

        } else {
          //DO SOMETHING
        }
      },

请帮忙指教如何在FutureBuilder中显示Dialog

我们无法在构建方法构建小部件时调用 setState、navigate 或 showDialog。所以,我们可以等待一微秒,同时构建方法完成构建小部件,这样我们就可以显示对话框了。

创建如下方法。

showError() async {
    await Future.delayed(Duration(microseconds: 1));
    showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("Error"),
            content: Text("HAHAHA"),
            actions: <Widget>[
              FlatButton(
                child: Text("No"),
              ),
              FlatButton(child: Text("Yes")),
            ],
          );
        });
  }

然后在你想显示对话框的地方调用这个方法。