Replace AnimationSheetBuilder.display with collate
Summary
#
The AnimationSheetBuilder.display and sheetSize
methods are deprecated, and should be replaced with
AnimationSheetBuilder.collate.
Context
#
AnimationSheetBuilder
is a testing utility
class that records frames of an animating widget,
and later composes the frames into a single
animation sheet for golden testing. The old way
of composing involves display to list the images
into a table-like widget, adjusting the testing
surface with sheetSize, and capturing the table
widget for comparison. A new way, collate, has
been added that directly puts the frames together
into an image for comparison, which requires less
boilerplate code and outputs a smaller image without
compromise in quality. APIs for the old way are thus
deprecated.
The reason why collate outputs a smaller image,
is because the old way captures on a testing surface
with pixel ratio 3.0, which means it uses a 3x3 pixel
block of the exactly same color to represent 1 actual
pixel, making the image 9 times as large as necessary
(before PNG compression).
Description of change
#
The following changes have been made to the
AnimationSheetBuilder
class:
- 'display' is deprecated and shouldn't be used
- 'sheetSize' is deprecated and shouldn't be used
Migration guide
#
To migrate to the new API, change the process of setting
surface size and displaying the widget into
AnimationSheetBuilder.collate.
Derive cells per row
#
The collate requires an explicit cellsPerRow
argument, which is the number of frames per
row in the output image. It can be manually counted,
or calculated as follows:
-
Find the width of frame, specified when constructing
AnimationSheetBuilder. For example, in the following snippet it's 80:
final AnimationSheetBuilder animationSheet = AnimationSheetBuilder(frameSize: const Size(80, 30));
- Find the width of surface size, specified when setting the surface size; the default is 800. For example, in the following snippet it's 600:
tester.binding.setSurfaceSize(animationSheet.sheetSize(600));
- The frames per row should be the result of the two numbers divided, rounded down. For example, 600 / 80 = 7 (rounded down), therefore
animationSheet.collate(7)
Migrate code
#Code before migration:
testWidgets('Indeterminate CircularProgressIndicator', (WidgetTester tester) async {
final AnimationSheetBuilder animationSheet = AnimationSheetBuilder(frameSize: const Size(40, 40));
await tester.pumpFrames(animationSheet.record(
const Directionality(
textDirection: TextDirection.ltr,
child: Padding(
padding: EdgeInsets.all(4),
child: CircularProgressIndicator(),
),
),
), const Duration(seconds: 2));
// The code starting here needs migration.
tester.binding.setSurfaceSize(animationSheet.sheetSize());
final Widget display = await animationSheet.display();
await tester.pumpWidget(display);
await expectLater(
find.byWidget(display),
matchesGoldenFile('material.circular_progress_indicator.indeterminate.png'),
);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/42767
Code after migration (cellsPerRow is 20, derived from 800 / 40):
testWidgets('Indeterminate CircularProgressIndicator', (WidgetTester tester) async {
final AnimationSheetBuilder animationSheet = AnimationSheetBuilder(frameSize: const Size(40, 40));
await tester.pumpFrames(animationSheet.record(
const Directionality(
textDirection: TextDirection.ltr,
child: Padding(
padding: EdgeInsets.all(4),
child: CircularProgressIndicator(),
),
),
), const Duration(seconds: 2));
await expectLater(
animationSheet.collate(20),
matchesGoldenFile('material.circular_progress_indicator.indeterminate.png'),
);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/42767
It's expected that related golden test reference images are invalidated, which should all be updated. The new images should be identical to the old ones except 1/3 in scale.
Timeline
#
Landed in version: v2.3.0-13.0.pre
In stable release: 2.5
References
#API documentation:
Relevant PR:
Unless stated otherwise, the documentation on this site reflects Flutter 3.35.5. Page last updated on 2025-10-28. View source or report an issue.