flutter-add-widget-preview
`previews.dart` システムを使用してプロジェクトにインタラクティブなウィジェットプレビューを追加します。新しいUIコンポーネントの作成時や既存画面の更新時に使用することで、一貫したデザインの確認とインタラクティブなテストを実現します。
description の原文を見る
Adds interactive widget previews to the project using the previews.dart system. Use when creating new UI components or updating existing screens to ensure consistent design and interactive testing.
SKILL.md 本文
Flutter ウィジェットのプレビュー
目次
プレビューガイドライン
Flutter ウィジェットプレビューアを使用して、ウィジェットをリアルタイムで、アプリケーション全体のコンテキストから分離した状態でレンダリングします。
- 対象要素:
@Previewアノテーションを、トップレベル関数、クラス内のスタティックメソッド、または必須引数がなくWidgetまたはWidgetBuilderを返すパブリックウィジェットコンストラクタ/ファクトリに適用します。 - インポート: プレビューアノテーションにアクセスするために、常に
package:flutter/widget_previews.dartをインポートしてください。 - カスタムアノテーション:
Previewクラスを拡張して、複数のウィジェット全体に共通のプロパティ(例:テーマ、ラッパー)を注入するカスタムアノテーションを作成します。 - 複数の設定: 単一の対象に複数の
@Previewアノテーションを適用して、複数のプレビューインスタンスを生成します。または、MultiPreviewを拡張して、共通のマルチプレビュー設定をカプセル化します。 - ランタイム変換: カスタム
PreviewまたはMultiPreviewクラスのtransform()メソッドをオーバーライドして、ランタイムでプレビュー設定を動的に変更します(例:動的な値に基づいて名前を生成する場合、これはconstコンテキストでは不可能です)。
制限事項への対応
ウィジェットプレビューアが Web 環境で実行されるため、プレビュー可能なウィジェットを作成する際は、以下の制約を遵守してください。
- ネイティブ API を使用しない: ネイティブプラグインまたは
dart:ioやdart:ffiの API を使用しないでください。dart:ioまたはdart:ffiに対する推移的な依存関係を持つウィジェットは、呼び出し時に例外をスローします。条件付きインポートを使用して、プレビューモードでこれらをモックするか、バイパスしてください。 - アセットパス:
dart:uiのfromAssetAPI を経由してロードされるアセットには、パッケージベースのパス(例:assets/my_image.pngではなくpackages/my_package_name/assets/my_image.png)を使用してください。 - パブリックコールバック: プレビューアノテーションに提供されるすべてのコールバック引数がパブリックで定数であることを確認して、コード生成要件を満たしてください。
- 制約: ウィジェットが無制約の場合、
@Previewアノテーションのsizeパラメータを使用して明示的な制約を適用します。プレビューアはデフォルトでウィジェットをビューポートの約半分に制約します。
ワークフロー
ウィジェットプレビューを作成する
新しいウィジェットプレビューを実装するときに、このチェックリストをコピーして追跡してください。
-
package:flutter/widget_previews.dartをインポートします。 - 有効な対象を特定します(トップレベル関数、スタティックメソッド、または引数なしのパブリックコンストラクタ)。
-
@Previewアノテーションをその対象に適用します。 - 必要に応じてプレビューパラメータ(
name、group、size、theme、brightnessなど)を設定します。 - 複数のウィジェットに同じ設定を適用する場合、設定を
Previewを拡張するカスタムクラスに抽出します。
プレビューと交互作用する
ウィジェットプレビューアを起動して対話するために、適切な条件付きワークフローに従ってください。
サポートされている IDE(Android Studio、IntelliJ、Flutter 3.38+ を備えた VS Code)を使用している場合:
- IDE を起動します。ウィジェットプレビューアが自動的に起動します。
- サイドバーの「Flutter Widget Preview」タブを開きます。
- 左下の「Filter previews by selected file」を切り替えて、現在のアクティブファイル外のプレビューを表示したい場合は、切り替えます。
コマンドラインを使用している場合:
- Flutter プロジェクトのルートディレクトリに移動します。
flutter widget-preview startを実行します。- 自動的に開いた Chrome 環境を表示します。
フィードバックループ:プレビュー反復処理
- ウィジェットコードまたはプレビュー設定を変更します。
- ウィジェットプレビューアの自動更新を監視します。
- グローバル状態(例:スタティック初期化子)が変更された場合:右下のグローバルホットリスタートボタンをクリックします。
- ローカルウィジェット状態のみをリセットする必要がある場合:特定のプレビューカード上の個別ホットリスタートボタンをクリックします。
- IDE/CLI コンソールでエラーを確認 → 修正 → 繰り返します。
例
基本的なプレビュー
import 'package:flutter/widget_previews.dart';
import 'package:flutter/material.dart';
@Preview(name: 'My Sample Text', group: 'Typography')
Widget mySampleText() {
return const Text('Hello, World!');
}
ランタイム変換を使用したカスタムプレビュー
import 'package:flutter/widget_previews.dart';
import 'package:flutter/material.dart';
final class TransformativePreview extends Preview {
const TransformativePreview({
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();
builder
..name = 'Transformed - ${originalPreview.name}'
..theme = _themeBuilder;
return builder.toPreview();
}
}
@TransformativePreview(name: 'Custom Themed Button')
Widget myButton() => const ElevatedButton(onPressed: null, child: Text('Click'));
MultiPreview の実装
import 'package:flutter/widget_previews.dart';
import 'package:flutter/material.dart';
/// ライトモードとダークモードのプレビューを自動的に作成します。
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() {
final previews = super.transform();
return previews.map((preview) {
final builder = preview.toBuilder()
..group = 'Brightness'
..name = '$name - ${preview.brightness!.name}';
return builder.toPreview();
}).toList();
}
}
@MultiBrightnessPreview(name: 'Primary Card')
Widget cardPreview() => const Card(child: Padding(padding: EdgeInsets.all(8.0), child: Text('Content')));
ライセンス: BSD-3-Clause(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- flutter
- リポジトリ
- flutter/skills
- ライセンス
- BSD-3-Clause
- 最終更新
- 不明
Source: https://github.com/flutter/skills / ライセンス: BSD-3-Clause
関連スキル
nano-banana-2
inference.sh CLIを通じてGoogle Gemini 3.1 Flash Image Preview(Nano Banana 2)で画像を生成します。テキストから画像を生成する機能、画像編集、最大14枚の複数画像入力、Google Searchグラウンディング機能に対応しています。トリガーワード:「nano banana 2」「nanobanana 2」「gemini 3.1 flash image」「gemini 3 1 flash image preview」「google image generation」
octocode-slides
洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。
gpt-image2-ppt
OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。
nano-banana
Nano Banana PRO(Gemini 3 Pro Image)およびNano Banana(Gemini 2.5 Flash Image)を使用したAI画像生成機能です。以下の場合に活用できます:(1)テキストプロンプトからの画像生成、(2)既存画像の編集、(3)インフォグラフィックス、ロゴ、商品写真、ステッカーなどのプロフェッショナルなビジュアルアセット制作、(4)複数画像での人物キャラクターの一貫性保持、(5)正確なテキスト描画を含む画像生成、(6)AI生成ビジュアルが必要なあらゆるタスク。「画像を生成」「画像を作成」「写真を作る」「ロゴをデザイン」「インフォグラフィックスを作成」「AI画像」「nano banana」またはその他の画像生成リクエストをトリガーとして機能します。
oiloil-ui-ux-guide
モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。
axiom-hig-ref
Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。