1

我整个周末都在努力解决这个问题,所以我最终决定征求你的意见。

有一个流构建器,它监听流或食谱(按类别 -> 汤、沙漠等过滤)。

我很困惑,因为文本“Nothing”(最后一个返回语句)是唯一显示的内容,即使我在 if 条件中的打印语句要求 connectionstate.active 显示所有值。

当我在文本小部件“Nothing”上方的一行打印连接状态时,我得到“活动”。

当然,我可以摆脱我的 if 语句并将返回的小部件放在最后,但我想知道和理解,为什么我的 .active 条件下的 return 语句没有显示列等,即使打印语句显示在控制台中。

顺便说一句,我看到很多其他资源都使用了 Listview,但我不确定天气是否可以将 Listview 与堆栈一起使用(因为我想在彼此之上显示数据)。

期待您的回复!

问候托马斯

new StreamBuilder<QuerySnapshot>(
                    stream: FirebaseFirestore.instance.collection("rezepte").where("kategorie", isEqualTo: ausgewaehlteKategorie).snapshots(),
                    builder: (context, AsyncSnapshot<QuerySnapshot> snapshot){
                      print("***** STREAMBUILDER *****");
                      if (snapshot.connectionState == ConnectionState.waiting) {
                        print(snapshot.connectionState);
                        return CircularProgressIndicator();
                      }
                      
                      if(snapshot.connectionState == ConnectionState.active){
                        print(snapshot.connectionState);
                        print(snapshot.data!.docs);
                        print(snapshot.data!.docs[0]["name"]);
                        print(snapshot.data!.docs[0]["kategorie"]);

                        print(snapshot.data!.docs.length);

                        snapshot.data!.docs.map((docs){
                          print("Test1");
                          listeAllerRezepte.add(
                            Rezept(
                              name: docs["name"].toString(),
                              kategorie: docs["kategorie"].toString(),
                              naehrwertKohlenhydrate: docs["naehrwertKohlenhydrate"],
                              naehrwertFett: docs["naehrwertFett"],
                              naehrwertEiweiss: docs["naehrwertEiweiss"],
                              naehrwertKohlenhydrateProzent: double.parse((100 / (docs["naehrwertKohlenhydrate"] + docs["naehrwertFett"] + docs["naehrwertEiweiss"]) * docs["naehrwertKohlenhydrate"]).toStringAsFixed(2)),
                              naehrwertFettProzent: double.parse((100 / (docs["naehrwertKohlenhydrate"] + docs["naehrwertFett"] + docs["naehrwertEiweiss"]) * docs["naehrwertFett"]).toStringAsFixed(2)),
                              naehrwertEiweissProzent: double.parse((100 / (docs["naehrwertKohlenhydrate"] + docs["naehrwertFett"] + docs["naehrwertEiweiss"]) * docs["naehrwertEiweiss"]).toStringAsFixed(2)),
                              img: docs["img"],
                              favorit: docs["favorit"]
                            )
                          );
                          print("Test2");

                          print(listeAllerRezepte[0]);
                          print(listeAllerRezepte[0].name.toString());
                          print(listeAllerRezepte[0].kategorie.toString());
                          print(listeAllerRezepte[0].img.toString());

                          return new Column(
                            children: [
                              new Stack(
                                alignment: Alignment.bottomCenter,
                                children: [
                                  new Text("Test1"),
                                  new Container(
                                    child: new GestureDetector(
                                      child: new Column(
                                        children: [
                                          new Text("TEST"),
                                          new Image(
                                            image: (docs["img"].toString().length > 0) ? NetworkImage(docs["img"].toString()) : NetworkImage(globals.listeAllerKategorien![nummerAusgewaehleKategorie].img.toString())
                                          ),
                                        ],
                                      ),
                                      onTap: () {
                                      },
                                    ),
                                  ),
                                  new Divider(height: 100.0)
                                ],
                              ),
                              new Divider(height: 15.0)
                            ]
                          );
                        }).toList();
                      }

                      if(snapshot.connectionState == ConnectionState.done){
                        print(snapshot.connectionState);
                      }
                      
                      if(!snapshot.hasData){
                        return Text("Loading");
                      }

                      return new Text("Nothing");
                    }
                  )
4

1 回答 1

2

一旦StreamBuilder接收到所有数据和完成信号,就state变成done. 它不坐在那里active。您的支票应该是is waiting, has data,然后是no data.

更新:问题出在您在块中的return语句中。if(snapshot.connectionState == ConnectionState.active)您实际上并没有从块中返回小部件,因此该函数将继续执行,直到到达最终return语句。

首先,做出这样的if声明if(snaphsot.hasData)。然后看看这个部分:

snapshot.data!.docs.map((docs){
  ...
  return new Column(
  ...
}

在这里,您的return声明是将匿名函数传递给map方法。Columns 没有从构建器中返回。

虽然我不太确定您的需求是什么,但我相信您的一些小部件也嵌套不正确。以下是我对您的目标的最佳猜测,请相应调整。(为简洁起见,我省略了您的一些代码,只关注构建导致您的问题的小部件。)

if(snapshot.hasData){
  return new Column(
    children: snapshot.data!.docs.map((docs){
      return new Stack(
       alignment: Alignment.bottomCenter,
       children: [
         new Text("Test1"),
         new Container(
           child: new GestureDetector(
             child: new Column(
               children: [
                 new Text("TEST"),
                 new Image(
                   image: (docs["img"].toString().length > 0) ? NetworkImage(docs["img"].toString()) : NetworkImage(globals.listeAllerKategorien![nummerAusgewaehleKategorie].img.toString())
                 ),
               ],
             ),
             onTap: () {},
           ),
         ),
         new Divider(height: 100.0)
       ],
     );
   },
 );
}

注意: AListView肯定能够提供您需要的东西,而且它是比Column. 它提供了开箱即用的滚动、更好的性能和内存使用,以及一些方便的构造函数,可以在需要的Divider地方提供。一旦您对这些结果感到满意,我鼓励您检查一下。

于 2022-02-06T18:59:05.957 回答