diff --git a/packages/scrollable_positioned_list/lib/src/positioned_list.dart b/packages/scrollable_positioned_list/lib/src/positioned_list.dart index 5c6929e0..5d8e266f 100644 --- a/packages/scrollable_positioned_list/lib/src/positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/positioned_list.dart @@ -44,6 +44,7 @@ class PositionedList extends StatefulWidget { this.addSemanticIndexes = true, this.addRepaintBoundaries = true, this.addAutomaticKeepAlives = true, + this.clipBehavior = Clip.hardEdge, }) : assert(itemCount != null), assert(itemBuilder != null), assert((positionedIndex == 0) || (positionedIndex < itemCount)), @@ -132,6 +133,11 @@ class PositionedList extends StatefulWidget { /// See [SliverChildBuilderDelegate.addAutomaticKeepAlives]. final bool addAutomaticKeepAlives; + /// {@macro flutter.material.Material.clipBehavior} + /// + /// Defaults to [Clip.hardEdge]. + final Clip clipBehavior; + @override State createState() => _PositionedListState(); } @@ -177,6 +183,7 @@ class _PositionedListState extends State { physics: widget.physics, shrinkWrap: widget.shrinkWrap, semanticChildCount: widget.semanticChildCount ?? widget.itemCount, + clipBehavior: widget.clipBehavior, slivers: [ if (widget.positionedIndex > 0) SliverPadding( diff --git a/packages/scrollable_positioned_list/lib/src/scroll_view.dart b/packages/scrollable_positioned_list/lib/src/scroll_view.dart index 31acda40..2e01aba1 100644 --- a/packages/scrollable_positioned_list/lib/src/scroll_view.dart +++ b/packages/scrollable_positioned_list/lib/src/scroll_view.dart @@ -13,7 +13,7 @@ import 'viewport.dart'; /// to be within 0 and 1. See [CustomScrollView] for more information. class UnboundedCustomScrollView extends CustomScrollView { final bool _shrinkWrap; - + final Clip _clipBehavior; const UnboundedCustomScrollView({ Key? key, Axis scrollDirection = Axis.vertical, @@ -28,8 +28,10 @@ class UnboundedCustomScrollView extends CustomScrollView { List slivers = const [], int? semanticChildCount, DragStartBehavior dragStartBehavior = DragStartBehavior.start, + Clip clipBehavior = Clip.hardEdge, }) : _shrinkWrap = shrinkWrap, _anchor = anchor, + _clipBehavior = clipBehavior, super( key: key, scrollDirection: scrollDirection, @@ -42,6 +44,7 @@ class UnboundedCustomScrollView extends CustomScrollView { cacheExtent: cacheExtent, semanticChildCount: semanticChildCount, dragStartBehavior: dragStartBehavior, + clipBehavior: clipBehavior, slivers: slivers, ); @@ -69,6 +72,7 @@ class UnboundedCustomScrollView extends CustomScrollView { cacheExtent: cacheExtent, center: center, anchor: anchor, + clipBehavior: _clipBehavior, ); } return UnboundedViewport( @@ -78,6 +82,7 @@ class UnboundedCustomScrollView extends CustomScrollView { cacheExtent: cacheExtent, center: center, anchor: anchor, + clipBehavior: _clipBehavior, ); } } 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 60045e9b..bbbd0f82 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -57,6 +57,7 @@ class ScrollablePositionedList extends StatefulWidget { this.addAutomaticKeepAlives = true, this.addRepaintBoundaries = true, this.minCacheExtent, + this.clipBehavior = Clip.hardEdge, }) : assert(itemCount != null), assert(itemBuilder != null), itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?, @@ -87,6 +88,7 @@ class ScrollablePositionedList extends StatefulWidget { this.addAutomaticKeepAlives = true, this.addRepaintBoundaries = true, this.minCacheExtent, + this.clipBehavior = Clip.hardEdge, }) : assert(itemCount != null), assert(itemBuilder != null), assert(separatorBuilder != null), @@ -186,6 +188,11 @@ class ScrollablePositionedList extends StatefulWidget { /// cache extent. final double? minCacheExtent; + /// {@macro flutter.material.Material.clipBehavior} + /// + /// Defaults to [Clip.hardEdge]. + final Clip clipBehavior; + @override State createState() => _ScrollablePositionedListState(); } @@ -435,6 +442,7 @@ class _ScrollablePositionedListState extends State addSemanticIndexes: widget.addSemanticIndexes, semanticChildCount: widget.semanticChildCount, padding: widget.padding, + clipBehavior: widget.clipBehavior, addAutomaticKeepAlives: widget.addAutomaticKeepAlives, addRepaintBoundaries: widget.addRepaintBoundaries, ), @@ -450,6 +458,7 @@ class _ScrollablePositionedListState extends State child: NotificationListener( onNotification: (_) => false, child: PositionedList( + clipBehavior: widget.clipBehavior, itemBuilder: widget.itemBuilder, separatorBuilder: widget.separatorBuilder, itemCount: widget.itemCount, diff --git a/packages/scrollable_positioned_list/lib/src/viewport.dart b/packages/scrollable_positioned_list/lib/src/viewport.dart index 1de5ff05..e81b298b 100644 --- a/packages/scrollable_positioned_list/lib/src/viewport.dart +++ b/packages/scrollable_positioned_list/lib/src/viewport.dart @@ -21,6 +21,7 @@ class UnboundedViewport extends Viewport { required ViewportOffset offset, Key? center, double? cacheExtent, + Clip clipBehavior = Clip.hardEdge, List slivers = const [], }) : _anchor = anchor, super( @@ -30,6 +31,7 @@ class UnboundedViewport extends Viewport { offset: offset, center: center, cacheExtent: cacheExtent, + clipBehavior: clipBehavior, slivers: slivers); // [Viewport] enforces constraints on [Viewport.anchor], so we need our own @@ -70,6 +72,7 @@ class UnboundedRenderViewport extends RenderViewport { List? children, RenderSliver? center, double? cacheExtent, + Clip clipBehavior = Clip.hardEdge, }) : _anchor = anchor, super( axisDirection: axisDirection, @@ -77,6 +80,7 @@ class UnboundedRenderViewport extends RenderViewport { offset: offset, center: center, cacheExtent: cacheExtent, + clipBehavior: clipBehavior, children: children); static const int _maxLayoutCycles = 10; diff --git a/packages/scrollable_positioned_list/lib/src/wrapping.dart b/packages/scrollable_positioned_list/lib/src/wrapping.dart index 47a4b7e7..6aef412c 100644 --- a/packages/scrollable_positioned_list/lib/src/wrapping.dart +++ b/packages/scrollable_positioned_list/lib/src/wrapping.dart @@ -45,6 +45,7 @@ class CustomShrinkWrappingViewport extends CustomViewport { List? children, Key? center, double? cacheExtent, + Clip clipBehavior = Clip.hardEdge, List slivers = const [], }) : _anchor = anchor, super( @@ -54,6 +55,7 @@ class CustomShrinkWrappingViewport extends CustomViewport { offset: offset, center: center, cacheExtent: cacheExtent, + clipBehavior: clipBehavior, slivers: slivers); // [Viewport] enforces constraints on [Viewport.anchor], so we need our own