【问题标题】:How to display list of data in application?如何在应用程序中显示数据列表?
【发布时间】:2021-08-06 08:23:12
【问题描述】:

我遇到了一个错误,数据在终端中打印出来但没有显示在应用程序中。

  Future<DocumentSnapshot> getTeacher() async {
    var firebaseUser = await FirebaseAuth.instance.currentUser;
    var docRef = FirebaseFirestore.instance.collection("User");
    var query = docRef.where("type", isEqualTo: "teacher").limit(10);
    query.get().then((QuerySnapshot querySnapshot) {
      querySnapshot.docs.forEach((doc) {
        print(doc["name"]);
        print(doc["email"]);
      });
    });
  }

    body: new FutureBuilder(
          future: getTeacher(),
          builder:
              (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              return ListView.builder(
                  shrinkWrap: true,
                  itemCount: 1,
                  itemBuilder: (BuildContext context, int index) {
                    return Row(
                      children: <Widget>[
                        Expanded(child: Text(snapshot.data["name"])),
                        Expanded(child: Text(snapshot.data["email"])),
                        Expanded(
                            child: IconButton(
                                icon: Icon(Icons.chat), onPressed: () {}))
                      ],
                    );
                  });
            }
            return Container();
          }),

this is the output in the terminal

【问题讨论】:

  • 打印前检查文档不为空
  • 执行文档已在终端中打印出来。但不显示在应用中

标签: flutter mobile google-cloud-firestore


【解决方案1】:

您的getTeacher()-Function 不会返回您的 Future。因为这 抛出 Nullpointer-Exception。您应该返回 query.get() 而不是听它。 您也不应该在 build-Function 中调用 getTeacher(),因为它将在每次构建时调用。

编辑:

你的方法:

Future<DocumentSnapshot> getTeacher() async {
   var firebaseUser = await FirebaseAuth.instance.currentUser;
   var docRef = FirebaseFirestore.instance.collection("User");
   var query = docRef.where("type", isEqualTo: "teacher").limit(1);
   return (await query.get()).docs[0];
}

小部件的变量:

final Future<DocumentSnapshot> teacher = getTeacher();

你的 FutureBuilder:

new FutureBuilder(
      future: teacher,
      builder: ...
)

【讨论】:

  • 我该怎么办?你能解释更多吗?对不起,我还是初学者:(
  • 如果您只返回第一个文档,您可以使用.limit(1) 而不是.limit(10) 来节省一些资金/带宽。
  • 我收到错误; final Future 教师 = getTeacher();返回 query.get().docs[0];
【解决方案2】:

你没有从未来的函数中返回任何东西。请检查以下代码

  Future<List<DocumentSnapshot>> getTeacher() async {
    var firebaseUser = await FirebaseAuth.instance.currentUser;
    var docRef = FirebaseFirestore.instance.collection("users");
    QuerySnapshot query =
        await docRef.where("user_device_language", isEqualTo: "en").limit(10).get();

    return query.docs;
  }

并像这样在列表视图中处理空值

   body: new FutureBuilder(
            future: getTeacher(),
            builder: (BuildContext context, AsyncSnapshot<List<DocumentSnapshot>> snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.data != null) {
                  return ListView.builder(
                      shrinkWrap: true,
                      itemCount: snapshot.data.length,
                      itemBuilder: (BuildContext context, int index) {
                        return Row(
                          children: <Widget>[
                            Expanded(child: Text(snapshot.data[index]["name"])),
                            Expanded(child: Text(snapshot.data[index]["email"])),
                            Expanded(child: IconButton(icon: Icon(Icons.chat), onPressed: () {}))
                          ],
                        );
                      });
                } else {
                  return Text('No Data');
                }
              }
              return Container();
            },
          ),

【讨论】:

  • 谢谢。已经准备好显示数据但是,如何显示所有数据?因为输出只显示了 1 个数据。
  • @fizahpanda103 我已经编辑了上面的代码。请检查。
  • @fizahpanda103 请确保 snapshot.data[index]["name"] 的值不为空,否则会抛出错误。您必须使用 if else 语句管理空值
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多