forEach 访问 Firestore 文档

时间:2021-03-11 00:23:40

标签: firebase flutter google-cloud-firestore stream-builder

在此示例中,第一个文本小部件返回错误“列的子项不得包含任何空值,但在索引 0 处发现空值。”

但如果我将其注释掉,第二个文本小部件将返回索引为 0 处的文档标题。

(我正在使用 Streambuilder 和 Firestore)

为什么?

Column(
            children:[
              snapshot.data.docs.forEach((e) {
                return Text('${e['title']}');
              
              }),
              Text('${snapshot.data.docs[0]['title']}'),
            ]

2 个答案:

答案 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() 返回 undefinedmap() 返回一个数组。

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),
              ),
            );
          }),
    );
  }