在此示例中,第一个文本小部件返回错误“列的子项不得包含任何空值,但在索引 0 处发现空值。”
但如果我将其注释掉,第二个文本小部件将返回索引为 0 处的文档标题。
(我正在使用 Streambuilder 和 Firestore)
为什么?
Column(
children:[
snapshot.data.docs.forEach((e) {
return Text('${e['title']}');
}),
Text('${snapshot.data.docs[0]['title']}'),
]
答案 0 :(得分:2)
正如@danypata 提到的
这就是你应该如何转换你的列表。
# A tibble: 150 x 6
Sepal.Length Sepal.Width Petal.Length Petal.Width Species new_var2
<dbl> <dbl> <dbl> <dbl> <fct> <dbl>
1 5.1 3.5 1.4 0.2 setosa NA
2 4.9 3 1.4 0.2 setosa 4.67
3 4.7 3.2 1.3 0.2 setosa 4.67
4 4.6 3.1 1.5 0.2 setosa 4.67
5 5 3.6 1.4 0.2 setosa NA
6 5.4 3.9 1.7 0.4 setosa NA
7 4.6 3.4 1.4 0.3 setosa 4.67
8 5 3.4 1.5 0.2 setosa NA
9 4.4 2.9 1.4 0.2 setosa 4.67
10 4.9 3.1 1.5 0.1 setosa 4.67
# ... with 140 more rows
答案 1 :(得分:1)
forEach()
和 map()
之间存在差异。 forEach()
返回 undefined
而 map()
返回一个数组。
forEach()
通常用于处理来自 API 的数据或应用函数而无需显式编写循环。在这种情况下,更适合使用 map()
返回小部件列表。你可以这样做:
Column(
children:
List<Widget>.from(snapshot.data.docs.map((e)=> Text('${e['title']}'))),
),
顺便说一下,在用户界面中使用数据之前,最好将其转换为 Model
。例如你有一个 json 对象:
// A list of json objects
[
{
"title":"Sample title1",
"content":"Sample content"
},
{
"title":"Sample title2",
"content":"Sample content"
}
]
然后您可以为该对象定义一个类:
class Post {
final String title;
final String content;
Post({this.title, this.content});
fromJson(Map<String, dynamic> json) {
return Post(
title: json['title'],
content: json['content'],
);
}
}
然后解析json并在UI中使用:
// `data` is the list of json objects
var posts = List<Post>.from(data.map((json) => Post.fromJson(json)));
// In the UI
Column(
children: List<Widget>.generate(
posts.length,
(index) => Text(posts[index].title),
),
)
使用 Firebase 的 Stream
,您可以执行以下操作:
Stream entryStream;
@override
void initState() {
entryStream = FirebaseFirestore.instance.collection('entries').snapshots();
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
child: StreamBuilder(
stream: entryStream,
builder: (context, snapshot) {
if (!snapshot.hasData) return Container();
var fbEntries = List<Entry>.from(
snapshot.data.docs.map((json) => Entry.fromJson(json)));
return Column(
children: List<Widget>.generate(
fbEntries.length,
(index) => Text(fbEntries[index].title),
),
);
}),
);
}