首页 > 解决方案 > 如何将 Firebase RTDB snapshot.value 传输到 Dart/Flutter 类实例

问题描述

我正在尝试将 Firebase RTDB 节点的数据快照传输到 Flutter 中合适的数据结构中。该节点包含一个键列表(用户ID),每个键都包含一个键列表(用户ID)。每个孩子都包含一个键/值对。我想将此数据传输到 AccessList 类型的对象列表中。我需要关于我的 AccessList 类定义应该是什么样子以及如何将数据移动到它们的实例中的建议——因为键值是可变的,我不能像在地图中那样简单地引用它们。

真的无法理解这一点。:-(

这是数据库节点的屏幕转储:

在此处输入图像描述

这是我检索到的 snapshot.value:

snapshot.value: {iSAwyU7bwKO8OBvFDr1DKYZjc5q1: {0cSLt3Sa0FS26QIvOLbin6MFsL43: {accessType: GivenTo}}, xuxkuOjwhOaKVWXtTaK2bP4chdF2: {kblbVzEtkRZ9QREJdSKOqxVJCYg1: {accessType: GivenBy}}, ayEcqzihYEOfTakY5FVaxSgLsjv2: {0cSLt3Sa0FS26QIvOLbin6MFsL43: {accessType: GivenBy}}, as22efYvdjhLeN6U8JF5ozEoQks2: {0cSLt3Sa0FS26QIvOLbin6MFsL43: {accessType: GivenBy}}, 0cSLt3Sa0FS26QIvOLbin6MFsL43: {iSAwyU7bwKO8OBvFDr1DKYZjc5q1: {accessType: GivenBy}, ayEcqzihYEOfTakY5FVaxSgLsjv2: {accessType: GivenTo}, as22efYvdjhLeN6U8JF5ozEoQks2: {accessType: GivenTo}}, kblbVzEtkRZ9QREJdSKOqxVJCYg1: {xuxkuOjwhOaKVWXtTaK2bP4chdF2: {accessType: GivenTo}}}

下面是 Dart 代码的结构,它定义了两个类,一个包含在另一个类中:

class AccessList {
  final String authUserId;
  final List<AccessListItem> accessListItems;

  AccessList({
    @required this.authUserId,
    this.accessListItems,
  });
}

class AccessListItem {
  final String sailorId; // Access relates to this sailor id
  final String accessType;

  AccessListItem({
    @required this.sailorId,
    @required this.accessType,
  });
}

到目前为止我尝试过的代码的简化版本是:

await _referenceSailorBoardAccess.once().then(
  (DataSnapshot snapshot) {
    final List<AccessList> _testFetchedAccessList = [];
    final Map<String, dynamic> _testAccessListData =
        Map<String, dynamic>.from(snapshot.value);
        
    if (snapshot.value != null) {
      _testAccessListData.forEach((String authId, dynamic accessData) {
        final AccessList accessList = AccessList(
          authUserId: authId,
          accessListItems: accessData.toList,
        );
        _testFetchedAccessList.add(accessList);
      });
    }

它显然不起作用,因为我不知道如何处理 accessListItems 列表。我收到以下错误:

NoSuchMethodError:类“_InternalLinkedHashMap”没有实例获取器“toList”。I/flutter (16564):接收方:_LinkedHashMap len:1 I/flutter (16564):尝试调用:toList

真的希望你们能帮助我!

标签: firebase-realtime-databaseflutterdart

解决方案


推荐阅读