@@ -153,6 +153,70 @@ void main() {
153
153
// will get placed at zero rather than properly extend up off screen.
154
154
check (tester.getTopLeft (find.text ("Item 0" ))).equals (Offset (0 , - 200 ));
155
155
});
156
+
157
+ testWidgets ('sliver only part of viewport, header at end' , (tester) async {
158
+ const centerKey = ValueKey ('center' );
159
+ final controller = ScrollController ();
160
+ await tester.pumpWidget (Directionality (textDirection: TextDirection .ltr,
161
+ child: CustomScrollView (
162
+ controller: controller,
163
+ anchor: 0.5 ,
164
+ center: centerKey,
165
+ slivers: [
166
+ SliverStickyHeaderList (
167
+ headerPlacement: HeaderPlacement .scrollingStart,
168
+ delegate: SliverChildListDelegate (
169
+ List .generate (100 , (i) => StickyHeaderItem (
170
+ header: _Header (99 - i, height: 20 ),
171
+ child: _Item (99 - i, height: 100 ))))),
172
+ SliverStickyHeaderList (
173
+ key: centerKey,
174
+ headerPlacement: HeaderPlacement .scrollingStart,
175
+ delegate: SliverChildListDelegate (
176
+ List .generate (100 , (i) => StickyHeaderItem (
177
+ header: _Header (100 + i, height: 20 ),
178
+ child: _Item (100 + i, height: 100 ))))),
179
+ ])));
180
+
181
+ final overallSize = tester.getSize (find.byType (CustomScrollView ));
182
+ final extent = overallSize.onAxis (Axis .vertical);
183
+ assert (extent == 600 );
184
+
185
+ void checkState (int index, {required double item, required double header}) {
186
+ final itemElement = tester.firstElement (find.byElementPredicate ((element) {
187
+ if (element.widget is ! _Item ) return false ;
188
+ final renderObject = element.renderObject as RenderBox ;
189
+ return (renderObject.size.contains (renderObject.globalToLocal (
190
+ Offset (overallSize.width / 2 , 1 )
191
+ )));
192
+ }));
193
+ final itemWidget = itemElement.widget as _Item ;
194
+ check (itemWidget.index).equals (index);
195
+ // TODO the `.first` calls should be unnecessary; that's another bug
196
+ // check(_headerIndex(tester)).equals(index);
197
+ check (tester.widget <_Header >(find.byType (_Header ).first).index)
198
+ .equals (index);
199
+ check ((itemElement.renderObject as RenderBox ).localToGlobal (Offset (0 , 0 )))
200
+ .equals (Offset (0 , item));
201
+ check (tester.getTopLeft (find.byType (_Header ).first))
202
+ .equals (Offset (0 , header));
203
+ }
204
+
205
+ check (controller.offset).equals (0 );
206
+ checkState ( 97 , item: 0 , header: 0 );
207
+
208
+ controller.jumpTo (- 5 );
209
+ await tester.pump ();
210
+ checkState ( 96 , item: - 95 , header: - 15 );
211
+
212
+ controller.jumpTo (- 600 );
213
+ await tester.pump ();
214
+ checkState ( 91 , item: 0 , header: 0 );
215
+
216
+ controller.jumpTo (600 );
217
+ await tester.pump ();
218
+ checkState (103 , item: 0 , header: 0 );
219
+ });
156
220
}
157
221
158
222
Future <void > _checkSequence (
0 commit comments