applyDefaultImageSize function
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;
}