Firestore 查询正在返回数据,但 Futurebuilder 说它不能为空
Firestore query is returning data but Futurebuilder saying it cannot be null
我正在尝试根据我在 Firestore 中的文档构建一个列表。下面是我的未来功能:
Future getBuyerList() async {
await Firestore.instance.collection('Deals').where('buyer_id',isEqualTo: uid_global).snapshots().listen((data) {
data.documents.forEach((doc) {
print('in function - ${doc["car"]}');
print(doc.data);
});
});
}
上面的 运行 在调试器中没问题。它显示了我希望放入列表中的项目的完整列表。
我的小部件树中的 Future Builder 如下所示:
FutureBuilder(
future: getBuyerList(),
builder: (BuildContext context, snapshot) {
if(snapshot.hasData){
if(snapshot.connectionState == ConnectionState.waiting){
return Center(
child: CircularProgressIndicator(),
);
}else{
Center(
child: Text('data loaded')
);
}
}else if (snapshot.hasError){
Text('no data');
}
},
),
我还没有将快照加载到 Listview 中,因为我正在尝试让 FutureBuilder 至少 运行 成功。但我不断收到 FutureBuilder 空错误。
我尝试 运行通过返回一个列表将函数作为非 void 函数,但是我在编译时收到一个错误,说我无法将 Map 分配给 Future>。
请帮忙。
@Peter Haddad 的回答是正确的,但我还需要通过添加 AsyncSnapshot<QuerySnapshot>
:
来更改生成器
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)
使用FutureBuilder
时需要添加return:
FutureBuilder(
future: getBuyerList(),
builder: (BuildContext context, snapshot) {
if(snapshot.hasData){
if(snapshot.connectionState == ConnectionState.waiting){
return Center(
child: CircularProgressIndicator(),
);
}else{
Center(
child: Text('data loaded')
);
}
}else if (snapshot.hasError){
Text('no data');
}
return CircularProgressIndicator();
},
),
return CircularProgressIndicator();
因为 AsyncWidgetBuilder
return 是 Widget
。此外,如果 FutureBuilder
是 build
函数中的顶级小部件,那么您需要 return 它:
return FutureBuilder( /*...*/)
关于函数 getBuyerList()
执行以下操作:
Future<QuerySnapshot> getBuyerList() async {
return await Firestore.instance
.collection('Deals')
.where('buyer_id', isEqualTo: uid_global)
.getDocuments();
}
我正在尝试根据我在 Firestore 中的文档构建一个列表。下面是我的未来功能:
Future getBuyerList() async {
await Firestore.instance.collection('Deals').where('buyer_id',isEqualTo: uid_global).snapshots().listen((data) {
data.documents.forEach((doc) {
print('in function - ${doc["car"]}');
print(doc.data);
});
});
}
上面的 运行 在调试器中没问题。它显示了我希望放入列表中的项目的完整列表。
我的小部件树中的 Future Builder 如下所示:
FutureBuilder(
future: getBuyerList(),
builder: (BuildContext context, snapshot) {
if(snapshot.hasData){
if(snapshot.connectionState == ConnectionState.waiting){
return Center(
child: CircularProgressIndicator(),
);
}else{
Center(
child: Text('data loaded')
);
}
}else if (snapshot.hasError){
Text('no data');
}
},
),
我还没有将快照加载到 Listview 中,因为我正在尝试让 FutureBuilder 至少 运行 成功。但我不断收到 FutureBuilder 空错误。
我尝试 运行通过返回一个列表将函数作为非 void 函数,但是我在编译时收到一个错误,说我无法将 Map 分配给 Future>。
请帮忙。
@Peter Haddad 的回答是正确的,但我还需要通过添加 AsyncSnapshot<QuerySnapshot>
:
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)
使用FutureBuilder
时需要添加return:
FutureBuilder(
future: getBuyerList(),
builder: (BuildContext context, snapshot) {
if(snapshot.hasData){
if(snapshot.connectionState == ConnectionState.waiting){
return Center(
child: CircularProgressIndicator(),
);
}else{
Center(
child: Text('data loaded')
);
}
}else if (snapshot.hasError){
Text('no data');
}
return CircularProgressIndicator();
},
),
return CircularProgressIndicator();
因为 AsyncWidgetBuilder
return 是 Widget
。此外,如果 FutureBuilder
是 build
函数中的顶级小部件,那么您需要 return 它:
return FutureBuilder( /*...*/)
关于函数 getBuyerList()
执行以下操作:
Future<QuerySnapshot> getBuyerList() async {
return await Firestore.instance
.collection('Deals')
.where('buyer_id', isEqualTo: uid_global)
.getDocuments();
}