diff --git a/lib/src/form/src/widgets/consumers.dart b/lib/src/form/src/widgets/consumers.dart index 4b8eb87..eafd445 100644 --- a/lib/src/form/src/widgets/consumers.dart +++ b/lib/src/form/src/widgets/consumers.dart @@ -34,6 +34,40 @@ class AstromicFieldConsumer extends StatelessWidget { } } +class AstromicMultiFieldConsumer extends StatelessWidget { + const AstromicMultiFieldConsumer({ + super.key, + required this.controller, + required this.ids, + required this.builder, + }); + + final AstromicFormController controller; + final List ids; + + // Returns a Map where key is the field ID and value is the current field value + final Widget Function(BuildContext context, Map values) builder; + + @override + Widget build(BuildContext context) { + // 1. Get all the listenable nodes for the requested IDs + final nodes = ids.map((id) => controller.node(id)).toList(); + + // 2. Use Listenable.merge to create a single trigger for all nodes + return AnimatedBuilder( + animation: Listenable.merge(nodes), + builder: (context, _) { + // 3. Rebuild the map of current values whenever any node changes + final values = { + for (var id in ids) id: controller.tryGet(id), + }; + + return builder(context, values); + }, + ); + } +} + /// A reactive consumer that listens to an entire dynamic group and its nested fields. /// /// Rebuilds whenever the group manifest changes (items added/removed) or when