Flutter 如何在应用程序中显示数据列表?

Flutter 如何在应用程序中显示数据列表?,flutter,mobile,google-cloud-firestore,Flutter,Mobile,Google Cloud Firestore,我遇到了一个错误,数据在终端中打印出来,但没有显示在应用程序中 Future<DocumentSnapshot> getTeacher() async { var firebaseUser = await FirebaseAuth.instance.currentUser; var docRef = FirebaseFirestore.instance.collection("User"); var query = docRef.whe

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

  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();
          }),
Future getTeacher()异步{
var firebaseUser=等待FirebaseAuth.instance.currentUser;
var docRef=FirebaseFirestore.instance.collection(“用户”);
var query=docRef.where(“type”,isEqualTo:“teacher”)。限制(10);
query.get().then((QuerySnapshot QuerySnapshot){
querySnapshot.docs.forEach((doc){
打印(文件[“名称]);
打印(文件[“电子邮件]);
});
});
}
身体:新未来建设者(
future:getTeacher(),
建设者:
(BuildContext上下文,异步快照){
if(snapshot.connectionState==connectionState.done){
返回ListView.builder(
收缩膜:对,
物品计数:1,
itemBuilder:(构建上下文,int索引){
返回行(
儿童:[
已展开(子项:文本(快照.数据[“名称])),
已展开(子项:文本(快照.数据[“电子邮件])),
扩大(
孩子:我的钮扣(
图标:图标(Icons.chat),按下:({}))
],
);
});
}
返回容器();
}),

您的
getTeacher()
-函数不会返回您的未来。因此 引发空指针异常。您应该返回
query.get()
,而不是侦听它。 您也不应该在build函数中调用
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];
}

您没有从future函数返回任何内容。请检查下面的代码

  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;
  }
Future getTeacher()异步{
var firebaseUser=等待FirebaseAuth.instance.currentUser;
var docRef=FirebaseFirestore.instance.collection(“用户”);
QuerySnapshot查询=
等待docRef.where(“用户设备语言”,isEqualTo:“en”).limit(10.get();
返回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();
            },
          ),
body:新的FutureBuilder(
future:getTeacher(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.connectionState==connectionState.done){
如果(snapshot.data!=null){
返回ListView.builder(
收缩膜:对,
itemCount:snapshot.data.length,
itemBuilder:(构建上下文,int索引){
返回行(
儿童:[
已展开(子项:文本(快照.数据[索引][“名称]),
已展开(子项:文本(快照.数据[索引][“电子邮件]),
展开(子项:IconButton(图标:icon(Icons.chat),按下:(){}))
],
);
});
}否则{
返回文本(“无数据”);
}
}
返回容器();
},
),

打印前检查单据不为空。如果单据已在终端中打印出来。但不显示在应用程序中我该怎么办?你能再解释一下吗?很抱歉,我还是初学者:(如果你只想返回第一个文档,你可以通过使用
.limit(1)
而不是
.limit(10)
,来节省一些钱/带宽。我得到了错误;final Future teacher=getTeacher();return query.get().docs[0];您遇到了哪一个错误?谢谢。al准备好显示数据了,但是,如何显示所有数据?因为输出只显示了1个数据。@fizahpanda103我编辑了上面的代码。请检查。@fizahpanda103请确保snapshot.data[index][“name”处的值不是null,否则会抛出错误。你必须用if-else语句管理null值非常感谢。这对我来说很有用:D
  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();
            },
          ),