在使用Firebase Firestore时,我遇到了以下错误:

E/flutter ( 4477): [ERROR:flutter/shell/common/shell.cc(93)] Dart Unhandled Exception: type 'Future<Group>' is not a subtype of type 'Group', stack trace: #0      new List.from (dart:core-patch/array_patch.dart:41:5)
E/flutter ( 4477): #1      GroupService.getGroups (package:money_manager/core/services/group_service.dart:56:21)
E/flutter ( 4477): <asynchronous suspension>
E/flutter ( 4477): #2      GroupViewModel._getAllGroups (package:money_manager/core/view_models/group_viewmodel.dart:44:26)
E/flutter ( 4477): <asynchronous suspension>
E/flutter ( 4477):

尽管我认为我已经在必要的地方正确地使用了async Wait,但我无法找出这个错误.相关代码:

group-service.dart年:

Future<List<Group>> getGroups() async {
    final userData = await getUserData();
    List<Group> groups = [];

    if (userData['groups'] != null) {
      List<String> groupIds = List.from(userData['groups'].map((e) => e['id']));
      groups = List.from(groupIds.map((e) async {
        return await getGroupFromId(e);
      }));
    }

    return groups;
  }

  Future<Group> getGroupFromId(String groupId) async {
    final groupData = await getGroupData(groupId);
    return Group.fromJson(groupData);
  }

  Future<Map<String, dynamic>> getGroupData(String groupId) async {
    DocumentReference groupDoc =
        FirebaseFirestore.instance.collection('groups').doc(groupId);
    final snapshot = await groupDoc.get();
    Map<String, dynamic> groupData = snapshot.data() as Map<String, dynamic>;
    return groupData;
  }

group_viewmodel.dart年:

List<Group> _userGroups = [];
 void _getAllGroups() async {
    List<Group> groups = await _groupService.getGroups();
    _userGroups = groups;
  }

推荐答案

问题在于以下几行:

groups = List.from(groupIds.map((e) async {
   return await getGroupFromId(e);
}));

即使在map()函数的return之前使用await,它仍然会返回Future.map()是一个同步函数,它不会异步运行内部函数.因此,它将返回一个Iterable<Future<Group>>,在List.from()函数中,它无法转换为List<Group>.

有一个方便的函数,它可以获取大量的future ,并等待它们中的每一个,Future.wait().下面是使用它时代码的外观:

groups = List.from(await Future.wait(groupIds.map((e) async {
   return await getGroupFromId(e);
})));

撕下来更好:

groups = List.from(await Future.wait(groupIds.map(getGroupFromId)));

Flutter相关问答推荐

如何在Flutter 中创建拆分容器?正确的方法应该是什么? CustomPainter 还是 Chip?

将密钥传递给子元素时无法正常工作 |Flutter

在 Android Studio 中添加 auto-Const

为 Windows 开发创建新的 Flutter 项目时未启用 Windows 选项

在 Vertica 拖动更新上无法按预期工作

如何独立于语言更改时间选择器的格式

如何等到在 Flutter 中检索到 Firebase 数据库数据?

Flutter 数据表的“showCheckBoxColumn”选项不起作用

我很难将嵌套对象列表的结果转换为概率树结果形式.如下

Flutter“复杂”的 UI 设计,用于将可拖动容器覆盖在另一个容器上

访问BuildContext以从推送通知服务(Flatter)导航

如何订阅 Flutter 中 http 请求返回的响应?

Flutter firebase动态链接不监听

Flutter如何设置包装gridview高度的列

try 使用 Flutter 布局修复底部溢出

下载安全文件以在 Azure Devops Pipelines 中存储代码

错误:找不到成员:'packageRoot',如何解决忽略:Flutter 中的 deprecated_member_use?

任务“:camera:compileDebugJavaWithJavac”执行失败

在 const 构造函数中,不能将“Null”类型的值分配给“String”类型的参数

构建警告:将新 ns 映射到旧 ns