如果我在 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)
| 归档时间: |
|
| 查看次数: |
3672 次 |
| 最近记录: |