Skip to content

Commit

Permalink
Merge 7b01b96 into b6819a5
Browse files Browse the repository at this point in the history
  • Loading branch information
moniaS committed Aug 1, 2019
2 parents b6819a5 + 7b01b96 commit 983948c
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 128 deletions.
1 change: 1 addition & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ class _MyHomePageState extends State<MyHomePage> {
minValue: 0,
maxValue: 100,
step: 10,
zeroPad: true,
onChanged: (value) => setState(() => _currentHorizontalIntValue = value),
);
integerInfiniteNumberPicker = new NumberPicker.integer(
Expand Down
28 changes: 25 additions & 3 deletions lib/numberpicker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class NumberPicker extends StatelessWidget {
this.itemExtent = kDefaultItemExtent,
this.listViewHeight = kDefaultListViewCrossAxisSize,
this.step = 1,
this.zeroPad = false,
}) : assert(initialValue != null),
assert(minValue != null),
assert(maxValue != null),
Expand Down Expand Up @@ -58,6 +59,7 @@ class NumberPicker extends StatelessWidget {
this.step = 1,
this.scrollDirection = Axis.vertical,
this.infiniteLoop = false,
this.zeroPad = false,
}) : assert(initialValue != null),
assert(minValue != null),
assert(maxValue != null),
Expand Down Expand Up @@ -116,6 +118,7 @@ class NumberPicker extends StatelessWidget {
scrollDirection = Axis.vertical,
integerItemCount = maxValue.floor() - minValue.floor() + 1,
infiniteLoop = false,
zeroPad = false,
super(key: key);

///called when selected value changes
Expand Down Expand Up @@ -164,6 +167,9 @@ class NumberPicker extends StatelessWidget {
///Repeat values infinitely
final bool infiniteLoop;

///Pads displayed integer values up to the length of maxValue
final bool zeroPad;

///Amount of items
final int integerItemCount;

Expand Down Expand Up @@ -246,7 +252,10 @@ class NumberPicker extends StatelessWidget {
return isExtra
? new Container() //empty first and last element
: new Center(
child: new Text(value.toString(), style: itemStyle),
child: new Text(
getDisplayedValue(value),
style: itemStyle,
),
);
},
),
Expand Down Expand Up @@ -314,7 +323,10 @@ class NumberPicker extends StatelessWidget {
value == selectedIntValue ? selectedStyle : defaultStyle;

return new Center(
child: new Text(value.toString(), style: itemStyle),
child: new Text(
getDisplayedValue(value),
style: itemStyle,
),
);
},
),
Expand All @@ -323,6 +335,12 @@ class NumberPicker extends StatelessWidget {
);
}

String getDisplayedValue(int value) {
return zeroPad
? value.toString().padLeft(maxValue.toString().length, '0')
: value.toString();
}

//
// ----------------------------- LOGIC -----------------------------
//
Expand Down Expand Up @@ -465,6 +483,7 @@ class NumberPickerDialog extends StatefulWidget {
final Widget cancelWidget;
final int step;
final bool infiniteLoop;
final bool zeroPad;

///constructor for integer values
NumberPickerDialog.integer({
Expand All @@ -475,6 +494,7 @@ class NumberPickerDialog extends StatefulWidget {
this.titlePadding,
this.step = 1,
this.infiniteLoop = false,
this.zeroPad = false,
Widget confirmWidget,
Widget cancelWidget,
}) : confirmWidget = confirmWidget ?? new Text("OK"),
Expand All @@ -496,7 +516,8 @@ class NumberPickerDialog extends StatefulWidget {
cancelWidget = cancelWidget ?? new Text("CANCEL"),
initialIntegerValue = -1,
step = 1,
infiniteLoop = false;
infiniteLoop = false,
zeroPad = false;

@override
State<NumberPickerDialog> createState() =>
Expand Down Expand Up @@ -534,6 +555,7 @@ class _NumberPickerDialogControllerState extends State<NumberPickerDialog> {
maxValue: widget.maxValue,
step: widget.step,
infiniteLoop: widget.infiniteLoop,
zeroPad: widget.zeroPad,
onChanged: _handleValueChanged,
);
}
Expand Down
212 changes: 91 additions & 121 deletions test/integer_infinite_numberpicker_test.dart
Original file line number Diff line number Diff line change
@@ -1,148 +1,118 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:numberpicker/numberpicker.dart';
import 'test_utils.dart';

void main() {
testWidgets('Integer small scroll up works', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 10,
initialValue: 5,
scrollBy: 2,
expectedValue: 7);
await testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 10,
initialValue: 5,
scrollBy: 2,
expectedValue: 7,
infiniteLoop: true,
);
});

testWidgets('Integer small scroll down works', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 10,
initialValue: 5,
scrollBy: -2,
expectedValue: 3);
await testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 10,
initialValue: 5,
scrollBy: -2,
expectedValue: 3,
infiniteLoop: true,
);
});

