@@ -742,23 +742,27 @@ class FVariantsDelta<K extends FVariantConstraint, E extends FVariant, V, D exte
742742
743743// Delta-based operations.
744744class FVariantOperation<K extends FVariantConstraint, E extends FVariant, V, D extends Delta<V>> {
745- // Adds a new variant
746- FVariantOperation.add(Set<K> constraints, D delta);
747-
748745 // Applies [delta] to the base without modifying existing variants.
749746 FVariantOperation.onBase(D delta);
750747
751- // Applies [delta] to variants whose constraints are satisfied by [variants].
752- FVariantOperation.on(Set<E> variants, D delta);
748+ // Applies [delta] to the base and associates the result with each constraint in [constraints].
749+ // Creates exact entries rather than matching existing variants.
750+ FVariantOperation.on(Set<K> constraints, D delta);
751+
752+ // Applies [delta] to existing variants whose constraint's variants are all present in [variants].
753+ FVariantOperation.onMatching(Set<E> variants, D delta);
753754
754755 // Applies [delta] to all variants.
755756 FVariantOperation.onVariants(D delta);
756757
757758 // Applies [delta] to all variants and base.
758759 FVariantOperation.onAll(D delta);
759760
760- // Removes variants matching [variants].
761- FVariantOperation.remove(Set<E> variants);
761+ // Removes exact [constraints] from existing variants.
762+ FVariantOperation.remove(Set<K> constraints);
763+
764+ // Removes existing variants whose constraint's variants are all present in [variants].
765+ FVariantOperation.removeMatching(Set<E> variants);
762766
763767 // Removes all variants.
764768 FVariantOperation.removeAll();
@@ -776,39 +780,48 @@ class FVariantsValueDelta<K extends FVariantConstraint, E extends FVariant, V> w
776780
777781// Concrete value-based operations
778782class FVariantValueDeltaOperation<K extends FVariantConstraint, E extends FVariant, V> {
779- // Adds a new variant
780- FVariantValueDeltaOperation.add(Set<K> constraints, V value);
781-
782783 // Replaces the base with [base].
783784 FVariantValueDeltaOperation.onBase(V base);
784785
785- // Replaces variants matching [variants] with [value].
786- FVariantValueDeltaOperation.on(Set<E> variants, V value);
786+ // Sets [value] for each constraint in [constraints], creating or overriding entries.
787+ // Creates exact entries rather than matching existing variants.
788+ FVariantValueDeltaOperation.on(Set<K> constraints, V value);
789+
790+ // Replaces existing variants whose constraint's variants are all present in [variants].
791+ FVariantValueDeltaOperation.onMatching(Set<E> variants, V value);
787792
788793 // Replaces all variants with [value].
789794 FVariantValueDeltaOperation.onVariants(V value);
790795
791796 // Replaces all variants and base with [value].
792797 FVariantValueDeltaOperation.onAll(V value);
793798
794- // Removes variants matching [variants].
795- FVariantValueDeltaOperation.remove(Set<E> variants);
799+ // Removes exact [constraints] from existing variants.
800+ FVariantValueDeltaOperation.remove(Set<K> constraints);
801+
802+ // Removes existing variants whose constraint's variants are all present in [variants].
803+ FVariantValueDeltaOperation.removeMatching(Set<E> variants);
796804
797805 // Removes all variants.
798806 FVariantValueDeltaOperation.removeAll();
799807}
800808```
801809
802- The ` on ` and remove` operations use inclusive matching. For example: ` .on({.hovered, .focused}, delta)` affects:
810+ The ` on ` and ` remove ` operations work on ** exact** constraint entries. For example, ` .on({.hovered, .focused}, delta) `
811+ creates separate entries for ` .hovered ` and ` .focused ` , but not ` .hovered.and(.focused) ` .
812+
813+ In contrast, ` onMatching ` and ` removeMatching ` match constraints whose variants are all present in the given set.
814+ For example, ` .onMatching({.hovered, .focused}, delta) ` affects constraints that are ** satisfied by** ` {.hovered, .focused} ` :
803815
804816``` dart
805817final decoration = FVariants.delta(
806818 BoxDecoration(color: Colors.white),
807819 variants: {
808- [.hovered]: .delta(color: Colors.blue), // ✓ contains hovered
809- [.hovered, .pressed]: .delta(color: Colors.darkBlue), // ✓ contains hovered
810- [.focused]: .delta(color: Colors.green), // ✓ contains focused
811- [.disabled]: .value(BoxDecoration(color: Colors.grey)), // ✗ contains neither
820+ [.hovered]: .delta(color: Colors.blue), // ✓ hovered ⊆ {hovered, focused}
821+ [.hovered.and(.focused)]: .delta(color: Colors.darkBlue), // ✓ hovered & focused ⊆ {hovered, focused}
822+ [.focused]: .delta(color: Colors.green), // ✓ focused ⊆ {hovered, focused}
823+ [.hovered.and(.pressed)]: .delta(color: Colors.red), // ✗ pressed ∉ {hovered, focused}
824+ [.disabled]: .value(BoxDecoration(color: Colors.grey)), // ✗ disabled ∉ {hovered, focused}
812825 },
813826);
814827```
@@ -822,8 +835,8 @@ FTappable(
822835 style: .delta(
823836 // Apply all modifications without needing to extract base variant.
824837 decoration: .apply([
825- .on ({.hovered}, .delta(color: Colors.blue)),
826- .on ({.pressed}, .delta(color: Colors.darkBlue)),
838+ .onMatching ({.hovered}, .delta(color: Colors.blue)),
839+ .onMatching ({.pressed}, .delta(color: Colors.darkBlue)),
827840 ]),
828841 ),
829842)
@@ -837,7 +850,7 @@ Lastly, `FVariants` also provides `apply(...)` and `applyValues(...)` which dire
837850``` dart
838851final updated = variants.apply([
839852 .onAll(.delta(color: Colors.blue)),
840- .add ({.disabled}, .delta(color: Colors.grey)),
853+ .on ({.disabled}, .delta(color: Colors.grey)),
841854]);
842855```
843856
0 commit comments