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 中正确显示 Snackbar?

Flutter - 如何在“Future”中显示“snackbar”

Flutter:调用 setState() 方法后不显示 SnackBar

在 Flutter 中打开应用程序时如何显示 Snackbar 或底部工作表?

Flutter:使用barcode_scan插件后Snackbar不显示

每次推送新路线时,都会再次显示最后的 Flutter SnackBar