File tree Expand file tree Collapse file tree 2 files changed +39
-2
lines changed Expand file tree Collapse file tree 2 files changed +39
-2
lines changed Original file line number Diff line number Diff line change @@ -612,6 +612,11 @@ class _SliderState extends State<Slider> with TickerProviderStateMixin {
612
612
613
613
bool _dragging = false ;
614
614
615
+ // For discrete sliders, _handleChanged might receive the same value
616
+ // multiple times. To avoid calling widget.onChanged repeatedly, the
617
+ // value from _handleChanged is temporarily saved here.
618
+ double ? _currentChangedValue;
619
+
615
620
FocusNode ? _focusNode;
616
621
FocusNode get focusNode => widget.focusNode ?? _focusNode! ;
617
622
@@ -664,8 +669,11 @@ class _SliderState extends State<Slider> with TickerProviderStateMixin {
664
669
void _handleChanged (double value) {
665
670
assert (widget.onChanged != null );
666
671
final double lerpValue = _lerp (value);
667
- if (lerpValue != widget.value) {
668
- widget.onChanged !(lerpValue);
672
+ if (_currentChangedValue != lerpValue) {
673
+ _currentChangedValue = lerpValue;
674
+ if (_currentChangedValue != widget.value) {
675
+ widget.onChanged !(_currentChangedValue! );
676
+ }
669
677
}
670
678
}
671
679
@@ -676,6 +684,7 @@ class _SliderState extends State<Slider> with TickerProviderStateMixin {
676
684
677
685
void _handleDragEnd (double value) {
678
686
_dragging = false ;
687
+ _currentChangedValue = null ;
679
688
widget.onChangeEnd? .call (_lerp (value));
680
689
}
681
690
Original file line number Diff line number Diff line change @@ -4253,4 +4253,32 @@ void main() {
4253
4253
);
4254
4254
});
4255
4255
});
4256
+
4257
+ // This is a regression test for https://github.com/flutter/flutter/issues/143524.
4258
+ testWidgets ('Discrete Slider.onChanged is called only once' , (WidgetTester tester) async {
4259
+ int onChangeCallbackCount = 0 ;
4260
+ await tester.pumpWidget (
4261
+ MaterialApp (
4262
+ home: Scaffold (
4263
+ body: Center (
4264
+ child: Slider (
4265
+ max: 5 ,
4266
+ divisions: 5 ,
4267
+ value: 0 ,
4268
+ onChanged: (double newValue) {
4269
+ onChangeCallbackCount++ ;
4270
+ },
4271
+ ),
4272
+ ),
4273
+ ),
4274
+ ),
4275
+ );
4276
+
4277
+ final TestGesture gesture = await tester.startGesture (tester.getTopLeft (find.byType (Slider )));
4278
+ await tester.pump (kLongPressTimeout);
4279
+ await gesture.moveBy (const Offset (160.0 , 0.0 ));
4280
+ await gesture.moveBy (const Offset (1.0 , 0.0 ));
4281
+ await gesture.moveBy (const Offset (1.0 , 0.0 ));
4282
+ expect (onChangeCallbackCount, 1 );
4283
+ });
4256
4284
}
You can’t perform that action at this time.
0 commit comments