skills/flutter/flutter-add-widget-preview/SKILL.md
Add interactive widget previews using the @Preview annotation system. Use when creating new UI components, verifying designs in isolation, or testing visual states without running the full app.
npx skillsauth add dhruvanbhalara/skills flutter-add-widget-previewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use the Flutter Widget Previewer to render widgets in real-time, isolated from the full application context.
@Preview annotation to:
WidgetWidgetpackage:flutter/widget_previews.dart.@Preview annotations to a single target for multiple preview instances (e.g., light/dark mode).name and group parameters for organized preview panels.size parameter if the widget is unconstrained — the previewer defaults to approximately half the viewport.The Widget Previewer runs in a web environment. Adhere to these constraints:
| Limitation | Impact | Workaround |
|---|---|---|
| No dart:io | File system, sockets unavailable | Use conditional imports to mock |
| No dart:ffi | Native code won't execute | Stub native calls in preview mode |
| Asset paths | dart:ui fromAsset requires package paths | Use packages/my_package/assets/... |
| Callbacks | Must be public and constant | No closures in annotation params |
| Unconstrained widgets | May render incorrectly | Set size parameter in @Preview |
flutter widget-preview start
Opens a Chrome environment with live previews.
Create reusable preview configurations by extending the Preview class:
import 'package:flutter/widget_previews.dart';
import 'package:flutter/material.dart';
final class ThemedPreview extends Preview {
const ThemedPreview({super.name, super.group});
PreviewThemeData _themeBuilder() {
return PreviewThemeData(
materialLight: ThemeData.light(),
materialDark: ThemeData.dark(),
);
}
@override
Preview transform() {
final originalPreview = super.transform();
final builder = originalPreview.toBuilder()
..name = 'Themed - ${originalPreview.name}'
..theme = _themeBuilder;
return builder.toPreview();
}
}
@ThemedPreview(name: 'Primary Button')
Widget primaryButton() => const ElevatedButton(onPressed: null, child: Text('Click'));
final class MultiBrightnessPreview extends MultiPreview {
const MultiBrightnessPreview({required this.name});
final String name;
@override
List<Preview> get previews => const [
Preview(brightness: Brightness.light),
Preview(brightness: Brightness.dark),
];
@override
List<Preview> transform() {
return super.transform().map((preview) {
final builder = preview.toBuilder()
..group = 'Brightness'
..name = '$name - ${preview.brightness!.name}';
return builder.toPreview();
}).toList();
}
}
@MultiBrightnessPreview(name: 'User Card')
Widget userCard() => const Card(
child: Padding(padding: EdgeInsets.all(16), child: Text('John Doe')),
);
package:flutter/widget_previews.dart.@Preview annotation with name, group, size params.Preview subclass.flutter widget-preview start).import 'package:flutter/widget_previews.dart';
import 'package:flutter/material.dart';
@Preview(name: 'Greeting Text', group: 'Typography')
Widget greetingText() {
return const Text('Hello, World!', style: TextStyle(fontSize: 24));
}
@Preview(
name: 'Login Form',
group: 'Forms',
size: Size(400, 600),
)
Widget loginFormPreview() {
return const MaterialApp(home: LoginForm());
}
@Preview(name: 'Default Avatar')
class UserAvatar extends StatelessWidget {
const UserAvatar({super.key});
@override
Widget build(BuildContext context) {
return const CircleAvatar(radius: 40, child: Icon(Icons.person));
}
}
development
Perform REST API networking operations (GET, POST, PUT, DELETE) using the lightweight and robust standard `http` package, including platform configurations and background parsing models.
development
Configure internationalization and localization support using Flutter's built-in l10n system, App Resource Bundle (ARB) files, and ICU formatting syntax.
development
Create model classes with fromJson/toJson using dart:convert and Dart 3 pattern matching. Use when manually mapping JSON to classes, parsing HTTP responses, or choosing between manual and code-generated serialization.
data-ai
Diagnose and fix Flutter layout constraint violations (RenderFlex overflow, unbounded height/width, ParentData misuse). Use when encountering layout exceptions, yellow-black overflow stripes, or red error screens.