diff --git a/lib/src/numberpicker.dart b/lib/src/numberpicker.dart index 5b59951..565d2af 100644 --- a/lib/src/numberpicker.dart +++ b/lib/src/numberpicker.dart @@ -88,11 +88,9 @@ class _NumberPickerState extends State { @override void initState() { super.initState(); - final initialOffset = - (widget.value - widget.minValue) ~/ widget.step * itemExtent; + final initialOffset = (widget.value - widget.minValue) ~/ widget.step * itemExtent; if (widget.infiniteLoop) { - _scrollController = - InfiniteScrollController(initialScrollOffset: initialOffset); + _scrollController = InfiniteScrollController(initialScrollOffset: initialOffset); } else { _scrollController = ScrollController(initialScrollOffset: initialOffset); } @@ -106,8 +104,7 @@ class _NumberPickerState extends State { } else { indexOfMiddleElement = indexOfMiddleElement.clamp(0, itemCount - 1); } - final intValueInTheMiddle = - _intValueFromIndex(indexOfMiddleElement + additionalItemsOnEachSide); + final intValueInTheMiddle = _intValueFromIndex(indexOfMiddleElement + additionalItemsOnEachSide); if (widget.value != intValueInTheMiddle) { widget.onChanged(intValueInTheMiddle); @@ -126,6 +123,8 @@ class _NumberPickerState extends State { super.didUpdateWidget(oldWidget); if (oldWidget.value != widget.value) { _maybeCenterValue(); + } else if (oldWidget.minValue != widget.minValue || oldWidget.maxValue != widget.maxValue) { + _maybeCenterValue(onlyMinMaxChanged: true); } } @@ -137,8 +136,7 @@ class _NumberPickerState extends State { bool get isScrolling => _scrollController.position.isScrollingNotifier.value; - double get itemExtent => - widget.axis == Axis.vertical ? widget.itemHeight : widget.itemWidth; + double get itemExtent => widget.axis == Axis.vertical ? widget.itemHeight : widget.itemWidth; int get itemCount => (widget.maxValue - widget.minValue) ~/ widget.step + 1; @@ -149,12 +147,8 @@ class _NumberPickerState extends State { @override Widget build(BuildContext context) { return SizedBox( - width: widget.axis == Axis.vertical - ? widget.itemWidth - : widget.itemCount * widget.itemWidth, - height: widget.axis == Axis.vertical - ? widget.itemCount * widget.itemHeight - : widget.itemHeight, + width: widget.axis == Axis.vertical ? widget.itemWidth : widget.itemCount * widget.itemWidth, + height: widget.axis == Axis.vertical ? widget.itemCount * widget.itemHeight : widget.itemHeight, child: NotificationListener( onNotification: (not) { if (not.dragDetails?.primaryVelocity == 0) { @@ -196,13 +190,11 @@ class _NumberPickerState extends State { final themeData = Theme.of(context); final defaultStyle = widget.textStyle ?? themeData.textTheme.bodyMedium; final selectedStyle = widget.selectedTextStyle ?? - themeData.textTheme.headlineSmall - ?.copyWith(color: themeData.colorScheme.secondary); + themeData.textTheme.headlineSmall?.copyWith(color: themeData.colorScheme.secondary); final value = _intValueFromIndex(index % itemCount); final isExtra = !widget.infiniteLoop && - (index < additionalItemsOnEachSide || - index >= listItemsCount - additionalItemsOnEachSide); + (index < additionalItemsOnEachSide || index >= listItemsCount - additionalItemsOnEachSide); final itemStyle = value == widget.value ? selectedStyle : defaultStyle; final child = isExtra @@ -221,9 +213,8 @@ class _NumberPickerState extends State { } String _getDisplayedValue(int value) { - final text = widget.zeroPad - ? value.toString().padLeft(widget.maxValue.toString().length, '0') - : value.toString(); + final text = + widget.zeroPad ? value.toString().padLeft(widget.maxValue.toString().length, '0') : value.toString(); if (widget.textMapper != null) { return widget.textMapper!(text); } else { @@ -237,7 +228,7 @@ class _NumberPickerState extends State { return widget.minValue + index * widget.step; } - void _maybeCenterValue() { + void _maybeCenterValue({bool onlyMinMaxChanged = false}) { if (_scrollController.hasClients && !isScrolling) { int diff = widget.value - widget.minValue; int index = diff ~/ widget.step; @@ -246,11 +237,17 @@ class _NumberPickerState extends State { final cycles = (offset / (itemCount * itemExtent)).floor(); index += cycles * itemCount; } - _scrollController.animateTo( - index * itemExtent, - duration: Duration(milliseconds: 300), - curve: Curves.easeOutCubic, - ); + if (onlyMinMaxChanged) { + _scrollController.jumpTo( + index * itemExtent, + ); + } else { + _scrollController.animateTo( + index * itemExtent, + duration: Duration(milliseconds: 300), + curve: Curves.easeOutCubic, + ); + } } } }