我有来自 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。我怎样才能退回所有东西?
答案 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] 的结果