
This change reworks how users define previews in their code, expands the number of valid 'functions' that can be used to create previews, and allows for specifying a 'wrapper' function to wrap the previewed widget with The `WidgetPreview` class has been removed from the framework, with its properties being added to the `Preview` annotation class instead to remove some boilerplate from the preview declaration workflow. Before: ```dart @Preview() List<WidgetPreview> previews() => <WidgetPreview>[ WidgetPreview( name: 'Top-level preview', child: Text('Foo'), ), ]; ``` After: ```dart @Preview(name: 'Top-level preview') Widget previews() => Text('Foo'); ``` Previews can now be defined using top-level functions, constructors and factories which take no arguments, and static methods within classes: Examples: ```dart @Preview(name: 'Top-level preview') Widget previews() => Text('Foo'); class MyWidget extends StatelessWidget { @Preview(name: 'Constructor preview') MyWidget.preview(); @Preview(name: 'Factory preview') factory MyWidget.factoryPreview() => MyWidget.preview(); @Preview(name: 'Static preview') static Widget previewStatic() => Text('Static'); @override Widget build(BuildContext context) { return Text('MyWidget'); } } ``` Users can also provide a `wrapper` function with the signature `Widget Function(Widget)` to easily wrap previewed widget with shared bootstrapping logic. Example: ```dart Widget testWrapper(Widget child) { return Provider<int>.value( value: 42, child: child, ); } @Preview(name: 'Preview with wrapper', wrapper: testWrapper) Widget preview() { return Text('Attributes'); } ``` Which is effectively the same as: ```dart @Preview(name: 'Preview with wrapper') Widget preview() { return Provider<int>.value( value: 42, child: Text('Attributes'), ); } ``` Finally, for situations where a `BuildContext` is needed, users can return a `WidgetBuilder` from their preview function: ```dart @Preview('Builder preview') WidgetBuilder builderPreview() { return (BuildContext context) { // TODO: retrieve state from context. return Text('Foo'); }; } ```
This directory contains tests for specific flutter
commands.
Tests that are self-contained unit tests should go in hermetic/
.
Tests that are more end-to-end, e.g. that involve actually running
subprocesses, should go in permeable/
.
The ../../tool/coverage_tool.dart
script (which is used to collect
coverage for the tool) runs only the tests in the hermetic
directory
when collecting coverage.