【发布时间】:2020-08-14 10:06:48
【问题描述】:
我正在尝试在我未来的构建器上使用小吃栏来显示错误。所以在 initState 方法上创建我未来的方法实例之后:
Future<DetailModel> futureDetail;
...
@override
void initState() {
futureDetail =
DetailProvider().detailProvider(widget.id);
super.initState();
}
在 futureBuilder 中我使用如下:
Center(
child: SingleChildScrollView(
child: FutureBuilder(
future: futureDetail,
builder:
(context, AsyncSnapshot<DetailProductModel> snapshot) {
if (!snapshot.hasError ||
snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
}
if (snapshot.hasData && snapshot.data.data != null) {
return Container();
}
if (snapshot.hasError &&
snapshot.error != null &&
snapshot.data == null) {
WidgetsBinding.instance.addPostFrameCallback((_) =>
showSnackbar(snapshot.error.toString(), context));
return Container();
} else {
return Center(
child: Text('failed to load'),
);
}
},
),
),
),
detailProvider 方法调用 http 服务,在我的示例中,我抛出 SocketException 以在构建器上获取错误并显示小吃栏。
我知道未来的构建器是为每个状态显示一个小部件,但我想 显示蛇形条。
但是builder被调用了两次,并且snackbar显示了两次错误?
我在两次 build 中检查了这三个条件是否相同 snapshot.hasError and snapshot.error != null and snapshot.data == null 。如何防止显示两次 snakbar?
【问题讨论】:
-
如果您只是将
print(snapshot);作为构建器中的第一行,您会在日志上做什么? -
你的有状态小部件也被构建了两次?
-
这是完整的打印paste.ubuntu.com/p/Jmry3HxWcs@pskink
标签: flutter flutter-layout future