Firestore 查询正在返回数据,但 Futurebuilder 说它不能为空
Posted
技术标签:
【中文标题】Firestore 查询正在返回数据,但 Futurebuilder 说它不能为空【英文标题】:Firestore query is returning data but Futurebuilder saying it cannot be null 【发布时间】:2020-08-26 06:53:20 【问题描述】:我正在尝试根据我在 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)
【问题讨论】:
【参考方案1】:使用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
返回Widget
。此外,如果 FutureBuilder
是 build
函数中的顶部小部件,那么您需要返回它:
return FutureBuilder( /*...*/)
关于函数getBuyerList()
,请执行以下操作:
Future<QuerySnapshot> getBuyerList() async
return await Firestore.instance
.collection('Deals')
.where('buyer_id', isEqualTo: uid_global)
.getDocuments();
【讨论】:
谢谢,但现在圆形进度条似乎一直在显示。问题似乎是列表数据没有被传递到 Futurebuilder,即使它在 Future 中正确检索。它显示在控制台中。 仍然停留在循环进度上。如果我尝试在未来的构建器中打印snapshot.data
,我会在控制台中得到以下内容I/flutter (25272): inside future - Instance of 'QuerySnapshot'
***.com/questions/61698823/… 点此了解如何使用futurebuilder
你需要打印(snapshot.data.data["car"]);
flutter 不允许我输入第二个 .data
。我什至尝试过为此使用streambuilder。似乎没有任何效果以上是关于Firestore 查询正在返回数据,但 Futurebuilder 说它不能为空的主要内容,如果未能解决你的问题,请参考以下文章
Firestore 查询返回未定义快照的位置(Vue.js / Firestore / Vuefire)
如何在 Flutter Firestore 中查询 2 个文档并作为列表返回?