Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit d3bc2bb

Browse files
authored
[framework] fix RangeSlider regression due to touch slop changes (#106094)
1 parent d88212c commit d3bc2bb

File tree

2 files changed

+122
-4
lines changed

2 files changed

+122
-4
lines changed

packages/flutter/lib/src/material/range_slider.dart

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,7 @@ class _RangeSliderRenderObjectWidget extends LeafRenderObjectWidget {
704704
textDirection: Directionality.of(context),
705705
semanticFormatterCallback: semanticFormatterCallback,
706706
platform: Theme.of(context).platform,
707+
gestureSettings: MediaQuery.of(context).gestureSettings,
707708
);
708709
}
709710

@@ -724,7 +725,8 @@ class _RangeSliderRenderObjectWidget extends LeafRenderObjectWidget {
724725
..onChangeEnd = onChangeEnd
725726
..textDirection = Directionality.of(context)
726727
..semanticFormatterCallback = semanticFormatterCallback
727-
..platform = Theme.of(context).platform;
728+
..platform = Theme.of(context).platform
729+
..gestureSettings = MediaQuery.of(context).gestureSettings;
728730
}
729731
}
730732

@@ -744,6 +746,7 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix
744746
required this.onChangeEnd,
745747
required _RangeSliderState state,
746748
required TextDirection textDirection,
749+
required DeviceGestureSettings gestureSettings,
747750
}) : assert(values != null),
748751
assert(values.start >= 0.0 && values.start <= 1.0),
749752
assert(values.end >= 0.0 && values.end <= 1.0),
@@ -768,12 +771,14 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix
768771
..onStart = _handleDragStart
769772
..onUpdate = _handleDragUpdate
770773
..onEnd = _handleDragEnd
771-
..onCancel = _handleDragCancel;
774+
..onCancel = _handleDragCancel
775+
..gestureSettings = gestureSettings;
772776
_tap = TapGestureRecognizer()
773777
..team = team
774778
..onTapDown = _handleTapDown
775779
..onTapUp = _handleTapUp
776-
..onTapCancel = _handleTapCancel;
780+
..onTapCancel = _handleTapCancel
781+
..gestureSettings = gestureSettings;
777782
_overlayAnimation = CurvedAnimation(
778783
parent: _state.overlayController,
779784
curve: Curves.fastOutSlowIn,
@@ -882,6 +887,12 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix
882887
markNeedsSemanticsUpdate();
883888
}
884889

890+
DeviceGestureSettings? get gestureSettings => _drag.gestureSettings;
891+
set gestureSettings(DeviceGestureSettings? gestureSettings) {
892+
_drag.gestureSettings = gestureSettings;
893+
_tap.gestureSettings = gestureSettings;
894+
}
895+
885896
SemanticFormatterCallback? _semanticFormatterCallback;
886897
SemanticFormatterCallback? get semanticFormatterCallback => _semanticFormatterCallback;
887898
set semanticFormatterCallback(SemanticFormatterCallback? value) {

packages/flutter/test/material/range_slider_test.dart

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
65
import 'package:flutter/foundation.dart';
6+
import 'package:flutter/gestures.dart';
77
import 'package:flutter/material.dart';
88
import 'package:flutter/rendering.dart';
99
import 'package:flutter/src/physics/utils.dart' show nearEqual;
@@ -12,6 +12,113 @@ import 'package:flutter_test/flutter_test.dart';
1212
import '../rendering/mock_canvas.dart';
1313

1414
void main() {
15+
// Regression test for https://github.com/flutter/flutter/issues/105833
16+
testWidgets('Drag gesture uses provided gesture settings', (WidgetTester tester) async {
17+
RangeValues values = const RangeValues(0.1, 0.5);
18+
bool dragStarted = false;
19+
final Key sliderKey = UniqueKey();
20+
21+
await tester.pumpWidget(
22+
MaterialApp(
23+
home: Directionality(
24+
textDirection: TextDirection.ltr,
25+
child: StatefulBuilder(
26+
builder: (BuildContext context, StateSetter setState) {
27+
return Material(
28+
child: Center(
29+
child: GestureDetector(
30+
behavior: HitTestBehavior.deferToChild,
31+
onHorizontalDragStart: (DragStartDetails details) {
32+
dragStarted = true;
33+
},
34+
child: MediaQuery(
35+
data: MediaQuery.of(context).copyWith(gestureSettings: const DeviceGestureSettings(touchSlop: 20)),
36+
child: RangeSlider(
37+
key: sliderKey,
38+
values: values,
39+
onChanged: (RangeValues newValues) {
40+
setState(() {
41+
values = newValues;
42+
});
43+
},
44+
),
45+
),
46+
),
47+
),
48+
);
49+
},
50+
),
51+
),
52+
),
53+
);
54+
55+
TestGesture drag = await tester.startGesture(tester.getCenter(find.byKey(sliderKey)));
56+
await tester.pump(kPressTimeout);
57+
58+
// Less than configured touch slop, more than default touch slop
59+
await drag.moveBy(const Offset(19.0, 0));
60+
await tester.pump();
61+
62+
expect(values, const RangeValues(0.1, 0.5));
63+
expect(dragStarted, true);
64+
65+
dragStarted = false;
66+
67+
await drag.up();
68+
await tester.pumpAndSettle();
69+
70+
drag = await tester.startGesture(tester.getCenter(find.byKey(sliderKey)));
71+
await tester.pump(kPressTimeout);
72+
73+
bool sliderEnd = false;
74+
75+
await tester.pumpWidget(
76+
MaterialApp(
77+
home: Directionality(
78+
textDirection: TextDirection.ltr,
79+
child: StatefulBuilder(
80+
builder: (BuildContext context, StateSetter setState) {
81+
return Material(
82+
child: Center(
83+
child: GestureDetector(
84+
behavior: HitTestBehavior.deferToChild,
85+
onHorizontalDragStart: (DragStartDetails details) {
86+
dragStarted = true;
87+
},
88+
child: MediaQuery(
89+
data: MediaQuery.of(context).copyWith(gestureSettings: const DeviceGestureSettings(touchSlop: 10)),
90+
child: RangeSlider(
91+
key: sliderKey,
92+
values: values,
93+
onChanged: (RangeValues newValues) {
94+
setState(() {
95+
values = newValues;
96+
});
97+
},
98+
onChangeEnd: (RangeValues newValues) {
99+
sliderEnd = true;
100+
},
101+
),
102+
),
103+
),
104+
),
105+
);
106+
},
107+
),
108+
),
109+
),
110+
);
111+
112+
// More than touch slop.
113+
await drag.moveBy(const Offset(12.0, 0));
114+
115+
await drag.up();
116+
await tester.pumpAndSettle();
117+
118+
expect(sliderEnd, true);
119+
expect(dragStarted, false);
120+
});
121+
15122
testWidgets('Range Slider can move when tapped (continuous LTR)', (WidgetTester tester) async {
16123
RangeValues values = const RangeValues(0.3, 0.7);
17124

0 commit comments

Comments
 (0)