Skip to content

Commit b020e8d

Browse files
Merge pull request #1331 from velten-dev/main
FormBuilderRangeSlider: Correct internal values when min/max changes
2 parents 8038db6 + 217cf8f commit b020e8d

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

lib/src/fields/form_builder_range_slider.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,18 @@ class FormBuilderRangeSlider extends FormBuilderFieldDecoration<RangeValues> {
191191
}) : super(builder: (FormFieldState<RangeValues?> field) {
192192
final state = field as _FormBuilderRangeSliderState;
193193
final effectiveNumberFormat = numberFormat ?? NumberFormat.compact();
194-
if (initialValue == null) {
195-
field.setValue(RangeValues(min, min));
194+
if (field.value == null ||
195+
field.value!.start < min ||
196+
field.value!.start > max ||
197+
field.value!.end < min ||
198+
field.value!.end > max) {
199+
if (initialValue == null) {
200+
field.setValue(RangeValues(min, min));
201+
} else {
202+
field.setValue(
203+
RangeValues(initialValue.start, initialValue.end),
204+
);
205+
}
196206
}
197207
return InputDecorator(
198208
decoration: state.decoration,

test/form_builder_range_slider_test.dart

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ void main() {
2727
tester.getBottomRight(find.byType(RangeSlider)).translate(-24, 0);
2828
final Offset rightTarget = topLeft + (bottomRight - topLeft) * 0.5;
2929
await tester.tapAt(rightTarget);
30+
await tester.pumpAndSettle();
3031

3132
expect(formSave(), isTrue);
3233
expect(formValue<RangeValues>(widgetName), const RangeValues(10.0, 15.0));
@@ -54,9 +55,66 @@ void main() {
5455
tester.getBottomRight(find.byType(RangeSlider)).translate(-24, 0);
5556
final Offset leftTarget = topLeft + (bottomRight - topLeft) * 0.1;
5657
await tester.tapAt(leftTarget);
58+
await tester.pumpAndSettle();
5759

5860
expect(formSave(), isTrue);
5961
expect(formValue<RangeValues>(widgetName), const RangeValues(11.0, 18.0));
6062
});
63+
64+
testWidgets('Stateful Update', (WidgetTester tester) async {
65+
const widgetName = 'formBuilderRangeSlider';
66+
const testWidget = _FormBuilderRangeSliderStateTest(widgetName);
67+
await tester.pumpWidget(buildTestableFieldWidget(testWidget));
68+
69+
expect(formSave(), isTrue);
70+
expect(
71+
formValue<RangeValues?>(widgetName),
72+
equals(const RangeValues(-10.0, 10.0)),
73+
);
74+
75+
await tester.tapAt(tester.getCenter(find.byType(TextButton)));
76+
await tester.pumpAndSettle();
77+
78+
expect(formSave(), isTrue);
79+
expect(
80+
formValue<RangeValues?>(widgetName),
81+
equals(const RangeValues(-9.0, 9.0)),
82+
);
83+
});
6184
});
6285
}
86+
87+
class _FormBuilderRangeSliderStateTest extends StatefulWidget {
88+
final String name;
89+
90+
const _FormBuilderRangeSliderStateTest(this.name);
91+
92+
@override
93+
State<StatefulWidget> createState() =>
94+
_FormBuilderRangeSliderStateTestState();
95+
}
96+
97+
class _FormBuilderRangeSliderStateTestState
98+
extends State<_FormBuilderRangeSliderStateTest> {
99+
double range = 10;
100+
101+
@override
102+
Widget build(BuildContext context) {
103+
return Row(
104+
children: [
105+
Expanded(
106+
child: FormBuilderRangeSlider(
107+
name: widget.name,
108+
min: -range,
109+
max: range,
110+
initialValue: RangeValues(-range, range),
111+
),
112+
),
113+
TextButton(
114+
onPressed: () => setState(() => range -= 1),
115+
child: const Text('Reduce Range'),
116+
)
117+
],
118+
);
119+
}
120+
}

0 commit comments

Comments
 (0)