You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型的参数,类型不匹配导致报错。

修改方案

  1. 调整futures()方法的返回类型,让它返回批量请求的结果;
  2. 同步修改FutureBuilder的泛型,匹配返回的结果类型;
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:17:43