diff --git a/example/pubspec.lock b/example/pubspec.lock index a0b2aba..235ce30 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,65 +5,66 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.2.1" charts_common: dependency: transitive description: name: charts_common - url: "https://pub.dartlang.org" + sha256: c5fe2078107211b563c11193dfb5c0c4fe263911941cff900eda816c7f963e49 + url: "https://pub.dev" source: hosted version: "0.8.1" charts_flutter: dependency: "direct main" description: name: charts_flutter - url: "https://pub.dartlang.org" + sha256: b202fb13e7067d372dd735597cee690a6d97107cf3572b00d3d71300c336b0aa + url: "https://pub.dev" source: hosted version: "0.8.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -78,51 +79,66 @@ packages: dependency: transitive description: name: intl - url: "https://pub.dartlang.org" + sha256: "4691515bb3f68ebbc4776bc97a84d429bb8e8c141a77b5ab988a4b02adb1747a" + url: "https://pub.dev" source: hosted version: "0.16.1" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "0520a4826042a8a5d09ddd4755623a50d37ee536d79a70452aff8c8ad7bb6c27" + url: "https://pub.dev" source: hosted version: "1.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.2.0" material_design_icons_flutter: dependency: "direct main" description: name: material_design_icons_flutter - url: "https://pub.dartlang.org" + sha256: "6b527ea0ef01b9b702e3b8252cf27ca9ddc759777ea1a0483ec973e002f6386a" + url: "https://pub.dev" source: hosted version: "4.0.5045" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.8.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.8.2" sky_engine: dependency: transitive description: flutter @@ -139,51 +155,58 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.4.16" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" sdks: - dart: ">=2.17.0 <3.0.0" + dart: ">=2.18.0 <3.0.0" flutter: ">=0.1.2" diff --git a/lib/src/scrolling.dart b/lib/src/scrolling.dart index 3b3a80c..7ab7f4c 100644 --- a/lib/src/scrolling.dart +++ b/lib/src/scrolling.dart @@ -28,7 +28,8 @@ class _SheetExtent { double get currentExtent => _currentExtent.value!; - set currentExtent(double value) => _currentExtent.value = math.min(value, maxExtent); + set currentExtent(double value) => + _currentExtent.value = math.min(value, maxExtent); double get sheetHeight => childHeight + headerHeight + footerHeight; @@ -117,7 +118,8 @@ class _SlidingSheetScrollController extends ScrollController { // Adjust the animation duration for a snap to give it a more // realistic feel. final num distanceFactor = - ((currentExtent - snap).abs() / (maxExtent - minExtent)).clamp(0.33, 1.0); + ((currentExtent - snap).abs() / (maxExtent - minExtent)) + .clamp(0.33, 1.0); final speedFactor = 1.0 - ((velocity.abs() / 2500) * 0.33).clamp(0.0, 0.66); duration ??= this.duration * (distanceFactor * speedFactor); @@ -126,7 +128,9 @@ class _SlidingSheetScrollController extends ScrollController { parent: controller!, curve: velocity.abs() > 300 ? Curves.easeOutCubic - : (snap == 0 || !widget.openBouncing ? Curves.ease : const SimpleBounceOut()), + : (snap == 0 || !widget.openBouncing + ? Curves.ease + : const SimpleBounceOut()), ); final start = extent.currentExtent; @@ -263,9 +267,12 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { bool get isCoveringFullExtent => scrollController.sheet.isScrollable; bool get shouldMakeSheetNonDismissable => - sheet.didCompleteInitialRoute && !isDismissable && currentExtent < minExtent; + sheet.didCompleteInitialRoute && + !isDismissable && + currentExtent < minExtent; - bool get isBottomSheetBelowMinExtent => fromBottomSheet && currentExtent < minExtent; + bool get isBottomSheetBelowMinExtent => + fromBottomSheet && currentExtent < minExtent; @override bool applyContentDimensions(double minScrollExtent, double maxScrollExtent) { @@ -287,10 +294,12 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { inDrag = true; final isNotAtMinOrMaxExtent = !(extent.isAtMin || extent.isAtMax); - final scrollsUpWhenAtMinExtent = extent.isAtMin && (delta < 0 || fromBottomSheet); + final scrollsUpWhenAtMinExtent = + extent.isAtMin && (delta < 0 || fromBottomSheet); final scrollsDownWhenAtMaxExtent = extent.isAtMax && delta > 0; - final shouldAddPixelDeltaToExtent = - isNotAtMinOrMaxExtent || scrollsUpWhenAtMinExtent || scrollsDownWhenAtMaxExtent; + final shouldAddPixelDeltaToExtent = isNotAtMinOrMaxExtent || + scrollsUpWhenAtMinExtent || + scrollsDownWhenAtMaxExtent; if (!shouldScroll && shouldAddPixelDeltaToExtent) { final adjustedDelta = adjustDelta(-delta); extent.addPixelDelta(adjustedDelta); @@ -317,7 +326,8 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { void didEndScroll() { super.didEndScroll(); - final canSnapToNextExtent = snap && !extent.isAtMax && !extent.isAtMin && !shouldScroll; + final canSnapToNextExtent = + snap && !extent.isAtMax && !extent.isAtMin && !shouldScroll; if (inDrag && !shouldMakeSheetNonDismissable && (canSnapToNextExtent || isBottomSheetBelowMinExtent)) { @@ -347,7 +357,9 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { return; } - if (velocity == 0.0 || (isMovingDown && shouldScroll) || (isMovingUp && extent.isAtMax)) { + if (velocity == 0.0 || + (isMovingDown && shouldScroll) || + (isMovingUp && extent.isAtMax)) { super.goBallistic(velocity); return; } @@ -387,7 +399,8 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { final slow = velocity < snapToNextThreshold; final target = !slow - ? ((isMovingUp ? 1 : -1) * (((velocity * .45) * (1 - currentExtent)) / flingThreshold)) + + ? ((isMovingUp ? 1 : -1) * + (((velocity * .45) * (1 - currentExtent)) / flingThreshold)) + currentExtent : currentExtent; @@ -396,7 +409,8 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { final stop = snappings[i]; final valid = slow || !greaterThanCurrent || - ((isMovingUp && stop >= target) || (!isMovingUp && stop <= target)); + ((isMovingUp && stop >= target) || + (!isMovingUp && stop <= target)); if (valid) { final dis = (stop - target).abs(); @@ -420,7 +434,8 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { if (targetSnap == 0.0) { onPop(velocity, false, false); } else if (targetSnap != extent.currentExtent && currentExtent > 0) { - final double initialSnap = (snapBehavior.initialSnap ?? 0.0) / snapBehavior.maxSnap; + final double initialSnap = + (snapBehavior.initialSnap ?? 0.0) / snapBehavior.maxSnap; if (extent.currentExtent < initialSnap) { snapTo(targetSnap!.clamp(minExtent, maxExtent)); } @@ -460,8 +475,8 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { lastDelta = ballisticController.value; extent.addPixelDelta(delta); - final shouldStopScrollOnBottomSheets = - fromBottomSheet && (currentExtent <= 0.0 || shouldMakeSheetNonDismissable); + final shouldStopScrollOnBottomSheets = fromBottomSheet && + (currentExtent <= 0.0 || shouldMakeSheetNonDismissable); final shouldStopOnUpFling = velocity > 0 && extent.isAtMax; final shouldStopOnDownFling = velocity < 0 && (shouldStopScrollOnBottomSheets || extent.isAtMin); @@ -476,7 +491,9 @@ class _SlidingSheetScrollPosition extends ScrollPositionWithSingleContext { ballisticController.stop(); // Pop the route when reaching 0.0 extent. - if (fromBottomSheet && currentExtent <= 0.0 && !shouldMakeSheetNonDismissable) { + if (fromBottomSheet && + currentExtent <= 0.0 && + !shouldMakeSheetNonDismissable) { onPop(0.0, false, false); } } diff --git a/lib/src/sheet.dart b/lib/src/sheet.dart index 51d73d2..7f2dfed 100644 --- a/lib/src/sheet.dart +++ b/lib/src/sheet.dart @@ -25,7 +25,8 @@ typedef SheetBuilder = Widget Function(BuildContext context, SheetState state); typedef SheetListener = void Function(SheetState state); /// Callback prevented dismiss the dialog -typedef OnDismissPreventedCallback = void Function(bool backButton, bool backDrop); +typedef OnDismissPreventedCallback = void Function( + bool backButton, bool backDrop); /// Callback for opening sheet typedef OnOpenCallback = void Function(); @@ -398,7 +399,8 @@ class SlidingSheet extends StatefulWidget { _SlidingSheetState createState() => _SlidingSheetState(); } -class _SlidingSheetState extends State with TickerProviderStateMixin { +class _SlidingSheetState extends State + with TickerProviderStateMixin { final GlobalKey childKey = GlobalKey(); final GlobalKey headerKey = GlobalKey(); final GlobalKey footerKey = GlobalKey(); @@ -433,14 +435,19 @@ class _SlidingSheetState extends State with TickerProviderStateMix // The total height of all sheet components. double get sheetHeight => - childHeight + headerHeight + footerHeight + padding.vertical + borderHeight; + childHeight + + headerHeight + + footerHeight + + padding.vertical + + borderHeight; // The maxiumum height that this sheet will cover. double get maxHeight => math.min(sheetHeight, availableHeight); bool get isScrollable => sheetHeight >= availableHeight; - double get currentExtent => (extent?.currentExtent ?? minExtent).clamp(0.0, 1.0); + double get currentExtent => + (extent?.currentExtent ?? minExtent).clamp(0.0, 1.0); set currentExtent(double value) => extent?.currentExtent = value; @@ -456,8 +463,9 @@ class _SlidingSheetState extends State with TickerProviderStateMix double get maxExtent => snappings.last.clamp(0.0, 1.0); - double get initialExtent => - snapSpec.initialSnap != null ? _normalizeSnap(snapSpec.initialSnap!) : minExtent; + double get initialExtent => snapSpec.initialSnap != null + ? _normalizeSnap(snapSpec.initialSnap!) + : minExtent; bool get isDialog => widget.route != null; @@ -510,7 +518,8 @@ class _SlidingSheetState extends State with TickerProviderStateMix ); // A notifier that a child SheetListenableBuilder can inherit to - final ValueNotifier stateNotifier = ValueNotifier(SheetState.inital()); + final ValueNotifier stateNotifier = + ValueNotifier(SheetState.inital()); @override void initState() { @@ -594,9 +603,12 @@ class _SlidingSheetState extends State with TickerProviderStateMix // Measure the height of all sheet components. void _measure() { postFrame(() { - final RenderBox? child = childKey.currentContext?.findRenderObject() as RenderBox?; - final RenderBox? header = headerKey.currentContext?.findRenderObject() as RenderBox?; - final RenderBox? footer = footerKey.currentContext?.findRenderObject() as RenderBox?; + final RenderBox? child = + childKey.currentContext?.findRenderObject() as RenderBox?; + final RenderBox? header = + headerKey.currentContext?.findRenderObject() as RenderBox?; + final RenderBox? footer = + footerKey.currentContext?.findRenderObject() as RenderBox?; final isChildLaidOut = child?.hasSize == true; final prevChildHeight = childHeight; @@ -811,7 +823,8 @@ class _SlidingSheetState extends State with TickerProviderStateMix snapToExtent(0.0, velocity: velocity); } else if (!isDialog) { final num fractionCovered = - ((currentExtent - minExtent) / (maxExtent - minExtent)).clamp(0.0, 1.0); + ((currentExtent - minExtent) / (maxExtent - minExtent)) + .clamp(0.0, 1.0); final timeFraction = 1.0 - (fractionCovered * 0.5); snapToExtent( minExtent, @@ -824,11 +837,14 @@ class _SlidingSheetState extends State with TickerProviderStateMix // Ensure that the sheet sizes itself correctly when the // constraints change. void _adjustSnapForIncomingConstraints(double previousHeight) { - if (previousHeight > 0.0 && previousHeight != availableHeight && state.isShown) { + if (previousHeight > 0.0 && + previousHeight != availableHeight && + state.isShown) { _updateSnappingsAndExtent(); final num changeAdjustedExtent = - ((currentExtent * previousHeight) / availableHeight).clamp(minExtent, maxExtent); + ((currentExtent * previousHeight) / availableHeight) + .clamp(minExtent, maxExtent); final isAroundFixedSnap = snappings.any( (snap) => (snap - changeAdjustedExtent).abs() < 0.01, @@ -981,7 +997,9 @@ class _SlidingSheetState extends State with TickerProviderStateMix builder: (context, dynamic extent, sheet) { final translation = () { if (headerFooterExtent > 0.0) { - return 1.0 - (currentExtent.clamp(0.0, headerFooterExtent) / headerFooterExtent); + return 1.0 - + (currentExtent.clamp(0.0, headerFooterExtent) / + headerFooterExtent); } else { return 0.0; } @@ -990,7 +1008,9 @@ class _SlidingSheetState extends State with TickerProviderStateMix return Invisible( invisible: !isLaidOut || currentExtent == 0.0, child: FractionallySizedBox( - heightFactor: isLaidOut ? currentExtent.clamp(headerFooterExtent, 1.0) : 1.0, + heightFactor: isLaidOut + ? currentExtent.clamp(headerFooterExtent, 1.0) + : 1.0, alignment: Alignment.bottomCenter, child: FractionalTranslation( translation: Offset(0, translation), @@ -1051,7 +1071,8 @@ class _SlidingSheetState extends State with TickerProviderStateMix if (scrollSpec.overscroll) { scrollView = GlowingOverscrollIndicator( axisDirection: AxisDirection.down, - color: scrollSpec.overscrollColor ?? Theme.of(context).colorScheme.secondary, + color: scrollSpec.overscrollColor ?? + Theme.of(context).colorScheme.secondary, child: scrollView, ); } @@ -1072,17 +1093,20 @@ class _SlidingSheetState extends State with TickerProviderStateMix child: widget.body, builder: (context, dynamic _, body) { final amount = spec.amount; - final defaultMaxExtent = - snappings.length > 2 ? snappings[snappings.length - 2] : this.maxExtent; - final maxExtent = - spec.endExtent != null ? _normalizeSnap(spec.endExtent!) : defaultMaxExtent; + final defaultMaxExtent = snappings.length > 2 + ? snappings[snappings.length - 2] + : this.maxExtent; + final maxExtent = spec.endExtent != null + ? _normalizeSnap(spec.endExtent!) + : defaultMaxExtent; assert( maxExtent > minExtent, 'The endExtent must be greater than the min snap extent you set on the SnapSpec', ); final maxOffset = (maxExtent - minExtent) * availableHeight; final num fraction = - ((currentExtent - minExtent) / (maxExtent - minExtent)).clamp(0.0, 1.0); + ((currentExtent - minExtent) / (maxExtent - minExtent)) + .clamp(0.0, 1.0); return Padding( padding: EdgeInsets.only(bottom: (amount * maxOffset) * fraction), @@ -1097,14 +1121,18 @@ class _SlidingSheetState extends State with TickerProviderStateMix valueListenable: extent!._currentExtent, builder: (context, dynamic value, child) { final opacity = () { - if (!widget.isDismissable && !dismissUnderway && didCompleteInitialRoute) { + if (!widget.isDismissable && + !dismissUnderway && + didCompleteInitialRoute) { return 1.0; } else if (currentExtent != 0.0) { if (isDialog) { return (currentExtent / minExtent).clamp(0.0, 1.0); } else { - final secondarySnap = snappings.length > 2 ? snappings[1] : maxExtent; - return ((currentExtent - minExtent) / (secondarySnap - minExtent)).clamp(0.0, 1.0); + final secondarySnap = + snappings.length > 2 ? snappings[1] : maxExtent; + return ((currentExtent - minExtent) / (secondarySnap - minExtent)) + .clamp(0.0, 1.0); } } else { return 0.0; @@ -1123,8 +1151,9 @@ class _SlidingSheetState extends State with TickerProviderStateMix ), ); - void onTap() => - widget.isDismissable ? _pop(0.0, true, false) : _onDismissPrevented(backDrop: true); + void onTap() => widget.isDismissable + ? _pop(0.0, true, false) + : _onDismissPrevented(backDrop: true); // see: https://github.com/BendixMa/sliding-sheet/issues/30 if (opacity >= 0.05 || didStartDragWhenNotCollapsed) { @@ -1219,5 +1248,6 @@ class _InheritedSheetState extends InheritedWidget { ) : super(child: child); @override - bool updateShouldNotify(_InheritedSheetState oldWidget) => state != oldWidget.state; + bool updateShouldNotify(_InheritedSheetState oldWidget) => + state != oldWidget.state; } diff --git a/lib/src/sheet_container.dart b/lib/src/sheet_container.dart index 5dfa604..593efcb 100644 --- a/lib/src/sheet_container.dart +++ b/lib/src/sheet_container.dart @@ -20,6 +20,7 @@ class SheetContainer extends StatelessWidget { final List? boxShadows; final AlignmentGeometry? alignment; final BoxConstraints? constraints; + const SheetContainer({ Key? key, this.duration, @@ -86,6 +87,7 @@ class ElevatedContainer extends StatelessWidget { final double elevation; final bool Function(SheetState state) elevateWhen; final Widget child; + const ElevatedContainer({ Key? key, required this.shadowColor, diff --git a/lib/src/sheet_controller.dart b/lib/src/sheet_controller.dart index 9780a57..37a6e3a 100644 --- a/lib/src/sheet_controller.dart +++ b/lib/src/sheet_controller.dart @@ -8,7 +8,9 @@ class SheetController { /// one explicitly. This allows you to call functions on the controller from child /// widgets without having to pass a [SheetController] around. static SheetController? of(BuildContext context) { - return context.findAncestorStateOfType<_SlidingSheetState>()?.sheetController; + return context + .findAncestorStateOfType<_SlidingSheetState>() + ?.sheetController; } /// Animates the sheet to the [extent]. diff --git a/lib/src/sheet_state.dart b/lib/src/sheet_state.dart index 95d2ca9..2baa54c 100644 --- a/lib/src/sheet_state.dart +++ b/lib/src/sheet_state.dart @@ -57,8 +57,9 @@ class SheetState { // On Bottomsheets it is possible for min and maxExtents to be the same (when you only set one snap). // Thus we have to account for this and set the minExtent to be zero. }) : minExtent = minExtent != maxExtent ? minExtent : 0.0, - progress = - isLaidOut ? ((extent - minExtent) / (maxExtent - minExtent)).clamp(0.0, 1.0) : 0.0, + progress = isLaidOut + ? ((extent - minExtent) / (maxExtent - minExtent)).clamp(0.0, 1.0) + : 0.0, isExpanded = toPrecision(extent) >= toPrecision(maxExtent), isCollapsed = toPrecision(extent) <= toPrecision(minExtent), isAtTop = _extent?.isAtTop ?? true, @@ -85,7 +86,9 @@ class SheetState { /// private static ValueNotifier notifier(BuildContext context) { - return context.dependOnInheritedWidgetOfExactType<_InheritedSheetState>()!.state; + return context + .dependOnInheritedWidgetOfExactType<_InheritedSheetState>()! + .state; } @override diff --git a/lib/src/specs.dart b/lib/src/specs.dart index 5401770..6a29ee6 100644 --- a/lib/src/specs.dart +++ b/lib/src/specs.dart @@ -86,6 +86,7 @@ class SnapSpec { snap == footerSnap; double get minSnap => snappings.first; + double get maxSnap => snappings.last; SnapSpec copyWith({ @@ -159,7 +160,8 @@ class ScrollSpec { const ScrollSpec.overscroll({Color? color}) : this(overscrollColor: color); /// Creates an iOS bouncing scroll effect. - const ScrollSpec.bouncingScroll() : this(physics: const BouncingScrollPhysics()); + const ScrollSpec.bouncingScroll() + : this(physics: const BouncingScrollPhysics()); @override String toString() { diff --git a/pubspec.lock b/pubspec.lock index 8a19e73..7a7d0e5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,51 +5,50 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.2.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -60,34 +59,46 @@ packages: description: flutter source: sdk version: "0.0.0" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.8.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.8.2" sky_engine: dependency: transitive description: flutter @@ -97,50 +108,57 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.4.16" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" sdks: - dart: ">=2.17.0 <3.0.0" + dart: ">=2.18.0 <3.0.0"