applyDefaultImageSize function

dynamic applyDefaultImageSize(
  1. dynamic node,
  2. AutoImageSize defaultSize
)

Fills in the global icon size for any image that did not specify one.

Native code defaults a missing size to 0.7, so this walker exists purely to let FlutterCarplay.iconSize override that default without every model having to reach for global state at construction time. Per-image AutoImageSize values already present are left untouched.

The node is mutated in place and also returned for convenience.

Implementation

dynamic applyDefaultImageSize(dynamic node, AutoImageSize defaultSize) {
  if (node is Map) {
    for (final entry in autoImageSizeKeys.entries) {
      final image = node[entry.key];
      if (image is! String || image.isEmpty) continue;
      if (node[entry.value] == null) {
        node[entry.value] = defaultSize.toJson();
      }
    }

    for (final entry in autoImageSizeListKeys.entries) {
      final images = node[entry.key];
      if (images is! List) continue;
      final existing = node[entry.value];
      final sizes = <Map<String, dynamic>?>[];
      for (var i = 0; i < images.length; i++) {
        final provided = existing is List && i < existing.length
            ? existing[i]
            : null;
        sizes.add(
          provided is Map<String, dynamic> ? provided : defaultSize.toJson(),
        );
      }
      node[entry.value] = sizes;
    }

    for (final key in node.keys.toList()) {
      if (_sizeKeys.contains(key)) continue;
      final value = node[key];
      // Rasterized SVG bytes are themselves a List<int>; descending into them
      // would walk every individual byte.
      if (value is Uint8List) continue;
      applyDefaultImageSize(value, defaultSize);
    }
  } else if (node is List) {
    for (final item in node) {
      if (item is Uint8List) continue;
      applyDefaultImageSize(item, defaultSize);
    }
  }

  return node;
}