asynchronous - Getter "Snapshot"在 Flutter 中使用 StreamBuilder 调用 null

标签 asynchronous stream dart flutter

我正在使用 Flutter Streambuilder,我的流在加载之前调用了 null 一秒钟。我正在尝试加载“正在加载...”卡片,但它不起作用。在显示我想要的卡片列表之前,我的模拟器短暂地显示了一个红色错误屏幕。我怎样才能让它停止这样做?这是我的代码...

new Expanded(
                  child: new StreamBuilder(
                      stream: streamQuery,
                      builder:
                          (BuildContext context, AsyncSnapshot<Event> event) {
                        if (event.data.snapshot.value == null) {
                          return new Card(
                            child: new Text('Loading...',
                                style: new TextStyle(
                                    fontSize: 12.0,
                                    fontWeight: FontWeight.bold,
                                    fontStyle: FontStyle.italic)),
                          );
                        }

                        Map myMap = event.data.snapshot.value; //store each map
                        var titles = myMap.values;

                        List onesTitles = new List();
                        List onesIds = new List();
                        List onesImages = new List();
                        List onesRank = new List();

                        for (var items in titles) {
                          onesTitles.add(items['vidTitle']);
                          onesIds.add(items['vidId']);
                          onesImages.add(items['vidImage']);
                          onesRank.add(items['Value']);
                        }

                        names = onesTitles;
                        ids = onesIds;
                        numbers = onesRank;
                        vidImages = onesImages;

                        switch (event.connectionState) {
                          case ConnectionState.none:
                            return new Card(
                              child: new Text('Loading...',
                                  style: new TextStyle(
                                      fontSize: 12.0,
                                      fontWeight: FontWeight.bold,
                                      fontStyle: FontStyle.italic)),
                            );
                          case ConnectionState.waiting:
                            return new Card(
                              child: new Text('Awaiting Results...',
                                  style: new TextStyle(
                                      fontSize: 12.0,
                                      fontWeight: FontWeight.bold,
                                      fontStyle: FontStyle.italic)),
                            );
                          default:
                            if (event.hasError)
                              return new Card(
                                child: new Text('Error: ${event.error}',
                                    style: new TextStyle(
                                        fontSize: 12.0,
                                        fontWeight: FontWeight.bold,
                                        fontStyle: FontStyle.italic)),
                              );
                            else
                              return new InkWell(

最佳答案

您需要在 else 中明确声明您的所有数据操作,它具有您的 if (snapshot!=null) {//do something} 的构建布局

像这样:

else //event.data.snapshot.value != null
 { 
Map myMap = event.data.snapshot.value; //store each map
                        var titles = myMap.values;

                        List onesTitles = new List();
                        List onesIds = new List();
                        List onesImages = new List();
                        List onesRank = new List();

                        for (var items in titles) {
                          onesTitles.add(items['vidTitle']);
                          onesIds.add(items['vidId']);
                          onesImages.add(items['vidImage']);
                          onesRank.add(items['Value']);
                        }

                        names = onesTitles;
                        ids = onesIds;
                        numbers = onesRank;
                        vidImages = onesImages;

//return my layout 
}

因此,不要在 snapshot!=null 时有效的 if 语句之外留下任何正在使用您的 snapshot.value 的内容。

关于asynchronous - Getter "Snapshot"在 Flutter 中使用 StreamBuilder 调用 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47343885/

相关文章:

swift - 保存多个带有核心数据的异步上下文,数据丢失

javascript - Protractor 适合规范 DRY

flutter - 如何使用 Dart PDF 包创建自定义页面宽度?

flutter - Dart/flutter : List of days in a date range

python - 在 Django 1.11 中将 QuerySet 传递给 Celery 任务

node.js - Knex.js - Node 进程永远不会退出,如何优雅地关闭它 - 但只有当所有查询都得到解决时?

c# - System.ObjectDisposeException。处理流编写器的正确方法是什么?

c# - HttpClient GetStreamAsync 和 HTTP 状态代码?

java - 为什么 InputStream 没有完全填满数组?

dart - 取消流onData