如何有效地从飞镖中的地图检索地图?

时间:2020-04-25 07:35:12

标签: flutter dart

我有一个从Map<String,dynamic>类型的json.decode返回的映射

动态部分包含另一个映射,我希望将其放在单独的变量中。我设法通过以下方式做到这一点:

Map<DateTime, List<DayOffDto>> mapToReturn = Map();

    Map<String, dynamic> responseBody = json.decode(
      response.body,
      reviver: _reviver,
    );
    if (responseBody == null) {
      throw NoDataServerException();
    }
    responseBody.entries.forEach((element) {
     Map map = element.value;
      //map.values;
      map.entries.forEach((element2) {
        mapToReturn[element2.key] = element2.value;
      });
    });
//mapToReturn  contains now the extracted map from responseBody

reviver函数为我做了一些转换

_reviver(dynamic key, dynamic value) {
    if (key != null && value is Map && (key as String).contains("-")) {
      var object = value;

      final DayOffDto dayOffDto = DayOffDto.fromFirebase(
          key_firebase: key as String,
          parsedJson: value,
          rota: rotaParam,
          chosenYear: yearParam);
      DateTime datetime = Helper.getDateTimeFromDayNumber(
        dayOffDto.dayNumber,
        dayOffDto.year,
      );
      Map<DateTime, List<DayOffDto>> internalMap = LinkedHashMap();
      internalMap[datetime] = [dayOffDto];
      return internalMap;
    }

    return value;}

我认为这不是提取的最佳方法。对优化代码有任何想法吗? responseBody.values返回Iterable<V>

所以当我这样做 mapToReturn = responseBody.values我遇到了错误

1 个答案:

答案 0 :(得分:0)

使用Map有时会很困难。我想告诉您,有些事情像mapToReturn = responseBody.values一样容易,但是到今天为止,还没有(我能找到)。

但是,我可以给您一个小代码块,其功能与您的第一个代码块相同。

由于您没有使用第一张地图的keys,因此应该使用responseBody.entries而不是responseBody.values。所以代码块最终会像这样:

responseBody.values.forEach((value) {
  return value is Map<DateTime, List<DayOffDto>>
      ? mapToReturn.addAll(value)
      : null;
});

如果您完全确定值Type(您应该在使用reviver的情况下),则只能使其成为一行代码。

responseBody.values.forEach((value) => mapToReturn.addAll(value));

希望这对您有帮助!