Created
March 6, 2026 18:05
-
-
Save Piinks/129ce6cf3f6c03d8d6188f292a7325c9 to your computer and use it in GitHub Desktop.
cacheExtent setter regression?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import 'package:flutter/rendering.dart'; | |
| import 'package:flutter/widgets.dart'; | |
| import 'package:flutter_test/flutter_test.dart'; | |
| void main() { | |
| test('RenderViewport cacheExtent setter bug reproduction', () { | |
| final viewport = RenderViewport( | |
| axisDirection: AxisDirection.down, | |
| crossAxisDirection: AxisDirection.right, | |
| offset: ViewportOffset.fixed(0.0), | |
| ); | |
| // New default is viewport-based | |
| expect(viewport.scrollCacheExtent.style, CacheExtentStyle.viewport); | |
| // Using deprecated setter with a pixel value | |
| viewport.cacheExtent = 300.0; | |
| // BUG: It still thinks it's in 'viewport' style, so it's now 300 viewports. | |
| expect(viewport.scrollCacheExtent.style, CacheExtentStyle.viewport); | |
| expect(viewport.scrollCacheExtent.value, 300.0); | |
| }); | |
| testWidgets('Extremely large cache extent from deprecated setter', (WidgetTester tester) async { | |
| final List<int> builtIndices = []; | |
| await tester.pumpWidget( | |
| Directionality( | |
| textDirection: TextDirection.ltr, | |
| child: ListView.builder( | |
| itemBuilder: (context, index) { | |
| builtIndices.add(index); | |
| return SizedBox(height: 100, child: Text('Item $index')); | |
| }, | |
| ), | |
| ), | |
| ); | |
| final RenderViewport renderViewport = tester.renderObject(find.byType(Viewport)); | |
| await tester.pump(); | |
| expect(builtIndices.length, lessThan(20)); | |
| // REGRESSION: Using the deprecated setter. | |
| // A developer setting 300.0 likely expects 300 pixels of cache. | |
| // However, it incorrectly preserves the 'viewport' style from the new default. | |
| renderViewport.cacheExtent = 300.0; | |
| builtIndices.clear(); | |
| await tester.pump(); | |
| // In a 600px high viewport, 300 viewports = 1800 items! | |
| print('Items built with cacheExtent=300: ${builtIndices.length}'); | |
| expect(builtIndices.length, greaterThan(1000)); | |
| }); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment