在使用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相关问答推荐

无效字符(位于字符68处)flutter—update—... europe-west1.firebasedatabase.app/

Flutter 翼doctor 显示的错误,我似乎不能修复.问题:系统32、Android工具链、Windows 10 SDK

就像Flutter 中的头文件一样?

我有相关的下拉菜单Flutter Windows应用程序的问题

怎么才能像这样在摆动着这些曲线呢?

Ffltter Firebase向用户添加公司

Flutter:注册 UI 出现 UI 问题(将注册框提升到顶部并向电话号码 pin 码添加一个框)

尽管海拔设置为 0,如何删除 appBar 下的下划线

Flutter Firebase 升级后出现问题? ARC 语义问题 (Xcode): Select 器appleCredentialWithIDToken:rawNonce:fullName:没有已知的类方法

如何停止折线图的抖动

Flutter - 展开图标无法正常工作

无法使用 bloc 更新 ListView.builder 的特定时间

如何从底部导航栏打开 bottomModal 表?

我可以定义一次 sharedPreferences 并在需要数据显示到 flutter 应用程序时调用它吗?

容器在发布模式下显示灰色框(抖动)

如何在 flutter 中创建渐变按钮

如何在 Flutter 中创建 Facebook 创建帖子屏幕?

单元测试中如何比较NaN和NaN是否相等

无法在Flutter 图像小部件中打开大尺寸(500MB)图像

TextSpan 避免符号字符串组上的换行符