Flutter 显示 SnackBar 并在 StreamBuilder 中返回空 Container 会引发错误
Posted
技术标签:
【中文标题】Flutter 显示 SnackBar 并在 StreamBuilder 中返回空 Container 会引发错误【英文标题】:Flutter show SnackBar and return empty Container in StreamBuilder throws an Error 【发布时间】:2019-05-24 11:24:45 【问题描述】:您好,如果现在网络响应返回错误,我正在尝试显示 Snackbar 我的构建函数如下所示:
@override
Widget build(BuildContext context)
NewsBloc bloc = NewsBloc();
return Scaffold(
key: scaffoldKey,
body: Container(
color: Colors.white,
child: StreamBuilder<List<BaseModel>>(
stream: bloc.newsStream,
builder: (BuildContext context, AsyncSnapshot<List<BaseModel>> snap)
if (snap.hasError)
scaffoldKey.currentState.showSnackBar(SnackBar(
content: Container(
height: 100,
),
));
return Center(child: Text(snap.error));
else if (!snap.hasData)
return Center(child: CircularProgressIndicator());
else
return _newsList(snap.data);
,
),
),
);
它会显示 Snackbar,但也会引发错误:
This Scaffold widget cannot be marked as needing to build
because the framework is already in the procces
【问题讨论】:
查看flutter.io/docs/cookbook/design/snackbars 【参考方案1】:那是因为您不应该显示 Snackbar
而您的 Widget
是重建过程,您可以使用的解决方法是:
_displaySnackBar(BuildContext context) async
await Future.delayed(Duration(milliseconds: 400));
scaffoldKey.currentState.showSnackBar(SnackBar(
content: Container(
height: 100,
),
));
和
if (snap.hasError)
_displaySnackBar(context);
return Center(child: Text(snap.error));
【讨论】:
哦,对不起,我发布了错误的代码,有条件检查也不起作用 现在可以了,但是如果构建过程需要超过 400 毫升怎么办? 这与处理时间无关,那个时间是在您从流中接收数据之后,我在您的小部件刷新后添加了额外的延迟。 你也可以查看这个答案:) ***.com/questions/52849373/…【参考方案2】:这是一种解决方法,但对我有用
Future<void> _snackBar(String text, context) async
Scaffold.of(context).showSnackBar(Helper.snackBarInfo(text));
【讨论】:
【参考方案3】:StreamBuilder(
stream: bloc.stream,
builder: (BuildContext context,
AsyncSnapshot snapshot)
if (snapshot.hasData)
SchedulerBinding.instance
.addPostFrameCallback((_)
Scaffold.of(context).showSnackBar(
SnackBar(
content: Text(
snapshot.data.error,
style: TextStyle(fontSize: 16)),
duration: Duration(seconds: 3),
),
);
);
return Container();
),
【讨论】:
以上是关于Flutter 显示 SnackBar 并在 StreamBuilder 中返回空 Container 会引发错误的主要内容,如果未能解决你的问题,请参考以下文章
Flutter - 如何在“Future”中显示“snackbar”
Flutter:调用 setState() 方法后不显示 SnackBar
在 Flutter 中打开应用程序时如何显示 Snackbar 或底部工作表?