Flutter Streambuilder 返回循环

时间:2021-05-04 09:27:38

标签: firebase flutter loops dart google-cloud-firestore

我有来自 firebase 的数据,为了简化我的代码,我想返回一个包含所有元素的循环。这是我的 Streambuilder:

Column(
      children: <Widget>[
        Container(
          height: 300,
          width: double.infinity,
          child: Image.network(
            widget.image,
            fit: BoxFit.cover,
          ),
        ),
        StreamBuilder(
            stream: FirebaseFirestore.instance
                .collection(
                    '/towns/${widget.townId}/beacons/${widget.beaconId}/content')
                .snapshots(),
            builder: (ctx, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting)
                return CircularProgressIndicator();
              final contents = snapshot.data.docs;
              for (int i = 1; i <= 10; i++) {
                return Column(
                  children: [
                    contents[1]['sectionTitle$i'].isNotEmpty
                        ? buildSectionTitle(
                            context, contents[1]['sectionTitle$i'])
                        : Container(),
                    contents[1]['text$i'].isNotEmpty
                        ? buildText(context, contents[1]['text$i'])
                        : Container(),
                    contents[1]['audio$i'].isNotEmpty
                        ? Audio(contents[1]['audio$i'], key: UniqueKey())
                        : Container(),
                    contents[1]['image$i'].isNotEmpty
                        ? buildImage(context, contents[1]['image$i'])
                        : Container(),
                  ],
                );
              }
              return Container();
            }),
      ],
    ),

在我的 firebase 中,我的所有元素(sectionTitle1、sectionTitle2 等)都在同一个文档中(这里是内容 [1])。问题是 Streambuild 只返回循环的第一个元素。例如,如果我开始 i = 1,循环将返回 sectionTitle1、text1、audio1 和 image1;如果我开始 i = 3,循环将返回 sectionTitle3、text3、audio3 和 image3。我怎样才能退回所有东西?

1 个答案:

答案 0 :(得分:1)

更新答案

你可以试试这个方法,它可能会解决你的问题:

return Column(
  children: [
    for (int i = 1; i <= 10; i++) ...[
      contents[1]['sectionTitle$i'].isNotEmpty
        ? buildSectionTitle(
          context, contents[1]['sectionTitle$i'])
        : Container(),
      contents[1]['text$i'].isNotEmpty
        ? buildText(context, contents[1]['text$i'])
        : Container(),
      contents[1]['audio$i'].isNotEmpty
        ? Audio(contents[1]['audio$i'], key: UniqueKey())
        : Container(),
      contents[1]['image$i'].isNotEmpty
        ? buildImage(context, contents[1]['image$i'])
        : Container(),
    ]
  ]
);

这样您就不必为每次迭代创建一个列。 并删除末尾的 return Container();

之前的错误答案

您使用的是 content[1] 而不是 content[i],因此您将始终在循环中获得 docs[1] 的结果