diff --git a/packages/scrollable_positioned_list/analysis_options.yaml b/packages/scrollable_positioned_list/analysis_options.yaml new file mode 100644 index 00000000..2cab42c1 --- /dev/null +++ b/packages/scrollable_positioned_list/analysis_options.yaml @@ -0,0 +1,5 @@ +include: package:lints/recommended.yaml +analyzer: + language: + strict-casts: true + strict-raw-types: true diff --git a/packages/scrollable_positioned_list/example/README.md b/packages/scrollable_positioned_list/example/README.md new file mode 100644 index 00000000..2b3fce4c --- /dev/null +++ b/packages/scrollable_positioned_list/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/scrollable_positioned_list/example/lib/main.dart b/packages/scrollable_positioned_list/example/lib/main.dart index 4aa8e012..b91dea7e 100644 --- a/packages/scrollable_positioned_list/example/lib/main.dart +++ b/packages/scrollable_positioned_list/example/lib/main.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; @@ -11,8 +12,6 @@ const minItemHeight = 20.0; const maxItemHeight = 150.0; const scrollDuration = Duration(seconds: 2); -const randomMax = 1 << 32; - void main() { runApp(ScrollablePositionedListExample()); } @@ -46,7 +45,7 @@ class ScrollablePositionedListPage extends StatefulWidget { const ScrollablePositionedListPage({Key? key}) : super(key: key); @override - _ScrollablePositionedListPageState createState() => + State createState() => _ScrollablePositionedListPageState(); } @@ -69,14 +68,16 @@ class _ScrollablePositionedListPageState void initState() { super.initState(); final heightGenerator = Random(328902348); - final colorGenerator = Random(42490823); itemHeights = List.generate( numberOfItems, (int _) => heightGenerator.nextDouble() * (maxItemHeight - minItemHeight) + minItemHeight); - itemColors = List.generate(numberOfItems, - (int _) => Color(colorGenerator.nextInt(randomMax)).withOpacity(1)); + itemColors = List.generate( + numberOfItems, + (int _) => Color( + (Random().nextDouble() * 0xFFFFFF).toInt() << 0, + ).withOpacity(1.0)); } @override diff --git a/packages/scrollable_positioned_list/example/pubspec.yaml b/packages/scrollable_positioned_list/example/pubspec.yaml index ad6f1d8f..0dddacbf 100644 --- a/packages/scrollable_positioned_list/example/pubspec.yaml +++ b/packages/scrollable_positioned_list/example/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' environment: sdk: '>=2.12.0-0 <3.0.0' - flutter: '>=1.13.8' + flutter: '>=2.12.0' dependencies: flutter: @@ -15,3 +15,4 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + lints: ^2.0.1 diff --git a/packages/scrollable_positioned_list/lib/src/element_registry.dart b/packages/scrollable_positioned_list/lib/src/element_registry.dart index b24a0c17..08692197 100644 --- a/packages/scrollable_positioned_list/lib/src/element_registry.dart +++ b/packages/scrollable_positioned_list/lib/src/element_registry.dart @@ -67,9 +67,9 @@ class _RegisteredElement extends ProxyElement { @override void mount(Element? parent, dynamic newSlot) { super.mount(parent, newSlot); - final _inheritedRegistryWidget = + final inheritedRegistryWidget = dependOnInheritedWidgetOfExactType<_InheritedRegistryWidget>()!; - _registryWidgetState = _inheritedRegistryWidget.state; + _registryWidgetState = inheritedRegistryWidget.state; _registryWidgetState.registeredElements.add(this); _registryWidgetState.widget.elementNotifier?.value = _registryWidgetState.registeredElements; @@ -78,9 +78,9 @@ class _RegisteredElement extends ProxyElement { @override void didChangeDependencies() { super.didChangeDependencies(); - final _inheritedRegistryWidget = + final inheritedRegistryWidget = dependOnInheritedWidgetOfExactType<_InheritedRegistryWidget>()!; - _registryWidgetState = _inheritedRegistryWidget.state; + _registryWidgetState = inheritedRegistryWidget.state; _registryWidgetState.registeredElements.add(this); _registryWidgetState.widget.elementNotifier?.value = _registryWidgetState.registeredElements; diff --git a/packages/scrollable_positioned_list/lib/src/item_positions_listener.dart b/packages/scrollable_positioned_list/lib/src/item_positions_listener.dart index dfb3e7d8..1fe06e3a 100644 --- a/packages/scrollable_positioned_list/lib/src/item_positions_listener.dart +++ b/packages/scrollable_positioned_list/lib/src/item_positions_listener.dart @@ -44,7 +44,7 @@ class ItemPosition { @override bool operator ==(dynamic other) { if (other.runtimeType != runtimeType) return false; - final ItemPosition otherPosition = other; + final ItemPosition otherPosition = other as ItemPosition; return otherPosition.index == index && otherPosition.itemLeadingEdge == itemLeadingEdge && otherPosition.itemTrailingEdge == itemTrailingEdge; diff --git a/packages/scrollable_positioned_list/lib/src/positioned_list.dart b/packages/scrollable_positioned_list/lib/src/positioned_list.dart index 5c6929e0..b10042d7 100644 --- a/packages/scrollable_positioned_list/lib/src/positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/positioned_list.dart @@ -44,9 +44,7 @@ class PositionedList extends StatefulWidget { this.addSemanticIndexes = true, this.addRepaintBoundaries = true, this.addAutomaticKeepAlives = true, - }) : assert(itemCount != null), - assert(itemBuilder != null), - assert((positionedIndex == 0) || (positionedIndex < itemCount)), + }) : assert((positionedIndex == 0) || (positionedIndex < itemCount)), super(key: key); /// Number of items the [itemBuilder] can produce. diff --git a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart index 6e270f6d..2cc1c76c 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -51,9 +51,7 @@ class ScrollablePositionedList extends StatefulWidget { this.addAutomaticKeepAlives = true, this.addRepaintBoundaries = true, this.minCacheExtent, - }) : assert(itemCount != null), - assert(itemBuilder != null), - itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?, + }) : itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?, separatorBuilder = null, super(key: key); @@ -78,9 +76,7 @@ class ScrollablePositionedList extends StatefulWidget { this.addAutomaticKeepAlives = true, this.addRepaintBoundaries = true, this.minCacheExtent, - }) : assert(itemCount != null), - assert(itemBuilder != null), - assert(separatorBuilder != null), + }) : assert(separatorBuilder != null), itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?, super(key: key); @@ -270,12 +266,13 @@ class _ScrollablePositionedListState extends State bool _isTransitioning = false; - var _animationController; + late AnimationController _animationController; @override void initState() { super.initState(); - ItemPosition? initialPosition = PageStorage.of(context)!.readState(context); + ItemPosition? initialPosition = + PageStorage.of(context).readState(context) as ItemPosition?; primary.target = initialPosition?.index ?? widget.initialScrollIndex; primary.alignment = initialPosition?.itemLeadingEdge ?? widget.initialAlignment; @@ -285,6 +282,7 @@ class _ScrollablePositionedListState extends State widget.itemScrollController?._attach(this); primary.itemPositionsNotifier.itemPositions.addListener(_updatePositions); secondary.itemPositionsNotifier.itemPositions.addListener(_updatePositions); + _animationController = AnimationController(vsync: this); } @override @@ -299,7 +297,7 @@ class _ScrollablePositionedListState extends State .removeListener(_updatePositions); secondary.itemPositionsNotifier.itemPositions .removeListener(_updatePositions); - _animationController?.dispose(); + _animationController.dispose(); super.dispose(); } @@ -487,7 +485,7 @@ class _ScrollablePositionedListState extends State startAnimationCallback = () { SchedulerBinding.instance.addPostFrameCallback((_) { startAnimationCallback = () {}; - _animationController?.dispose(); + _animationController.dispose(); _animationController = AnimationController(vsync: this, duration: duration)..forward(); opacity.parent = _opacityAnimation(opacityAnimationWeights) @@ -568,7 +566,7 @@ class _ScrollablePositionedListState extends State .where((ItemPosition position) => position.itemLeadingEdge < 1 && position.itemTrailingEdge > 0); if (itemPositions.isNotEmpty) { - PageStorage.of(context)!.writeState( + PageStorage.of(context).writeState( context, itemPositions.reduce((value, element) => value.itemLeadingEdge < element.itemLeadingEdge diff --git a/packages/scrollable_positioned_list/lib/src/viewport.dart b/packages/scrollable_positioned_list/lib/src/viewport.dart index 1de5ff05..40abf923 100644 --- a/packages/scrollable_positioned_list/lib/src/viewport.dart +++ b/packages/scrollable_positioned_list/lib/src/viewport.dart @@ -100,7 +100,6 @@ class UnboundedRenderViewport extends RenderViewport { @override set anchor(double value) { - assert(value != null); if (value == _anchor) return; _anchor = value; markNeedsLayout(); @@ -124,8 +123,6 @@ class UnboundedRenderViewport extends RenderViewport { @override Rect describeSemanticsClip(RenderSliver? child) { - assert(axis != null); - if (_calculatedCacheExtent == null) { return semanticBounds; } @@ -178,7 +175,6 @@ class UnboundedRenderViewport extends RenderViewport { double correction; var count = 0; do { - assert(offset.pixels != null); correction = _attemptLayout(mainAxisExtent, crossAxisExtent, offset.pixels + centerOffsetAdjustment); if (correction != 0.0) { @@ -189,8 +185,9 @@ class UnboundedRenderViewport extends RenderViewport { final bottom = _maxScrollExtent - mainAxisExtent * (1.0 - anchor); final maxScrollOffset = math.max(math.min(0.0, top), bottom); final minScrollOffset = math.min(top, maxScrollOffset); - if (offset.applyContentDimensions(minScrollOffset, maxScrollOffset)) + if (offset.applyContentDimensions(minScrollOffset, maxScrollOffset)) { break; + } // *** End of difference from [RenderViewport]. } count += 1; diff --git a/packages/scrollable_positioned_list/lib/src/wrapping.dart b/packages/scrollable_positioned_list/lib/src/wrapping.dart index ff7b0c6c..737ef7a3 100644 --- a/packages/scrollable_positioned_list/lib/src/wrapping.dart +++ b/packages/scrollable_positioned_list/lib/src/wrapping.dart @@ -419,14 +419,10 @@ abstract class CustomViewport extends MultiChildRenderObjectWidget { this.cacheExtentStyle = CacheExtentStyle.pixel, this.clipBehavior = Clip.hardEdge, List slivers = const [], - }) : assert(offset != null), - assert(slivers != null), - assert(center == null || + }) : assert(center == null || slivers.where((Widget child) => child.key == center).length == 1), - assert(cacheExtentStyle != null), assert(cacheExtentStyle != CacheExtentStyle.viewport || cacheExtent != null), - assert(clipBehavior != null), super(key: key, children: slivers); /// The direction in which the [offset]'s [ViewportOffset.pixels] increases. @@ -497,7 +493,6 @@ abstract class CustomViewport extends MultiChildRenderObjectWidget { /// otherwise, the default cross axis direction is downwards. static AxisDirection getDefaultCrossAxisDirection( BuildContext context, AxisDirection axisDirection) { - assert(axisDirection != null); switch (axisDirection) { case AxisDirection.up: assert(debugCheckHasDirectionality( @@ -528,7 +523,7 @@ abstract class CustomViewport extends MultiChildRenderObjectWidget { CustomRenderViewport createRenderObject(BuildContext context); @override - _ViewportElement createElement() => _ViewportElement(this); + MultiChildRenderObjectElement createElement() => _ViewportElement(this); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { @@ -662,11 +657,9 @@ abstract class CustomRenderViewport double? cacheExtent, CacheExtentStyle cacheExtentStyle = CacheExtentStyle.pixel, Clip clipBehavior = Clip.hardEdge, - }) : assert(anchor != null), - assert(anchor >= 0.0 && anchor <= 1.0), + }) : assert(anchor >= 0.0 && anchor <= 1.0), assert(cacheExtentStyle != CacheExtentStyle.viewport || cacheExtent != null), - assert(clipBehavior != null), _center = center, super( axisDirection: axisDirection, @@ -719,8 +712,9 @@ abstract class CustomRenderViewport @override void setupParentData(RenderObject child) { - if (child.parentData is! CustomSliverPhysicalContainerParentData) + if (child.parentData is! CustomSliverPhysicalContainerParentData) { child.parentData = CustomSliverPhysicalContainerParentData(); + } } /// The relative position of the zero scroll offset. diff --git a/packages/scrollable_positioned_list/pubspec.yaml b/packages/scrollable_positioned_list/pubspec.yaml index acdbd3de..e153a825 100644 --- a/packages/scrollable_positioned_list/pubspec.yaml +++ b/packages/scrollable_positioned_list/pubspec.yaml @@ -3,7 +3,6 @@ version: 0.3.5 description: > A list with helper methods to programmatically scroll to an item. homepage: https://github.com/google/flutter.widgets/tree/master/packages/scrollable_positioned_list - environment: sdk: '>=2.12.0 <3.0.0' flutter: '>=2.12.0' @@ -14,6 +13,6 @@ dependencies: collection: ^1.15.0 dev_dependencies: - pedantic: ^1.10.0-0 flutter_test: sdk: flutter + lints: ^2.0.1 diff --git a/packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart b/packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart index fb9f5c89..23cb159a 100644 --- a/packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; const screenHeight = 400.0; diff --git a/packages/scrollable_positioned_list/test/positioned_list_test.dart b/packages/scrollable_positioned_list/test/positioned_list_test.dart index 0f8caf53..f50e2c1a 100644 --- a/packages/scrollable_positioned_list/test/positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/positioned_list_test.dart @@ -363,7 +363,7 @@ void main() { testWidgets('Does not crash when updated offscreen', (WidgetTester tester) async { - late var setState; + late StateSetter setState; bool updated = false; // There's 0 relayout boundaries in this subtree. diff --git a/packages/scrollable_positioned_list/test/reversed_scrollable_positioned_list_test.dart b/packages/scrollable_positioned_list/test/reversed_scrollable_positioned_list_test.dart index 72cd99f9..98d59326 100644 --- a/packages/scrollable_positioned_list/test/reversed_scrollable_positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/reversed_scrollable_positioned_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; const screenHeight = 400.0; diff --git a/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart b/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart index f41cc3ad..6e8b07c7 100644 --- a/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:scrollable_positioned_list/src/scroll_view.dart'; diff --git a/packages/scrollable_positioned_list/test/separated_scrollable_positioned_list_test.dart b/packages/scrollable_positioned_list/test/separated_scrollable_positioned_list_test.dart index 801ee1aa..bf07cfb9 100644 --- a/packages/scrollable_positioned_list/test/separated_scrollable_positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/separated_scrollable_positioned_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:scrollable_positioned_list/src/scroll_view.dart'; diff --git a/packages/scrollable_positioned_list/test/seperated_horizontal_scrollable_positioned_list_test.dart b/packages/scrollable_positioned_list/test/seperated_horizontal_scrollable_positioned_list_test.dart index 22b8a697..2a71dbad 100644 --- a/packages/scrollable_positioned_list/test/seperated_horizontal_scrollable_positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/seperated_horizontal_scrollable_positioned_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; const screenHeight = 400.0; diff --git a/packages/scrollable_positioned_list/test/shrink_wrap_scrollable_position_list_test.dart b/packages/scrollable_positioned_list/test/shrink_wrap_scrollable_position_list_test.dart index ff93e2c2..e27d5341 100644 --- a/packages/scrollable_positioned_list/test/shrink_wrap_scrollable_position_list_test.dart +++ b/packages/scrollable_positioned_list/test/shrink_wrap_scrollable_position_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; const screenHeight = 400.0;