@@ -61,6 +61,23 @@ void main() {
6161 expect (controller.value, isFalse);
6262 });
6363
64+ test ('executeWithLoading does not call onChanged when value is unchanged' ,
65+ () async {
66+ final controller = LoadSwitchController (initialValue: true );
67+ final events = < String > [];
68+
69+ await controller.executeWithLoading (
70+ () async => true , // returns the same value as current
71+ onChanged: (value) {
72+ events.add ('changed:$value ' );
73+ },
74+ );
75+
76+ expect (controller.value, isTrue);
77+ expect (events, isEmpty,
78+ reason: 'onChanged must not fire when the value did not change' );
79+ });
80+
6481 test ('toggle respects active and loading state' , () {
6582 final controller = LoadSwitchController (initialValue: false );
6683
@@ -108,7 +125,8 @@ void main() {
108125 expect (value, isTrue);
109126 });
110127
111- testWidgets ('inactive managed switch blocks interaction' , (
128+ testWidgets (
129+ 'inactive managed switch fires onTap but blocks toggle and onChanged' , (
112130 WidgetTester tester,
113131 ) async {
114132 var tapCount = 0 ;
@@ -132,7 +150,9 @@ void main() {
132150 await tester.tap (find.byType (LoadSwitch ));
133151 await tester.pump ();
134152
135- expect (tapCount, 0 );
153+ // onTap fires so callers can show feedback (tooltip, snackbar, etc.)
154+ // explaining why the switch is disabled.
155+ expect (tapCount, 1 );
136156 expect (toggleCount, 0 );
137157 });
138158
@@ -608,6 +628,40 @@ void main() {
608628 semantics.dispose ();
609629 });
610630
631+ testWidgets (
632+ 'onChanged is not called when onToggle returns the current value' , (
633+ WidgetTester tester,
634+ ) async {
635+ bool value = false ;
636+ final events = < String > [];
637+
638+ await tester.pumpWidget (
639+ _wrapWithApp (
640+ StatefulBuilder (
641+ builder: (context, setState) {
642+ return LoadSwitch .managed (
643+ value: value,
644+ onToggle: () async => false , // returns same value as current
645+ onChanged: (nextValue) {
646+ events.add ('changed:$nextValue ' );
647+ setState (() {
648+ value = nextValue;
649+ });
650+ },
651+ );
652+ },
653+ ),
654+ ),
655+ );
656+
657+ await tester.tap (find.byType (LoadSwitch ));
658+ await tester.pumpAndSettle ();
659+
660+ expect (value, isFalse);
661+ expect (events, isEmpty,
662+ reason: 'onChanged must not fire when value did not change' );
663+ });
664+
611665 testWidgets ('keyboard activation toggles the switch' , (
612666 WidgetTester tester,
613667 ) async {
0 commit comments