Firebase Data Connect クライアント SDK を使用すると、Firebase アプリからサーバーサイドのクエリと ミューテーションを直接呼び出すことができます。Data Connect サービスにデプロイするスキーマ、クエリ、ミューテーションを設計するのと 並行して、カスタム クライアント SDK を生成します。 Data Connect次に、この SDK のメソッドをクライアント ロジックに統合します。
他の場所でも説明したように、Data Connect クエリとミューテーションはクライアントコードによって送信され、 サーバーで実行されるわけではないことに注意してください。代わりに、デプロイされると、Data Connect オペレーションは サーバーに Cloud Functions のように保存されます。つまり、既存のユーザー(古いアプリのバージョンなど)に影響を与えないようにするには、対応するクライアントサイドの変更をデプロイする必要があります。
そのため、Data Connect には、サーバーにデプロイされたスキーマ、クエリ、ミューテーションのプロトタイプを作成できるデベロッパー環境と ツールが用意されています。 また、プロトタイプ作成中にクライアントサイド SDK が自動的に生成されます。
サービスとクライアント アプリの更新を繰り返すと、サーバーサイドとクライアントサイドの両方の更新をデプロイできるようになります。
クライアント開発ワークフローとは
スタートガイドに沿って進めた場合は、スタートガイドの全体的な開発フローについて説明しました。Data Connectこのガイドでは、スキーマから Flutter SDK を生成し、クライアントのクエリとミューテーションを操作する方法について詳しく説明します。
まとめると、生成された Flutter SDK をクライアント アプリで使用するには、次の前提条件を満たす必要があります。
- Flutter アプリに Firebase を追加します。
- flutterfire CLI
dart pub global activate flutterfire_cliをインストールします。 flutterfire configureを実行します。
その後の操作は次のとおりです。
- アプリのスキーマを開発します。
SDK の生成を設定します。
- Data Connect VS Code 拡張機能の [Add SDK to app] ボタンを使用する
- を更新する
connector.yaml。
Data Connect エミュレータを設定して使用し、Data Connectエミュレータと 反復処理を行います。
Flutter SDK を生成する
Firebase CLI を使用して、アプリに Data Connect で生成された SDK を設定します。
init コマンドは、現在のフォルダ内のすべてのアプリを検出し、生成された SDK を自動的にインストールします。
firebase init dataconnect:sdk
プロトタイプ作成中に SDK を更新する
Data Connect VS Code 拡張機能がインストールされている場合、生成された SDK は常に最新の状態に保たれます。
Data Connect VS Code 拡張機能を使用しない場合は、Firebase CLI を使用して、生成された SDK を最新の状態に保つことができます。
firebase dataconnect:sdk:generate --watchビルド パイプラインで SDK を生成する
Firebase CLI を使用して、CI/CD ビルドプロセスで Data Connect SDK を生成できます。
firebase dataconnect:sdk:generateクライアント コードを設定する
Data Connect アプリを初期化する
まず、 標準の Firebase 設定手順に沿ってアプリを初期化します。
次に、Data Connect プラグインをインストールします。
flutter pub add firebase_data_connectData Connect Flutter SDK を初期化する
Data Connect の設定に使用した情報(Firebase コンソールの Data Connect タブで確認できます)を使用して、Data Connect インスタンスを初期化します。
ライブラリをインポートする
クライアント コードを初期化するには、一般的な Data Connect インポートと、生成された特定の SDK インポートの 2 つのインポートセットが必要です。
// general imports
import 'package:firebase_data_connect/firebase_data_connect.dart';
// generated queries and mutations from SDK
import 'generated/movies.dart';
クライアントサイドでクエリを使用する
生成されたコードには、事前定義されたクエリ参照がすでに含まれています。必要な操作は、インポートして execute を呼び出すだけです。
import 'generated/movies.dart';
await MoviesConnector.instance.listMovies().execute();
SDK クエリ メソッドを呼び出す
これらのアクション ショートカット関数を使用する例を次に示します。
import 'generated/movies.dart';
function onBtnClick() {
// This will call the generated Dart from the CLI and then make an HTTP request to the server.
MoviesConnector.instance.listMovies().execute().the>n(data = showInUI(data)); // == MoviesConnector.instance.listMovies().ref().execute();
}
任意のフィールド
一部のクエリには、任意のフィールドが含まれている場合があります。この場合、Flutter SDK はビルダー メソッドを公開し、個別に設定する必要があります。
たとえば、createMovie を呼び出す場合、フィールド rating は省略可能です。そのため、ビルダー関数で指定する必要があります。
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi"}).rating(5).execute();
変更をサブスクライブする
変更をサブスクライブできます(クエリを実行するたびに更新されます)。
QueryRef<ListMoviesData, void> listRef = MoviesConnector.instance.listMovies().ref();
// subscribe will immediately invoke the query if no execute was called on it previously.
listRef.subscribe().listen((data) {
updateUIWithMovies(data.movies);
});
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();
await listRef.execute(); // will update the subscription above`
列挙フィールドの変更を処理する
アプリのスキーマには、列挙型を含めることができます。 これは、GraphQL クエリでアクセスできます。
アプリのデザインが変更されると、サポートされる新しい列挙値を追加できます。たとえば、アプリケーションのライフサイクルの後半で、AspectRatio 列挙型に
FULLSCREEN 値を追加するとします。
Data Connect ワークフローでは、ローカル開発ツールを使用して クエリと SDK を更新できます。
ただし、クライアントの更新バージョンをリリースする前に、デプロイ済みの古いクライアントが破損する可能性があります。
復元力のある実装例
生成された SDK は、不明な値の処理を強制します。つまり、クライアント コードは EnumValue オブジェクトを Known または Unknown にアンラップする必要があります。
final result = await MoviesConnector.instance.listMovies().execute();
if (result.data != null && result.data!.isNotEmpty) {
handleEnumValue(result.data![0].aspectratio);
}
void handleEnumValue(EnumValue<AspectRatio> aspectValue) {
if (aspectValue.value != null) {
switch(aspectValue.value!) {
case AspectRatio.ACADEMY:
print("This movie is in Academy aspect");
break;
case AspectRatio.WIDESCREEN:
print("This movie is in Widescreen aspect");
break;
case AspectRatio.ANAMORPHIC:
print("This movie is in Anamorphic aspect");
break;
case AspectRatio.IMAX:
print("This movie is in IMAX aspect");
}
} else {
print("Unknown aspect ratio detected: ${aspectValue.stringValue}");
}
}
クライアントサイド キャッシュを有効にする
Data Connect には、オプションのクライアントサイド キャッシュ機能があります。この機能は、connector.yaml ファイルを編集することで有効にできます。この機能を有効にすると、生成されたクライアント SDK
はクエリのレスポンスをローカルにキャッシュします。これにより、アプリが送信するデータベース リクエストの数を減らし、ネットワークが利用できない場合でも、アプリのデータベース依存部分が動作するようになります。
クライアントサイド キャッシュを有効にするには、コネクタ構成にクライアント キャッシュ構成を追加します。
generate:
javascriptSdk:
outputDir: ../dart/
package: "dataconnect_generated"
clientCache:
maxAge: 5s
storage: memory
この構成には 2 つのパラメータがあり、どちらも省略可能です。
maxAge: クライアント SDK が新しい値を取得するまでに、キャッシュされたレスポンスが保持される最大期間。例: "0"、"30s"、"1h30m"。maxAgeのデフォルト値は0です。これは、レスポンスがキャッシュされるものの、クライアント SDK は常に新しい値を取得することを意味します。キャッシュされた値は、execute()にCACHE_ONLYが指定され、subscribe()から返された最初の結果にのみ使用されます。storage: クライアント SDK は、レスポンスをpersistentストレージまたはmemoryにキャッシュするように構成できます。persistentストレージにキャッシュされた結果は、アプリを再起動しても保持されます。Android または iOS をターゲットとする場合、デフォルトはpersistentです。ウェブブラウザをターゲットとする場合は、memoryストレージのみがサポートされます。
コネクタのキャッシュ構成を更新したら、クライアント SDK を再生成してアプリを再ビルドします。これにより、execute() と
subscribe() はレスポンスをキャッシュし、構成したポリシーに従ってキャッシュされた値を使用します。通常、この処理は自動的に行われるため、追加の操作は不要です。ただし、次の点に注意してください。
execute()のデフォルトの動作は上記のとおりです。クエリの結果がキャッシュされ、キャッシュされた値がmaxAgeより古くない場合は、キャッシュされた値を使用します。このデフォルトの動作はPREFER_CACHEポリシーと呼ばれます。execute()の個々の呼び出しで、キャッシュされた値のみを処理する(CACHE_ONLY)か、サーバーから新しい値を無条件に取得する(SERVER_ONLY)かを指定することもできます。await queryRef.execute(fetchPolicy: QueryFetchPolicy.cacheOnly);await queryRef.execute(fetchPolicy: QueryFetchPolicy.serverOnly);subscribe()を呼び出すと、maxAgeの設定に関係なく、キャッシュされたコンテンツが存在する場合は常にすぐに返されます。execute()の後続の呼び出しでは、構成されたmaxAgeに従ってリスナーに通知されます。
クライアントサイドでミューテーションを使用する
ミューテーションはクエリと同じ方法でアクセスできます。
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();
Flutter アプリのプロトタイプを作成してテストする
ローカル エミュレータを使用するようにクライアントをインストルメントする
Data Connect エミュレータは、 Data Connect VS Code 拡張機能または CLI から使用できます。
エミュレータに接続するようにアプリをインストルメントする方法は、どちらのシナリオでも同じです。
import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'generated/movies.dart';
MoviesConnector.instance.dataConnect
.useDataConnectEmulator('127.0.0.1', 9399);
// Make call<s from your app
Quer>yRefListMoviesData, void ref = MoviesConnector.instance.listMovies.ref();
本番環境リソースに切り替えるには、エミュレータに接続するための行をコメントアウトします。
Dart SDK のデータ型
Data Connect サーバーは、一般的な GraphQL データ型を表します。これらは SDK で次のように表されます。
| Data Connect 型 | Dart |
|---|---|
| タイムスタンプ | firebase_data_connect.Timestamp |
| Int(32 ビット) | int |
| 日付 | DateTime |
| UUID | string |
| Int64 | int |
| 浮動小数点数 | double |
| ブール値 | bool |
| すべて | firebase_data_connect.AnyValue |