firebase-data-connect について
Flutter アプリで Firebase Data Connect を使うためのガイドです。設定、データ設計、型付き SDK の呼び出し、エラーやセキュリティへの対応を扱います。
主な機能
- 01Flutter での Data Connect 設定
- 02スキーマ、クエリ、ミューテーションの設計
- 03型付き Dart SDK の生成
- 04クエリ更新のリアルタイム購読
- 05エラー、キャッシュ、セキュリティへの対応
活用シーン
- 01Flutter プロジェクトへの Data Connect 導入
- 02アプリデータのクエリとミューテーションの設計
- 03オフライン利用やネットワーク障害への対応
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ evanca/ flutter-ai-rules --skill firebase-data-connectインストール後、Claude Code で/firebase-data-connectを入力して読み込まれたか確認します。
詳細
Firebase Data Connect スキル
このスキルでは、Flutter アプリケーションで Firebase Data Connect を正しく使用する方法を説明します。
使用する場面
次のような場合にこのスキルを使用します。
- Flutter プロジェクトで Firebase Data Connect を設定、構成する。
- Data Connect のスキーマ、クエリ、ミューテーションを設計する。
- 型付きクエリやミューテーション用の生成 SDK 呼び出しを実装する。
- ネットワーク障害、データの不整合、オフラインの状況に対処する。
- セキュリティとパフォーマンスに関するベストプラクティスを適用する。
1. セットアップと構成
ステップ 1:パッケージをインストールする
flutter pub add firebase_data_connect
ステップ 2:インポートして初期化する
import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
ステップ 3:dataconnect/schema/schema.gql でスキーマを定義する
type Movie @table {
id: UUID! @default(expr: "uuidV4()")
title: String!
releaseYear: Int
genre: String
rating: Float
description: String
}
ステップ 4:dataconnect/connector/queries.gql でクエリとミューテーションを定義する
query ListMovies @auth(level: PUBLIC) {
movies {
id
title
releaseYear
genre
rating
}
}
mutation CreateMovie($title: String!, $releaseYear: Int, $genre: String) @auth(level: USER) {
movie_insert(data: {
title: $title
releaseYear: $releaseYear
genre: $genre
})
}
mutation DeleteMovie($id: UUID!) @auth(level: USER) {
movie_delete(id: $id)
}
ステップ 5:型付き Flutter SDK を生成する
flutterfire generate
各クエリとミューテーションに対応する、型付きの Dart クラスが生成されます。
プラットフォームのサポート状況:
| プラットフォーム | サポート状況 |
|---|---|
| iOS | 完全対応 |
| Android | 完全対応 |
| Web | 完全対応 |
| その他のプラットフォーム | 非対応 |
2. クエリとミューテーションの実行
生成された SDK を使用して、型付きクエリとミューテーションを実行します。
// Execute a query
final result = await ListMoviesQuery().execute();
final movies = result.data.movies;
// Execute a mutation
await CreateMovieMutation(title: 'Inception', releaseYear: 2010, genre: 'Sci-Fi')
.execute();
// Delete by ID
await DeleteMovieMutation(id: movieId).execute();
リアルタイムリスナー
クエリの変更を購読して、ライブ更新を受け取ります。
final subscription = ListMoviesQuery().subscribe();
subscription.listen((result) {
final movies = result.data.movies;
// Update UI with latest movie list
});
3. パフォーマンスとキャッシュ
- データ転送量を最小限に抑えるため、必要なフィールドだけを取得する効率的なクエリを設計します。
- 大規模なデータセットにはページネーションを実装します。
query ListMoviesPaginated($limit: Int!, $offset: Int!) @auth(level: PUBLIC) { movies(limit: $limit, offset: $offset) { id title releaseYear } } - 不要なネットワーク使用を避けるため、リアルタイムリスナーは適切に使用します。
- アプリの重要な機能については、クエリ結果をローカルにキャッシュして、オフライン機能を検討します。
4. エラー処理
Data Connect の呼び出しを try/catch で囲み、ネットワークエラーや検証エラーに対処します。
try {
final result = await ListMoviesQuery().execute();
return result.data.movies;
} on FirebaseException catch (e) {
if (e.code == 'unavailable') {
// Handle offline — return cached data
return _localCache.getMovies();
}
rethrow;
}
- 一時的な接続エラーには、指数バックオフを用いた再試行ロジックを実装します。
- データ検証エラーには、わかりやすいエラーメッセージを表示します。
- エラー発生率を監視し、繰り返し発生する問題を調査します。
5. セキュリティ
- スキーマで
@authディレクティブを使用して、アクセスレベル(PUBLIC、USER、NO_ACCESS)を制御します。 - ユーザー単位のアクセス制御にはFirebase Authenticationを統合します。
- クライアント側とサーバー側の両方でデータを検証します。
- ユーザー情報を扱う際は、データプライバシーに関するベストプラクティスに従います。
参考資料
コメント
Markdown 対応