@@ -28,12 +28,17 @@ void main() {
2828 );
2929 }
3030
31- Widget _buildSliverListView () {
31+ Widget _buildSliverListView ({
32+ NullableIndexedWidgetBuilder ? builder,
33+ }) {
3234 return SliverList (
3335 key: sliverListKey,
3436 delegate: SliverChildBuilderDelegate (
3537 (ctx, index) {
3638 _sliverListCtx ?? = ctx;
39+ if (builder != null ) {
40+ return builder (ctx, index);
41+ }
3742 return Container (
3843 height: (index % 2 == 0 ) ? 80 : 50 ,
3944 color: Colors .red,
@@ -47,7 +52,9 @@ void main() {
4752 );
4853 }
4954
50- Widget _buildSliverGridView () {
55+ Widget _buildSliverGridView ({
56+ NullableIndexedWidgetBuilder ? builder,
57+ }) {
5158 return SliverGrid (
5259 key: sliverGridKey,
5360 gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount (
@@ -59,6 +66,9 @@ void main() {
5966 delegate: SliverChildBuilderDelegate (
6067 (BuildContext context, int index) {
6168 _sliverGridCtx ?? = context;
69+ if (builder != null ) {
70+ return builder (context, index);
71+ }
6272 return Container (
6373 color: Colors .green,
6474 child: Center (
@@ -73,13 +83,19 @@ void main() {
7383
7484 Widget _buildScrollView ({
7585 ScrollController ? scrollController,
86+ NullableIndexedWidgetBuilder ? listItemBuilder,
87+ NullableIndexedWidgetBuilder ? gridItemBuilder,
7688 }) {
7789 return _buildDirectionality (
7890 child: CustomScrollView (
7991 controller: scrollController,
8092 slivers: [
81- _buildSliverListView (),
82- _buildSliverGridView (),
93+ _buildSliverListView (
94+ builder: listItemBuilder,
95+ ),
96+ _buildSliverGridView (
97+ builder: gridItemBuilder,
98+ ),
8399 ],
84100 ),
85101 );
@@ -92,8 +108,9 @@ void main() {
92108
93109 testWidgets ('Check isForbidObserveCallback' , (tester) async {
94110 final scrollController = ScrollController ();
95- final observerController =
96- SliverObserverController (controller: scrollController);
111+ final observerController = SliverObserverController (
112+ controller: scrollController,
113+ );
97114
98115 Widget widget = _buildScrollView (
99116 scrollController: scrollController,
@@ -132,8 +149,9 @@ void main() {
132149
133150 testWidgets ('Check isForbidObserveViewportCallback' , (tester) async {
134151 final scrollController = ScrollController ();
135- final observerController =
136- SliverObserverController (controller: scrollController);
152+ final observerController = SliverObserverController (
153+ controller: scrollController,
154+ );
137155
138156 Widget widget = _buildScrollView (
139157 scrollController: scrollController,
@@ -174,9 +192,9 @@ void main() {
174192
175193 testWidgets ('Check observeIntervalForScrolling' , (tester) async {
176194 final scrollController = ScrollController ();
177- final observerController =
178- SliverObserverController ( controller: scrollController)
179- ..observeIntervalForScrolling = const Duration (milliseconds: 500 );
195+ final observerController = SliverObserverController (
196+ controller: scrollController,
197+ ) ..observeIntervalForScrolling = const Duration (milliseconds: 500 );
180198 int observeCountForOnObserveAll = 0 ;
181199 int observeCountForOnObserveViewport = 0 ;
182200
@@ -236,6 +254,69 @@ void main() {
236254 scrollController.dispose ();
237255 });
238256
257+ testWidgets ('scrollNotificationPredicate' , (tester) async {
258+ final scrollController = ScrollController ();
259+ final observerController = SliverObserverController (
260+ controller: scrollController,
261+ );
262+ final pageController = PageController ();
263+ bool isCalledOnObserve = false ;
264+
265+ Widget widget = _buildScrollView (
266+ scrollController: scrollController,
267+ listItemBuilder: (context, index) {
268+ if (index == 0 ) {
269+ return SizedBox (
270+ height: 200 ,
271+ child: PageView .builder (
272+ scrollDirection: Axis .horizontal,
273+ controller: pageController,
274+ itemBuilder: (ctx, index) {
275+ return const SizedBox .expand ();
276+ },
277+ itemCount: 10 ,
278+ ),
279+ );
280+ }
281+ return const SizedBox (height: 80 );
282+ },
283+ );
284+ widget = SliverViewObserver (
285+ child: widget,
286+ controller: observerController,
287+ scrollNotificationPredicate: defaultScrollNotificationPredicate,
288+ sliverContexts: () {
289+ return [
290+ if (_sliverListCtx != null ) _sliverListCtx! ,
291+ if (_sliverGridCtx != null ) _sliverGridCtx! ,
292+ ];
293+ },
294+ onObserveAll: (result) {
295+ isCalledOnObserve = true ;
296+ },
297+ );
298+ await tester.pumpWidget (widget);
299+
300+ pageController.animateToPage (
301+ 3 ,
302+ duration: const Duration (milliseconds: 100 ),
303+ curve: Curves .easeInOut,
304+ );
305+ await tester.pumpAndSettle ();
306+ expect (pageController.page, 3 );
307+ expect (isCalledOnObserve, isFalse);
308+
309+ scrollController.animateTo (
310+ 10 ,
311+ duration: const Duration (milliseconds: 100 ),
312+ curve: Curves .easeInOut,
313+ );
314+ expect (isCalledOnObserve, isTrue);
315+
316+ scrollController.dispose ();
317+ pageController.dispose ();
318+ });
319+
239320 group (
240321 'ObserverScrollNotification' ,
241322 () {
@@ -256,8 +337,9 @@ void main() {
256337 indexOfDecisionNoti = - 1 ;
257338 indexOfEndNoti = - 1 ;
258339 scrollController = ScrollController ();
259- observerController =
260- SliverObserverController (controller: scrollController);
340+ observerController = SliverObserverController (
341+ controller: scrollController,
342+ );
261343
262344 widget = _buildScrollView (
263345 scrollController: scrollController,
0 commit comments