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