Skip to content

Instantly share code, notes, and snippets.

@Piinks
Created March 6, 2026 18:05
Show Gist options
  • Select an option

  • Save Piinks/129ce6cf3f6c03d8d6188f292a7325c9 to your computer and use it in GitHub Desktop.

Select an option

Save Piinks/129ce6cf3f6c03d8d6188f292a7325c9 to your computer and use it in GitHub Desktop.
cacheExtent setter regression?
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