testWidgets('Integer overscroll over max value', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 5,
initialValue: 5,
scrollBy: 1,
expectedValue: 1);
await testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 5,
initialValue: 5,
scrollBy: 1,
expectedValue: 1,
infiniteLoop: true,
);
});

testWidgets('Integer overscroll under min value', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 5,
initialValue: 1,
scrollBy: -1,
expectedValue: 5);
testWidgets('Integer overscroll under min value',
(WidgetTester tester) async {
await testNumberPicker(
tester: tester,
minValue: 1,
maxValue: 5,
initialValue: 1,
scrollBy: -1,
expectedValue: 5,
infiniteLoop: true,
);
});

testWidgets('Step works', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 0,
maxValue: 6,
step: 3,
initialValue: 0,
scrollBy: 2,
expectedValue: 6);
await testNumberPicker(
tester: tester,
minValue: 0,
maxValue: 6,
step: 3,
initialValue: 0,
scrollBy: 2,
expectedValue: 6,
infiniteLoop: true,
);
});

testWidgets('Step cuts max value', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 0,
maxValue: 5,
step: 3,
initialValue: 0,
scrollBy: 2,
expectedValue: 0);
await testNumberPicker(
tester: tester,
minValue: 0,
maxValue: 5,
step: 3,
initialValue: 0,
scrollBy: 2,
expectedValue: 0,
infiniteLoop: true,
);
});

testWidgets('Min value==step, force animate', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 10,
maxValue: 50,
step: 10,
initialValue: 10,
scrollBy: 2,
expectedValue: 30,
animateToItself: true);
await testNumberPicker(
tester: tester,
minValue: 10,
maxValue: 50,
step: 10,
initialValue: 10,
scrollBy: 2,
expectedValue: 30,
animateToItself: true,
infiniteLoop: true,
);
});

testWidgets('Force animate works', (WidgetTester tester) async {
await _testNumberPicker(
tester: tester,
minValue: 10,
maxValue: 50,
initialValue: 10,
scrollBy: 13,
expectedValue: 23,
animateToItself: true);
await testNumberPicker(
tester: tester,
minValue: 10,
maxValue: 50,
initialValue: 10,
scrollBy: 13,
expectedValue: 23,
animateToItself: true,
infiniteLoop: true,
);
});
}

Future<NumberPicker> _testNumberPicker(
{WidgetTester tester,
int minValue,
int maxValue,
int initialValue,
int scrollBy,
int step = 1,
int expectedValue,
bool animateToItself = false}) async {
int value = initialValue;
NumberPicker picker;

await tester.pumpWidget(
StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
picker = NumberPicker.integer(
initialValue: value,
minValue: minValue,
maxValue: maxValue,
step: step,
testWidgets('Zero pad works', (WidgetTester tester) async {
await testMultipleValuesInPicker(
tester: tester,
minValue: 0,
maxValue: 10,
initialValue: 9,
zeroPad: true,
scrollBy: 1,
infiniteLoop: true,
onChanged: (newValue) => setState(() => value = newValue),
);
return MaterialApp(
home: Scaffold(
body: picker,
),
);
}),
);
expect(value, equals(initialValue));

await _scrollNumberPicker(Offset(0.0, 0.0), tester, scrollBy);
await tester.pumpAndSettle();

expect(value, equals(expectedValue));

if (animateToItself) {
expect(picker.selectedIntValue, equals(expectedValue));
await picker.animateInt(picker.selectedIntValue);
await tester.pumpAndSettle();
expect(picker.selectedIntValue, equals(expectedValue));
}
return picker;
}

_scrollNumberPicker(
Offset pickerPosition, WidgetTester tester, int scrollBy) async {
Offset pickerCenter = Offset(
pickerPosition.dx + NumberPicker.kDefaultListViewCrossAxisSize / 2,
pickerPosition.dy + 1.5 * NumberPicker.kDefaultItemExtent,
);
final TestGesture testGesture = await tester.startGesture(pickerCenter);
await testGesture.moveBy(Offset(
0.0,
-scrollBy * NumberPicker.kDefaultItemExtent,
));
}
expectedDisplayValues: ['09', '10', '00']);
});
}
11 changes: 11 additions & 0 deletions test/integer_numberpicker_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,15 @@ void main() {
expectedValue: 23,
animateToItself: true);
});

testWidgets('Zero pad works', (WidgetTester tester) async {
await testMultipleValuesInPicker(
tester: tester,
minValue: 0,
maxValue: 10,
initialValue: 2,
zeroPad: true,
scrollBy: 1,
expectedDisplayValues: ['02', '03', '04']);
});
}
Loading

0 comments on commit 983948c

Please sign in to comment.