Skip to content

Commit ad7304a

Browse files
committed
update: unit test
1 parent a5b5994 commit ad7304a

File tree

3 files changed

+226
-22
lines changed

3 files changed

+226
-22
lines changed

test/grid_observer_test.dart

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ void main() {
66
Widget getGridView({
77
ScrollController? scrollController,
88
int itemCount = 200,
9+
NullableIndexedWidgetBuilder? itemBuilder,
910
}) {
1011
return Directionality(
1112
textDirection: TextDirection.ltr,
@@ -17,6 +18,9 @@ void main() {
1718
mainAxisSpacing: 5,
1819
),
1920
itemBuilder: (context, index) {
21+
if (itemBuilder != null) {
22+
return itemBuilder(context, index);
23+
}
2024
return Container(
2125
color: Colors.blue[100],
2226
child: Center(
@@ -31,8 +35,9 @@ void main() {
3135

3236
testWidgets('Auto get target sliver context', (tester) async {
3337
final scrollController = ScrollController();
34-
final gridObserverController =
35-
GridObserverController(controller: scrollController);
38+
final gridObserverController = GridObserverController(
39+
controller: scrollController,
40+
);
3641
Widget widget = getGridView(
3742
scrollController: scrollController,
3843
);
@@ -45,10 +50,65 @@ void main() {
4550
scrollController.dispose();
4651
});
4752

53+
testWidgets('scrollNotificationPredicate', (tester) async {
54+
final scrollController = ScrollController();
55+
final observerController = GridObserverController(
56+
controller: scrollController,
57+
);
58+
final pageController = PageController();
59+
bool isCalledOnObserve = false;
60+
61+
Widget widget = getGridView(
62+
scrollController: scrollController,
63+
itemBuilder: (ctx, index) {
64+
if (index == 0) {
65+
return PageView.builder(
66+
scrollDirection: Axis.horizontal,
67+
controller: pageController,
68+
itemBuilder: (ctx, index) {
69+
return const SizedBox.expand();
70+
},
71+
itemCount: 10,
72+
);
73+
}
74+
return const SizedBox.expand();
75+
},
76+
);
77+
widget = GridViewObserver(
78+
child: widget,
79+
controller: observerController,
80+
scrollNotificationPredicate: defaultScrollNotificationPredicate,
81+
onObserve: (result) {
82+
isCalledOnObserve = true;
83+
},
84+
);
85+
await tester.pumpWidget(widget);
86+
87+
pageController.animateToPage(
88+
3,
89+
duration: const Duration(milliseconds: 100),
90+
curve: Curves.easeInOut,
91+
);
92+
await tester.pumpAndSettle();
93+
expect(pageController.page, 3);
94+
expect(isCalledOnObserve, isFalse);
95+
96+
scrollController.animateTo(
97+
10,
98+
duration: const Duration(milliseconds: 100),
99+
curve: Curves.easeInOut,
100+
);
101+
expect(isCalledOnObserve, isTrue);
102+
103+
scrollController.dispose();
104+
pageController.dispose();
105+
});
106+
48107
testWidgets('Scroll to index', (tester) async {
49108
final scrollController = ScrollController();
50-
final gridObserverController =
51-
GridObserverController(controller: scrollController);
109+
final gridObserverController = GridObserverController(
110+
controller: scrollController,
111+
);
52112

53113
Widget widget = getGridView(
54114
scrollController: scrollController,
@@ -91,9 +151,9 @@ void main() {
91151
group('Cache index offset', () {
92152
testWidgets('Property cacheJumpIndexOffset', (tester) async {
93153
final scrollController = ScrollController();
94-
final observerController =
95-
GridObserverController(controller: scrollController)
96-
..cacheJumpIndexOffset = false;
154+
final observerController = GridObserverController(
155+
controller: scrollController,
156+
)..cacheJumpIndexOffset = false;
97157

98158
Widget widget = getGridView(
99159
scrollController: scrollController,
@@ -114,8 +174,9 @@ void main() {
114174

115175
testWidgets('Method clearScrollIndexCache', (tester) async {
116176
final scrollController = ScrollController();
117-
final observerController =
118-
GridObserverController(controller: scrollController);
177+
final observerController = GridObserverController(
178+
controller: scrollController,
179+
);
119180

120181
Widget widget = getGridView(
121182
scrollController: scrollController,

test/list_observer_test.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@ void main() {
88
int itemCount = 100,
99
bool isFixedHeight = false,
1010
double? cacheExtent,
11+
NullableIndexedWidgetBuilder? itemBuilder,
1112
}) {
1213
return Directionality(
1314
textDirection: TextDirection.ltr,
1415
child: ListView.separated(
1516
controller: scrollController,
1617
itemBuilder: (ctx, index) {
18+
if (itemBuilder != null) {
19+
return itemBuilder(ctx, index);
20+
}
1721
double height = 80;
1822
if (!isFixedHeight) {
1923
height = (index % 2 == 0) ? 80 : 50;
@@ -82,6 +86,63 @@ void main() {
8286
scrollController.dispose();
8387
});
8488

89+
testWidgets('scrollNotificationPredicate', (tester) async {
90+
final scrollController = ScrollController();
91+
final observerController = ListObserverController(
92+
controller: scrollController,
93+
);
94+
final pageController = PageController();
95+
bool isCalledOnObserve = false;
96+
97+
Widget widget = getListView(
98+
scrollController: scrollController,
99+
itemBuilder: (ctx, index) {
100+
if (index == 0) {
101+
return SizedBox(
102+
height: 200,
103+
child: PageView.builder(
104+
scrollDirection: Axis.horizontal,
105+
controller: pageController,
106+
itemBuilder: (ctx, index) {
107+
return const SizedBox.expand();
108+
},
109+
itemCount: 10,
110+
),
111+
);
112+
}
113+
return const SizedBox(height: 80);
114+
},
115+
);
116+
widget = ListViewObserver(
117+
child: widget,
118+
controller: observerController,
119+
scrollNotificationPredicate: defaultScrollNotificationPredicate,
120+
onObserve: (result) {
121+
isCalledOnObserve = true;
122+
},
123+
);
124+
await tester.pumpWidget(widget);
125+
126+
pageController.animateToPage(
127+
3,
128+
duration: const Duration(milliseconds: 100),
129+
curve: Curves.easeInOut,
130+
);
131+
await tester.pumpAndSettle();
132+
expect(pageController.page, 3);
133+
expect(isCalledOnObserve, isFalse);
134+
135+
scrollController.animateTo(
136+
10,
137+
duration: const Duration(milliseconds: 100),
138+
curve: Curves.easeInOut,
139+
);
140+
expect(isCalledOnObserve, isTrue);
141+
142+
scrollController.dispose();
143+
pageController.dispose();
144+
});
145+
85146
group('Scroll to index', () {
86147
testWidgets('Dynamic Height', (tester) async {
87148
final scrollController = ScrollController();

test/sliver_observer_test.dart

Lines changed: 95 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)