From 25b9366131c4f25bfefece0207e2f7acb4a95ed7 Mon Sep 17 00:00:00 2001 From: Michael Aziz Date: Sun, 25 Jan 2026 17:26:18 +0200 Subject: [PATCH] [FEAT] Added a multiConsumer --- lib/src/form/src/widgets/consumers.dart | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+) 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