Contents
カスタムウィジェットの概要と公式サポート
FlutterFlow では、標準パレットにない UI コンポーネントやロジックを Dart コードで実装 し、アプリ内へ組み込むことができます。これを「カスタムウィジェット」と呼び、公式ドキュメントでも Custom Widgets として明示的にサポートされています【FlutterFlow Documentation: Custom Widgets】[^1]。
本セクションでは、なぜカスタムウィジェットが必要か、そして 全プランで利用可能なのは事実だが機能面の差異があること を簡潔にまとめます。
- ビジュアルエディタだけでは表現できない高度なグラフ・ゲームロジック
- ノーコードとコードベースをハイブリッドに活用できる柔軟性
- プラン別のビルド回数制限が作業効率に与える影響
必要な事前準備
カスタムウィジェット作成は、環境設定が整っていないと途中で手間が増えてしまいます。ここでは アカウント取得 → プロジェクト作成 → プラン確認 → 基本的な Dart 知識 の4ステップを順に解説します。
1. アカウント取得
FlutterFlow の公式サイト(https://flutterflow.io)からメール認証で無料アカウントを作成します。登録後はダッシュボードへ即座にアクセス可能です。
2. プロジェクトの新規作成
Dashboard の Create New Project をクリックし、テンプレートか空白プロジェクトを選択します。名前・対象プラットフォーム(iOS / Android / Web)を設定すれば、基本的な開発環境が完成します。
3. プランの確認とビルド回数制限
| プラン | 月間クラウドビルド上限* | 主な特徴 |
|---|---|---|
| Free | 10 回 | カスタムコード利用可、ビルド回数に制限あり |
| Pro | 無制限 | ビルド回数無制限+チーム共有機能 |
| Team | 無制限 | Pro の機能に加え、ロールベースの権限管理 |
*2025 年 4 月時点の公式プラン情報(FlutterFlow Pricing)[^2]。Free プランは 月間 10 回 が上限であり、頻繁にテストする場合は Pro または Team へのアップグレードが推奨されます。
4. 基本的な Dart 知識
カスタムウィジェットは Dart で記述します。最低限以下の構文を把握しておくとスムーズです。
- 変数宣言 (
var,final) - 関数定義 (
Widget build(BuildContext context)) - クラス継承 (
class MyWidget extends StatelessWidget)
ビルド回数制限とプラン比較(最新情報)
Free プランのビルド上限は 月間 10 回 と公式に明記されていますが、過去のブログ記事や非公式情報では「5 回」や「15 回」といった表記が混在していました。誤解を防ぐため、最新プランページ(2025 年 4 月更新)を直接参照してください【FlutterFlow Pricing】[^2]。
ポイント
- ビルド回数は「クラウドビルド」のみ対象です。ローカルでflutterflow_cliを使ったテストはカウントされません。
- Free ユーザーは ローカルデバッグ を活用し、クラウドビルドの回数を節約する戦略が有効です。
カスタムウィジェット作成フロー
以下では、公式ガイド(2025 年 8 月版)と実務で広く利用されている AI 補助ツール Gemini と Cursor の活用例を交えて、ステップバイステップで解説します。なお、Gemini と Cursor は FlutterFlow が公式に統合しているわけではなく、外部 AI アシスタントとして提供されている ことに留意してください(詳細は各サービスの利用規約をご参照)[^3][^4]。
ステップ① ウィジェット名と概要を設定する
カスタムウィジェット画面で「Add New」をクリックし、以下項目を入力します。
- Widget Name – プロジェクト内で一意になる名前(例:
HelloWorldWidget) - Description – 簡潔な概要(例: 「センターに Hello World を表示」)
これだけでコードエディタが自動的に開き、次の工程へ進めます。
ステップ② Gemini で雛形コードを生成
Gemini は Google が提供する大規模言語モデルです。FlutterFlow の UI に AI Assist ボタンはありませんが、外部ブラウザや VS Code 拡張機能から呼び出すことができます。
- 利用手順
- Gemini の Web コンソールまたは拡張機能を起動
-
プロンプト例:
Dart で StatelessWidget を作成してください。センターに "Hello World" と表示するだけです。 -
出力されたコードをコピーし、FlutterFlow のカスタムウィジェットエディタに貼り付けて Save
生成されるコード例は以下の通りです(実際には最新 Flutter SDK に合わせたインポートが自動で含まれます):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import 'package:flutter/material.dart'; class HelloWorldWidget extends StatelessWidget { const HelloWorldWidget({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Center( child: Text('Hello World', style: Theme.of(context).textTheme.headlineSmall), ); } } |
注意
Gemini の出力はあくまで「提案」なので、必ず コードの整合性とセキュリティ を自分で確認してください。
ステップ③ Cursor で微調整・デバッグ
Cursor(cursor.com)は AI がコンテキストを保持したままリアルタイムでコード補完・修正を行えるエディタです。FlutterFlow のカスタムウィジェット画面から Edit with Cursor を選択すると、ブラウザ内に統合されたエディタが立ち上がります。
- 代表的な利用例:インベーダーゲーム風ロジックの追加
- プロンプト: 「敵キャラが左右に往復し、画面端で向きを変えるロジックを実装してください」
- Cursor が生成した
AnimationControllerとTimer.periodicを受け入れ、Save
このとき得られるコードは以下のようになります(抜粋):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
class InvaderWidget extends StatefulWidget { const InvaderWidget({Key? key}) : super(key: key); @override _InvaderWidgetState createState() => _InvaderWidgetState(); } class _InvaderWidgetState extends State<InvaderWidget> with SingleTickerProviderStateMixin { late AnimationController _controller; double _xPos = 0; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: const Duration(seconds: 4), )..addListener(() { setState(() { _xPos += 1; if (_xPos > MediaQuery.of(context).size.width) { _xPos = -50; // 左端にリセット } }); }); _controller.repeat(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) => Positioned( left: _xPos, bottom: 100, child: Icon(Icons.airplanemode_active, size: 48), ); } |
ポイント
- Cursor の提案は コードコンテキストを保持 しているため、手動で検索・貼り付けするよりエラーが少ないです。
- 提案内容は必ずローカルでビルド・プレビューし、期待通りに動作するか確認してください。
ステップ④ 外部パッケージのインポートとバージョン管理
カスタムウィジェットで charts_flutter など外部ライブラリを使う場合は、Package Manager から依存関係を追加します。
- カスタムコード画面 → Add Dependency ボタン
- パッケージ名(例:
charts_flutter) を検索し、最新安定版(2025 年 10 月時点で^0.12.0)を選択
自動的に pubspec.yaml に以下が追記されます:
|
1 2 3 4 5 |
dependencies: flutter: sdk: flutter charts_flutter: ^0.12.0 |
注意:古いバージョンを手動で指定すると、Flutter SDK と衝突しビルドエラーになる可能性があります。常に公式が推奨する 最新安定版 を使用してください。
ステップ⑤ プレビューとコンパイルチェックポイント
保存後は右上の Preview ボタンでウィジェットを即座に確認できます。エラーが出た場合は Compile Log から原因を特定します。
| チェック項目 | 確認方法 |
|---|---|
| Missing import | ログに Undefined name が表示されていないか |
| State dispose の有無 | StatefulWidget の dispose() が呼び出されているか |
| パッケージ警告 | pubspec.yaml のバージョン警告が出ていないか |
例として、AnimationController を忘れて dispose() しなかった場合は Memory leak 警告がコンソールに表示されます。該当行を追加すれば解消できます。
ステップ⑥ ページへの配置とプロパティ設定
カスタムウィジェットはデザイン画面の左側パネルからドラッグ&ドロップで配置できます。さらに 入力プロパティ を設定すると、同一ウィジェットを異なるページや条件で再利用しやすくなります。
- Custom Widgets パネル → 作成したウィジェットを選択
- 任意のページに配置し、サイズ・位置を調整
- Properties タブでプロパティを追加(例:
speed(double)、color(Color))
プロパティを設定すると、デザイン画面上にスライダーやカラーピッカーが自動生成され、リアルタイムでプレビューが更新されます。
|
1 2 |
InvaderWidget(speed: 2.5, color: Colors.red) |
デバッグとトラブルシューティング
アセット関連エラーの対処法
- SVG・フォント を
assets/に配置したら、必ずpubspec.yamlのflutter:セクションにパスを記述(インデントは 2 スペース)
|
1 2 3 4 5 |
flutter: assets: - assets/icons/ - assets/images/logo.svg |
- 変更後は Full Rebuild(左上メニューの Recompile)を実行して確実に反映させます。
よくあるエラーと対策一覧
| エラー | 主な原因 | 推奨対策 |
|---|---|---|
Undefined name 'Chart' |
パッケージ未インポート | import 'package:charts_flutter/flutter.dart' as charts; を追加 |
setState が呼ばれない |
タイマー外部で状態更新 | if (mounted) setState(() {}); を使用 |
| アセットパスが見つからない | pubspec.yaml のインデントミス |
2 スペースインデントで正しく記述 |
ログ取得と活用法
- プレビュー画面右上の Console アイコン → Show Logs
- コード内に
print('debug: $variable');やdebugPrint()を入れると、リアルタイムで出力が確認できる
ログはエラー解析の第一手段です。特に ビルド失敗時 はコンパイルロジックや依存関係の問題が多いため、最初にログをチェックしてください。
再利用・チーム共有のベストプラクティス
テンプレート化して保存
カスタムウィジェット画面右上の Save as Template をクリックし、テンプレート名を付けて保存します。プロジェクト内の「Templates」タブからいつでも呼び出せるため、チーム全体で UI の統一感が保たれます。
バージョン管理と Git 連携
重要なウィジェットは FlutterFlow CLI(flutterflow_cli)を使ってローカルにエクスポートし、GitHub にプッシュすると変更履歴が追跡できます。タグ付けやブランチ運用で以下のようなフローがおすすめです。
|
1 2 3 4 5 6 |
git checkout -b widget/invader-v1 # 変更 → flutterflow_cli export git commit -am "Add InvaderWidget v1" git tag -a v1.0 -m "First release of InvaderWidget" git push origin widget/invader-v1 --tags |
チーム内共有のポイント
- 権限設定:Team プランではロールベースで編集権限を細分化できるため、コードレビュー担当者だけがウィジェットを更新できるようにする。
- ドキュメント化:各ウィジェットの使用方法・プロパティ一覧を Markdown か Notion に残しておくと、新メンバーでもすぐに利用可能。
次に取るべきアクション
- Hello World ウィジェット を作成し、プレビューで動作確認。
- charts_flutter パッケージを追加し、円グラフウィジェットを実装。
- 必要に応じて Gemini でコード雛形を生成し、Cursor でロジックや UI の微調整を行う。
- 完成したウィジェットはテンプレート化し、チーム共有リポジトリへプッシュしてバージョン管理を開始する。
これらの手順を踏めば、FlutterFlow で コード生成からデバッグ・再利用まで一貫したフロー が構築でき、プロジェクト全体の開発効率が大幅に向上します。
参考文献
[^1]: FlutterFlow Documentation – Custom Widgets. https://docs.flutterflow.io/custom-widgets (accessed 2025-04-28)
[^2]: FlutterFlow Pricing. https://flutterflow.io/pricing (accessed 2025-04-28)
[^3]: Gemini AI – Google Cloud. https://cloud.google.com/vertex-ai/generative-ai/docs/start (accessed 2025-04-27)
[^4]: Cursor – AI‑powered code editor. https://cursor.com (accessed 2025-04-27)