如何在 futurebuilder 中显示对话框?

Die*_*Vin 7 dart flutter

如果我在 futurebuilder 中收到错误,我想显示一个对话框。

如果我收到一个错误,我想显示一个对话框并强制用户单击按钮,以便他可以重定向到另一个页面。

问题似乎是在构建小部件时无法显示对话框。

FutureBuilder(
      future: ApiService.getPosts(),
      builder: (BuildContext context, AsyncSnapshot snapShot) {
        if (snapShot.connectionState == ConnectionState.done) {
          if (snapShot.data.runtimeType == http.Response) {
            var message =
              json.decode(utf8.decode(snapShot.data.bodyBytes));

    showDialog(
     context: context,
     barrierDismissible: false,
     builder: (context) {
       return AlertDialog(
        content: Text(message),
        actions: <Widget>[
          FlatButton(
            child: Text("Ok"),
            onPressed: () => null",
          )
        ],
      );
    });
  }
     return ListView.separated(
            separatorBuilder: (BuildContext context, int index) {
              return Divider(
                color: Colors.grey,
                height: 1,
              );
            },
            itemBuilder: (BuildContext context, int index) {
              return _buildPostCard(index);
            },
            itemCount: snapShot.data.length,
          );
     return Center(
          child: CircularProgressIndicator(),
        );
      },
    )
Run Code Online (Sandbox Code Playgroud)

如果我单独返回 AlertDialog,它会起作用。但是我需要 showDialog 因为 barrierDismissible 属性。

有谁知道这是否可能?另外,这是处理我想要的东西的好方法吗?

谢谢

更新

为了进一步参考,工作中的朋友有解决方案。

为了做我正在寻找的事情,我必须决定将哪个未来传递给 futureBuilder。

Future<List<dynamic>> getPostsFuture() async { 
try {
    return await ApiService.getPosts();
  } catch (e) {

     await showDialog(
 context: context,
 barrierDismissible: false,
 builder: (context) {
   return AlertDialog(
    content: Text(message),
    actions: <Widget>[
      FlatButton(
        child: Text("Ok"),
        onPressed: () => null",
      )
    ],
  );
});
  }
}
Run Code Online (Sandbox Code Playgroud)

}

然后在 futureBuilder 我会打电话

FutureBuilder(
  future: getPostsFuture(),
Run Code Online (Sandbox Code Playgroud)

谢谢

geo*_*ngs 12

为避免setState() or markNeedsBuild() called during build在使用时出现错误,showDialog 将其包装成Future.delayed这样:

Future.delayed(Duration.zero, () => showDialog(...));
Run Code Online (Sandbox Code Playgroud)


Roy*_*fin -2

builder参数期望您返回一个Widget. showDialog 是一个Future. 所以你不能退货。
您在其他小部件之上显示对话框,您无法从需要小部件的构建方法中返回它。
您想要的可以通过以下方式实现。
当您收到错误时,在 UI 上显示一个对话框并返回构建器的容器。将您的代码修改为:

if (snapShot.data.runtimeType == http.Response) {
          var message =
          json.decode(utf8.decode(snapShot.data.bodyBytes));

          showDialog(
              context: context,
              barrierDismissible: false,
              builder: (context) {
                return AlertDialog(
                  content: Text(message),
                  actions: <Widget>[
                    FlatButton(
                        child: Text("Ok"),
                        onPressed: () => null",
                    )
                  ],
                );
              });
          return Container();
        }
Run Code Online (Sandbox Code Playgroud)