Dart中FutureBuilder调用Future.wait报错:void类型无法使用求助
解决Firestore批量读取集合的Future.wait报错问题
错误原因
你遇到的"This expression has a type of 'void' so its value can't be used"错误,是因为futures()方法返回类型为void,但FutureBuilder要求传入一个Future类型的参数,类型不匹配导致报错。
修改方案
- 调整
futures()方法的返回类型,让它返回批量请求的结果; - 同步修改
FutureBuilder的泛型,匹配返回的结果类型; - 在builder中处理两个集合的查询结果。
修改后的完整代码
class Checking extends StatefulWidget { static const String id = "Checking"; @override State<Checking> createState() => _CheckingState(); } class _CheckingState extends State<Checking> { Future<QuerySnapshot<Map<String, dynamic>>> getthosedocuments() async { QuerySnapshot<Map<String, dynamic>> snapshot = await FirebaseFirestore.instance .collection('testfz') .get(); return snapshot; } Future<QuerySnapshot<Map<String, dynamic>>> getthosedocuments1() async { QuerySnapshot<Map<String, dynamic>> snapshot = await FirebaseFirestore.instance .collection('testfz') .doc('id') .collection('subcollection') .get(); return snapshot; } // 修改返回类型,返回Future.wait的结果 Future<List<QuerySnapshot<Map<String, dynamic>>>> futures() async { return Future.wait([getthosedocuments(), getthosedocuments1()]); } @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( // 调整FutureBuilder泛型为List<QuerySnapshot<...>> child: FutureBuilder<List<QuerySnapshot<Map<String, dynamic>>>>( future: futures(), builder: (context, snapshotsub) { if (snapshotsub.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } if (snapshotsub.hasError) { return Text('请求出错: ${snapshotsub.error}'); } // 获取两个集合的查询结果 final mainCollectionSnapshot = snapshotsub.data![0]; final subCollectionSnapshot = snapshotsub.data![1]; // 可以合并两个集合的文档,或者分别处理 final allDocs = [ ...mainCollectionSnapshot.docs, ...subCollectionSnapshot.docs, ]; return ListView.builder( shrinkWrap: true, physics: const ScrollPhysics(), itemCount: allDocs.length, itemBuilder: (context, index) { final doc = allDocs[index]; // 这里添加你的UI展示逻辑,比如Text(doc.data().toString()) return ListTile( title: Text(doc.id), subtitle: Text(doc.data().toString()), ); }, ); }, ), ), ); } }
关键修改说明
futures()方法:将返回类型从void改为Future<List<QuerySnapshot<Map<String, dynamic>>>>,并直接返回Future.wait的执行结果,这样FutureBuilder就能拿到合法的Future参数。FutureBuilder泛型:从QuerySnapshot改为List<QuerySnapshot<Map<String, dynamic>>>,匹配批量请求返回的结果结构。- 结果处理:在builder中通过
snapshotsub.data![0]和snapshotsub.data![1]分别获取两个集合的查询快照,你可以根据需求合并文档或者分别渲染不同的UI。
内容的提问来源于stack exchange,提问作者The DeSire
相关产品推荐
相关产品推荐

