deepMergeMaps function

Map<String, dynamic> deepMergeMaps(
  1. Map<String, dynamic> map1,
  2. Map<String, dynamic> map2, {
  3. bool mergeInnerMaps = true,
})

map1 has priority over map2.

Implementation

Map<String, dynamic> deepMergeMaps(
  Map<String, dynamic> map1,
  Map<String, dynamic> map2, {
  bool mergeInnerMaps = true,
}) {
  final result = <String, dynamic>{};

  for (final mapEntry in [...map1.entries, ...map2.entries]) {
    if (!result.containsKey(mapEntry.key)) {
      result[mapEntry.key] = mapEntry.value;
      continue;
    }

    if (result[mapEntry.key] is Map) {
      if (mapEntry.value is! Map) {
        throw Exception(
          'Tried to merge ${result[mapEntry.key].runtimeType} and ${mapEntry.value.runtimeType}',
        );
      }

      if (mergeInnerMaps) {
        result[mapEntry.key] = deepMergeMaps(
          result[mapEntry.key],
          mapEntry.value,
        );
      } else {
        result[mapEntry.key] = mapEntry.value;
      }
    }
  }

  return result;
}