From 8b17f0a103f584b0ae965a5ac90a1edc904b3652 Mon Sep 17 00:00:00 2001 From: Mithul Nayagam Date: Fri, 13 Jun 2025 12:43:06 +0530 Subject: [PATCH] Fixes and changes to DynamicView placeholder replacement logic - Added support for array references in double curlies - Fix for placeholders not working for nested DynamicView --- .../stac_dynamic_view_parser.dart | 53 ++++++++++++++++--- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart index 2d257faa..1bd2273a 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart @@ -95,14 +95,53 @@ class StacDynamicViewParser extends StacParser { dynamic _extractNestedData(dynamic data, List keys) { dynamic current = data; + final RegExp arrayKeyRegex = RegExp(r'(\w+)\[(\d+)\]'); + for (final key in keys) { - if (current is Map && current.containsKey(key)) { - current = current[key]; + Match? arrayMatch = arrayKeyRegex.firstMatch(key); + + if (arrayMatch != null) { + final String actualKey = arrayMatch.group(1)!; + final int index = int.parse(arrayMatch.group(2)!); + + if (current is Map && current.containsKey(actualKey)) { + dynamic potentialList = current[actualKey]; + if (potentialList is List) { + if (index >= 0 && index < potentialList.length) { + current = potentialList[index]; + } else { + return null; + } + } else { + return null; + } + } else { + return null; + } } else { - return null; + if (current is Map && current.containsKey(key)) { + current = current[key]; + } else if (current is List) { + try { + int index = int.parse(key); + if (index >= 0 && index < current.length) { + current = current[index]; + } else { + return null; + } + } catch (e) { + return null; + } + } else { + return null; + } } } - return current; + if (current == null) { + return "null"; + } else { + return current; + } } Map _applyDataToTemplate( @@ -218,8 +257,10 @@ class StacDynamicViewParser extends StacParser { // Extract the value from the data final dataValue = _extractNestedData(data, keys); - processedValue = - processedValue.replaceAll(placeholder, dataValue.toString()); + if (dataValue != null) { + processedValue = processedValue.replaceAll( + placeholder, dataValue.toString()); + } } template[key] = processedValue;