如何在项目构建器中显示来自 Firestore 的列表

ban*_*ang 3 dart flutter google-cloud-firestore

下面的 getIngredients() 方法从 firestore 返回一个列表。

Future getIngredients() async {
    return Firestore.instance
        .collection('ingredients')
        .where("name", isEqualTo: widget.dish_name.toString().toLowerCase()).getDocuments();
  }
Run Code Online (Sandbox Code Playgroud)

现在我想在下面的项目构建器中显示这个列表:

 new ListView.builder(
                  itemExtent: 90,
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                      return SingleIngredient(
                        ingredient_name: snapshot.data[index].ingredients,
                      );
                  });
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

_FutureBuilderState#7cbda): I/flutter (12164): 类 'QuerySnapshot' 没有实例 getter 'length'。I/flutter (12164):接收器:“QuerySnapshot”实例 I/flutter (12164):尝试调用:长度

这是我的firestore的结构。我正在获取成分清单:

在此处输入图片说明

更新 我已经更新了代码,但我只得到了成分列表中的第一个项目(即洋葱)。我希望 itembuilder 构建列表中的每个项目,因为我正在尝试显示图像和成分列表。这就是 SingleIngredient 小部件正在做的事情。那么,我怎样才能一一遍历每个列表呢?

 Widget build(BuildContext context) {
    return Container(
      child: FutureBuilder(
          future: getIngredients(),
          builder: (context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index) {
                  DocumentSnapshot user = snapshot.data.documents[index];

                  return SingleIngredient(
                    // Access the fields as defined in FireStore
                    ingredient_name: user.data['ingredients'][index].toString(),
                  );
                },
              );
            } else if (snapshot.connectionState == ConnectionState.done &&
                !snapshot.hasData) {
              // Handle no data
              return Center(
                child: Text("No users found."),
              );
            } else {
              // Still loading
              return CircularProgressIndicator();
            }
          }),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Swi*_*ter 6

这是一个使用StreamBuilder我从集合中检索所有文档并构建一个ListView以显示它们的示例:

Widget buildUserList(BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
    if (snapshot.hasData) {
        return ListView.builder(
            itemCount: snapshot.data.documents.length,
            itemBuilder: (context, index) {
                DocumentSnapshot user = snapshot.data.documents[index];

                return ListTile(
                    // Access the fields as defined in FireStore
                    title: Text(user.data['firstName']),
                    subtitle: Text(user.data['lastName']),
                );
            },
        );
    } else if (snapshot.connectionState == ConnectionState.done && !snapshot.hasData {
        // Handle no data
        return Center(
            child: Text("No users found."),
        );
    } else {
        // Still loading
        return CircularProgressIndicator();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Scaffold(
    body: StreamBuilder(
        stream:
            Firestore.instance.collection('users').snapshots(),
        builder: buildUserList,
    )
)
Run Code Online (Sandbox Code Playgroud)

或者

Scaffold(
    body: FutureBuilder(
        future:
            Firestore.instance.collection('users').getDocuments(),
        builder: buildUserList,
    )
)
Run Code Online (Sandbox Code Playgroud)