取り組みの背景 — Flutter × Claude Code が変える個人開発の生産性
Flutter は単一コードベースで iOS・Android・Web・デスクトップを同時にターゲットにできる Google 製フレームワークです。2026年現在、App Store / Google Play の両方を個人で運営する開発者にとって、最も合理的な選択肢のひとつとなっています。
一方で Flutter 開発には独自の課題があります。Dart 言語の独自性、ウィジェットツリーの深いネスト、状態管理ライブラリの多様性(Riverpod・Bloc・Provider)、そしてプラットフォームごとの設定ファイルの煩雑さ。これらは経験豊富な開発者でも時間を取られる作業です。
Claude Code はこれらの課題を大幅に解消します。ここで扱うのはFlutter プロジェクトの立ち上げから App Store 申請まで、Claude Code を活用した実践的なワークフローを段階的に解説します。
Claude Code のセットアップと基本的な使い方をまだ読んでいない方は、先にご確認ください。
1. Flutter プロジェクトへの Claude Code 導入準備
CLAUDE.md でプロジェクト文脈を伝える
Claude Code が Flutter コードを正確に生成するには、プロジェクト固有の情報をあらかじめ共有しておく点が肝心です。プロジェクトルートに CLAUDE.md を作成し、以下の情報を記述します。
# MyApp — CLAUDE.md
## 技術スタック
- Flutter 3.24 / Dart 3.5
- 状態管理: Riverpod 2.x(StateNotifier + AsyncNotifier パターン)
- ルーティング: go_router 13.x
- ネットワーク: dio + retrofit
- ローカルDB: Hive 4.x
- テスト: flutter_test + mocktail + integration_test
## ディレクトリ構成
lib/
├── features/ # Feature-first アーキテクチャ
│ └── {feature}/
│ ├── data/ # Repository / DataSource
│ ├── domain/ # UseCase / Entity
│ └── presentation/ # Page / ViewModel
├── core/ # 共通ユーティリティ
└── generated/ # Riverpod のコード生成
## コーディングルール
- すべてのウィジェットは ConsumerWidget を基底とする
- 非同期処理は AsyncNotifierProvider を使用
- Navigator.push は使わず go_router の context.go / context.push を使用
- l10n: ARB ファイルで日英2言語対応必須
## テスト方針
- ビジネスロジック: Unit Test(カバレッジ 80%以上)
- UI: WidgetTest(critical path のみ)
- E2E: integration_test(主要フロー 5本以上)
この CLAUDE.md を読み込んだ Claude Code は、プロジェクトのアーキテクチャを理解した上でコード生成します。
.claude/settings.json の最適設定
{
"permissions": {
"allow": [
"Bash(flutter:*)",
"Bash(dart:*)",
"Bash(fvm:*)",
"Write(lib/**)",
"Write(test/**)",
"Write(integration_test/**)"
]
}
}
flutter と dart コマンドの実行を明示的に許可することで、コード生成後の flutter pub get・dart format・flutter test を Claude Code が自律的に実行できます。
2. Riverpod 状態管理の自動生成パターン
AsyncNotifierProvider の雛形生成
Flutter Riverpod の学習コストで最も高い部分が AsyncNotifierProvider の定型コードです。Claude Code に以下のプロンプトを渡すと、プロジェクトの規約に沿った完全な実装を生成します。
壁紙一覧を取得する WallpaperListNotifier を作成してください。
- AsyncNotifierProvider を使用
- WallpaperRepository をコンストラクタインジェクション
- ページネーション対応(cursor-based)
- エラーハンドリング: NetworkException / ServerException を分けて処理
- 楽観的更新(お気に入り追加時)を実装
- lib/features/wallpaper/presentation/wallpaper_list_notifier.dart に出力
生成されるコード例:
// lib/features/wallpaper/presentation/wallpaper_list_notifier.dart
import 'package:riverpod_annotation/riverpod_annotation.dart';
import '../data/wallpaper_repository.dart';
import '../domain/wallpaper.dart';
import '../domain/wallpaper_cursor.dart';
part 'wallpaper_list_notifier.g.dart';
@riverpod
class WallpaperListNotifier extends _$WallpaperListNotifier {
@override
Future<List<Wallpaper>> build() async {
return _fetchPage(null);
}
Future<List<Wallpaper>> _fetchPage(String? cursor) async {
final repo = ref.read(wallpaperRepositoryProvider);
try {
final result = await repo.fetchWallpapers(cursor: cursor);
return result.items;
} on NetworkException catch (e) {
throw WallpaperNetworkError(message: e.message);
} on ServerException catch (e) {
throw WallpaperServerError(statusCode: e.statusCode);
}
}
/// お気に入り追加(楽観的更新)
Future<void> toggleFavorite(String wallpaperId) async {
// 現在の状態を保持(ロールバック用)
final previous = state;
// 楽観的に UI を更新
state = AsyncData(
state.value!.map((w) {
return w.id == wallpaperId
? w.copyWith(isFavorite: !w.isFavorite)
: w;
}).toList(),
);
try {
await ref.read(wallpaperRepositoryProvider)
.toggleFavorite(wallpaperId);
} catch (e) {
// 失敗時はロールバック
state = previous;
rethrow;
}
}
}
上記を生成した後、flutter pub run build_runner build を実行するよう Claude Code に指示すれば、.g.dart ファイルも自動生成されます。
go_router ルーティング設定の一括生成
以下の画面構成に対応する go_router 設定を生成してください。
- /: ホーム(認証不要)
- /wallpapers: 壁紙一覧(認証不要)
- /wallpapers/:id: 壁紙詳細(認証不要)
- /favorites: お気に入り(要認証 → 未認証なら /login にリダイレクト)
- /login: ログイン
- /settings: 設定(要認証)
認証状態は authNotifierProvider で管理。
ShellRoute でボトムナビゲーションを実装。
3. UI コンポーネントの効率的な生成
デザインシステムに基づいたウィジェット生成
Material Design 3 や独自デザインシステムに準拠したウィジェットを一貫して生成するには、デザイントークンを先に定義しておくことがポイントです。
// lib/core/theme/app_theme.dart
// このファイルを先に Claude Code に読み込ませてからウィジェットを生成する
class AppColors {
static const primary = Color(0xFF6750A4);
static const onPrimary = Color(0xFFFFFFFF);
static const surface = Color(0xFFFEF7FF);
// ...
}
class AppTextStyles {
static const headlineLarge = TextStyle(
fontSize: 32, fontWeight: FontWeight.w400,
);
// ...
}
このファイルを読み込ませた状態で「壁紙カードウィジェットを作成して」と依頼すると、プロジェクトのデザイントークンを正確に使ったコードが生成されます。
レスポンシブ対応の自動実装
WallpaperGridView を作成してください。
- スマートフォン(< 600px): 2カラム
- タブレット(600px〜900px): 3カラム
- デスクトップ(> 900px): 4カラム
- 各カードはアスペクト比 9:16 を維持
- Hero アニメーションで詳細画面に遷移
- 下部スクロールで次ページを自動ロード
4. テストの自動生成で品質を担保する
WidgetTest の自動生成
手動でテストを書くのは時間がかかります。Claude Code にウィジェットを渡してテストを生成させましょう。
以下の WallpaperCard ウィジェットの WidgetTest を生成してください。
テストすべきケース:
1. 通常状態のレンダリング(タイトル・サムネイルの表示確認)
2. お気に入りボタンのタップで toggleFavorite が呼ばれること
3. ネットワーク画像の読み込みエラー時にプレースホルダーが表示されること
4. ダークモードでの色確認
mocktail でリポジトリをモック。
生成されるテストの骨格:
// test/features/wallpaper/presentation/wallpaper_card_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
class MockWallpaperRepository extends Mock
implements WallpaperRepository {}
void main() {
late MockWallpaperRepository mockRepo;
setUp(() {
mockRepo = MockWallpaperRepository();
});
group('WallpaperCard', () {
testWidgets('タイトルとサムネイルが正しく表示される', (tester) async {
const testWallpaper = Wallpaper(
id: 'test-1',
title: 'テスト壁紙',
imageUrl: 'https://example.com/test.jpg',
isFavorite: false,
);
await tester.pumpWidget(
ProviderScope(
overrides: [
wallpaperRepositoryProvider.overrideWithValue(mockRepo),
],
child: const MaterialApp(
home: Scaffold(body: WallpaperCard(wallpaper: testWallpaper)),
),
),
);
expect(find.text('テスト壁紙'), findsOneWidget);
expect(find.byType(CachedNetworkImage), findsOneWidget);
});
testWidgets('お気に入りボタンのタップで toggleFavorite が呼ばれる',
(tester) async {
// ... テスト実装
});
});
}
Integration Test の自動生成
壁紙アプリの主要フロー(壁紙一覧→詳細→お気に入り登録)の
integration_test を生成してください。
テスト環境は実機(iOS Simulator)を想定。
5. プラットフォーム固有設定の自動化
iOS / Android のパーミッション設定
Flutter 開発で最も煩わしい作業のひとつが、ネイティブ側の設定ファイル編集です。
壁紙アプリに以下の権限を追加してください。
iOS (Info.plist):
- 写真ライブラリへの保存(NSPhotoLibraryAddUsageDescription)
- 通知(プッシュ通知の設定も含む)
Android (AndroidManifest.xml):
- WRITE_EXTERNAL_STORAGE(API 28以下)
- READ_MEDIA_IMAGES(API 33以上)
- INTERNET
- RECEIVE_BOOT_COMPLETED(バックグラウンド処理用)
それぞれの設定ファイルを更新し、permission_handler パッケージを使った
ランタイムパーミッション取得コードも生成してください。
App Store / Google Play 向けビルド設定
# Claude Code に以下を実行させる
# iOS リリースビルド
flutter build ipa --release \
--export-options-plist=ios/ExportOptions.plist
# Android App Bundle
flutter build appbundle --release \
--target-platform android-arm,android-arm64,android-x64
6. 多言語対応(ARB)の自動生成
ARB ファイルの自動化
日英対応は個人開発で収益を最大化するための重要な施策です。
lib/l10n/app_ja.arb の全キーに対応する app_en.arb を生成してください。
翻訳は英語圏のユーザーに自然な表現にしてください。
技術用語(例: 壁紙 → Wallpaper)は文脈に合わせて使い分けること。
生成例:
// lib/l10n/app_ja.arb
{
"@@locale": "ja",
"appTitle": "壁紙コレクション",
"@appTitle": { "description": "アプリのタイトル" },
"favoriteAdded": "{title}をお気に入りに追加しました",
"@favoriteAdded": {
"description": "お気に入り追加メッセージ",
"placeholders": {
"title": { "type": "String" }
}
}
}
// lib/l10n/app_en.arb(Claude Code が生成)
{
"@@locale": "en",
"appTitle": "Wallpaper Collection",
"favoriteAdded": "Added {title} to favorites",
"@favoriteAdded": {
"description": "Favorite added message",
"placeholders": {
"title": { "type": "String" }
}
}
}
7. パフォーマンス最適化とデバッグ
Flutter DevTools との連携
Claude Code にパフォーマンスプロファイルを読み込ませてボトルネックを特定できます。
以下の Flutter DevTools のタイムラインダンプを分析してください。
rebuild が頻発している原因を特定し、修正案を提示してください。
[タイムラインJSONを貼り付け]
よくある Flutter パフォーマンス問題と Claude Code の対処
Claude Code に以下のような指示を出すことで、典型的なパフォーマンス問題を自動修正できます。
以下のコードをパフォーマンス最適化してください。
- const コンストラクタの適用
- RepaintBoundary の追加
- ListView.builder への変換
- 不要な rebuild を引き起こす Provider のスコープ最適化
8. App Store 申請自動化
メタデータの自動生成
壁紙アプリ「WallpaperX」の App Store Connect メタデータを生成してください。
アプリ概要:
- カテゴリ別に整理された8000枚以上の高解像度壁紙
- 毎日新しい壁紙を追加
- お気に入り管理・カスタムコレクション作成
- iOS 16以上対応、iPad 対応
必要なもの:
- タイトル(30文字以内)
- サブタイトル(30文字以内)
- プロモーションテキスト(170文字以内)
- 説明文(4000文字以内)
- キーワード(100文字以内)
- 日英両方
SEO キーワードを意識したメタデータが自動生成されるため、ASO(App Store 最適化)の効果も期待できます。
まとめ
Claude Code × Flutter の組み合わせは、個人開発者にとって強力な生産性向上手段です。本記事で解説したポイントを整理します。
- CLAUDE.md で文脈を共有することで、プロジェクト固有のアーキテクチャを理解したコードが生成される
- Riverpod 状態管理・go_router ルーティングは定型コードが多く、Claude Code との相性が特に良い
- WidgetTest・integration_test の自動生成によりテスト工数を大幅削減できる
- ARB による多言語対応を自動化することで、英語圏市場への展開コストが下がる
- App Store メタデータの自動生成はASO最適化にも直結する
Claude Code と組み合わせることで、本書の実装例をより深く理解できます。
次のステップとして、Claude Code の並列開発ワークフローも合わせてご確認ください。