Skip to content

Commit 69d655b

Browse files
authored
Add pageStep (#56)
1 parent 0e6594d commit 69d655b

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

lib/src/base_spin_box.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ abstract class BaseSpinBox extends StatefulWidget {
3333
double get min;
3434
double get max;
3535
double get step;
36+
double get pageStep;
3637
double get value;
3738
int get decimals;
3839
int get digits;
@@ -66,8 +67,10 @@ mixin SpinBoxMixin<T extends BaseSpinBox> on State<T> {
6667
return {
6768
// ### TODO: use SingleActivator fixed in Flutter 2.10+
6869
// https://github.com/flutter/flutter/issues/92717
69-
LogicalKeySet(LogicalKeyboardKey.arrowUp): _increaseValue,
70-
LogicalKeySet(LogicalKeyboardKey.arrowDown): _decreaseValue,
70+
LogicalKeySet(LogicalKeyboardKey.arrowUp): _stepUp,
71+
LogicalKeySet(LogicalKeyboardKey.arrowDown): _stepDown,
72+
LogicalKeySet(LogicalKeyboardKey.pageUp): _pageStepUp,
73+
LogicalKeySet(LogicalKeyboardKey.pageDown): _pageStepDown,
7174
};
7275
}
7376

@@ -92,8 +95,11 @@ mixin SpinBoxMixin<T extends BaseSpinBox> on State<T> {
9295
super.dispose();
9396
}
9497

95-
void _increaseValue() => setValue(value + widget.step);
96-
void _decreaseValue() => setValue(value - widget.step);
98+
void _stepUp() => setValue(value + widget.step);
99+
void _stepDown() => setValue(value - widget.step);
100+
101+
void _pageStepUp() => setValue(value + widget.pageStep);
102+
void _pageStepDown() => setValue(value - widget.pageStep);
97103

98104
void _updateValue() {
99105
final v = _parseValue(_controller.text);

lib/src/cupertino/spin_box.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class CupertinoSpinBox extends BaseSpinBox {
5252
this.min = 0,
5353
this.max = 100,
5454
this.step = 1,
55+
this.pageStep = 10,
5556
this.value = 0,
5657
this.interval = const Duration(milliseconds: 100),
5758
this.acceleration,
@@ -119,6 +120,12 @@ class CupertinoSpinBox extends BaseSpinBox {
119120
@override
120121
final double step;
121122

123+
/// The page step size for incrementing and decrementing the value.
124+
///
125+
/// Defaults to `10.0`.
126+
@override
127+
final double pageStep;
128+
122129
/// The current value.
123130
///
124131
/// Defaults to `0.0`.

lib/src/material/spin_box.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class SpinBox extends BaseSpinBox {
5353
this.min = 0,
5454
this.max = 100,
5555
this.step = 1,
56+
this.pageStep = 10,
5657
this.value = 0,
5758
this.interval = const Duration(milliseconds: 100),
5859
this.acceleration,
@@ -117,6 +118,12 @@ class SpinBox extends BaseSpinBox {
117118
@override
118119
final double step;
119120

121+
/// The page step size for incrementing and decrementing the value.
122+
///
123+
/// Defaults to `10.0`.
124+
@override
125+
final double pageStep;
126+
120127
/// The current value.
121128
///
122129
/// Defaults to `0.0`.

test/test_spinbox.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,42 @@ void testInput<S>(TestBuilder builder) {
164164
expect(find.editableText, hasText('0'));
165165
});
166166

167+
testWidgets('page step', (tester) async {
168+
await tester.pumpWidget(builder());
169+
expect(find.editableText, hasFocus);
170+
await tester.showKeyboard(find.byType(S));
171+
172+
await tester.sendKeyEvent(LogicalKeyboardKey.pageDown);
173+
await tester.idle();
174+
expect(tester.state(find.byType(S)), hasValue(0));
175+
expect(find.editableText, hasText('0'));
176+
177+
await tester.sendKeyEvent(LogicalKeyboardKey.pageUp);
178+
await tester.idle();
179+
expect(tester.state(find.byType(S)), hasValue(10));
180+
expect(find.editableText, hasText('10'));
181+
182+
await tester.sendKeyEvent(LogicalKeyboardKey.pageUp);
183+
await tester.idle();
184+
expect(tester.state(find.byType(S)), hasValue(20));
185+
expect(find.editableText, hasText('20'));
186+
187+
await tester.sendKeyEvent(LogicalKeyboardKey.arrowDown);
188+
await tester.idle();
189+
expect(tester.state(find.byType(S)), hasValue(19));
190+
expect(find.editableText, hasText('19'));
191+
192+
await tester.sendKeyEvent(LogicalKeyboardKey.pageDown);
193+
await tester.idle();
194+
expect(tester.state(find.byType(S)), hasValue(9));
195+
expect(find.editableText, hasText('9'));
196+
197+
await tester.sendKeyEvent(LogicalKeyboardKey.pageDown);
198+
await tester.idle();
199+
expect(tester.state(find.byType(S)), hasValue(0));
200+
expect(find.editableText, hasText('0'));
201+
});
202+
167203
testWidgets('text', (tester) async {
168204
await tester.pumpWidget(builder());
169205
expect(find.editableText, hasFocus);

0 commit comments

Comments
 (0)