Mit Firebase SQL Connect-Client-SDKs können Sie Ihre serverseitigen Abfragen und Mutationen direkt aus einer Firebase-App aufrufen. Sie generieren ein benutzerdefiniertes Client-SDK parallel zum Entwerfen der Schemas, Abfragen und Mutationen, die Sie in Ihrem SQL Connect-Dienst bereitstellen. Anschließend binden Sie Methoden aus diesem SDK in Ihre Clientlogik ein.
Wie bereits an anderer Stelle erwähnt, ist es wichtig zu beachten, dass SQL Connect-Abfragen und -Mutationen nicht vom Clientcode gesendet und auf dem Server ausgeführt werden. Stattdessen werden SQL Connect-Vorgänge bei der Bereitstellung wie Cloud Functions auf dem Server gespeichert. Das bedeutet, dass Sie entsprechende clientseitige Änderungen bereitstellen müssen, um Probleme bei bestehenden Nutzern (z. B. bei älteren App-Versionen) zu vermeiden.
Deshalb bietet SQL Connect Ihnen eine Entwicklungsumgebung und Tools, mit denen Sie Prototypen Ihrer auf dem Server bereitgestellten Schemas, Abfragen und Mutationen erstellen können. Außerdem werden während des Prototypings automatisch clientseitige SDKs generiert.
Wenn Sie die Updates für Ihre Dienst- und Client-Apps iteriert haben, können sowohl die serverseitigen als auch die clientseitigen Updates bereitgestellt werden.
Wie sieht der Workflow für die Cliententwicklung aus?
Wenn Sie die Erste Schritte-Anleitung befolgt haben, haben Sie den allgemeinen Entwicklungsablauf für SQL Connect kennengelernt. In diesem Leitfaden finden Sie detailliertere Informationen zum Generieren von Flutter SDKs aus Ihrem Schema und zum Arbeiten mit Clientabfragen und ‑mutationen.
Zusammenfassend müssen Sie die folgenden Schritte ausführen, um generierte Flutter SDKs in Ihren Client-Apps zu verwenden:
- Fügen Sie Firebase zu Ihrer Flutter-App hinzu.
- Installieren Sie die FlutterFire-Befehlszeile
dart pub global activate flutterfire_cli. - Führen Sie
flutterfire configureaus.
Gehen Sie anschließend so vor:
- Entwickeln Sie Ihr App-Schema.
SDK-Generierung einrichten:
- Mit dem Button SDK zu App hinzufügen in unserer SQL Connect VS Code-Erweiterung
- Durch Aktualisieren deines
connector.yaml.
Aufrufe für Abfragen und Mutationen implementieren
SQL Connect-Emulator einrichten und verwenden und iterieren.
Flutter SDK generieren
Verwenden Sie die Firebase-Befehlszeile, um von SQL Connect generierte SDKs in Ihren Anwendungen einzurichten.
Der Befehl init sollte alle Apps im aktuellen Ordner erkennen und generierte SDKs automatisch installieren.
firebase init dataconnect:sdk
SDKs beim Erstellen von Prototypen aktualisieren
Wenn Sie die VS Code-Erweiterung für SQL Connect installiert haben, werden die generierten SDKs immer auf dem neuesten Stand gehalten.
Wenn Sie die VS Code-Erweiterung SQL Connect nicht verwenden, können Sie die Firebase CLI verwenden, um generierte SDKs auf dem neuesten Stand zu halten.
firebase dataconnect:sdk:generate --watchSDKs in Build-Pipelines generieren
Sie können die Firebase CLI verwenden, um SQL Connect-SDKs in CI/CD-Build-Prozessen zu generieren.
firebase dataconnect:sdk:generateClientcode einrichten
SQL Connect-App initialisieren
Initialisieren Sie zuerst Ihre App gemäß der Standardanleitung zur Einrichtung von Firebase.
Installieren Sie dann das SQL Connect-Plug-in:
flutter pub add firebase_data_connectSQL Connect Flutter SDK initialisieren
Initialisieren Sie Ihre SQL Connect-Instanz mit den Informationen, die Sie zum Einrichten von SQL Connect verwendet haben. Diese Informationen finden Sie in der Firebase Console auf der Seite Datenbanken und Speicher > SQL Connect.
Bibliotheken importieren
Zum Initialisieren des Clientcodes sind zwei Arten von Importen erforderlich: allgemeine SQL Connect-Importe und spezifische, generierte SDK-Importe.
// general imports
import 'package:firebase_data_connect/firebase_data_connect.dart';
// generated queries and mutations from SDK
import 'generated/movies.dart';
Abfragen auf der Clientseite verwenden
Der generierte Code enthält bereits vordefinierte Abfrageverweise. Sie müssen sie nur importieren und execute für sie aufrufen.
import 'generated/movies.dart';
await MoviesConnector.instance.listMovies().execute();
SDK-Abfragemethoden aufrufen
Hier ein Beispiel für die Verwendung dieser Funktionen für Aktionskürzel:
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().then(data => showInUI(data)); // == MoviesConnector.instance.listMovies().ref().execute();
}
Optionale Felder
Einige Abfragen können optionale Felder enthalten. In diesen Fällen stellt das Flutter SDK eine Builder-Methode bereit, die separat festgelegt werden muss.
Das Feld rating ist beispielsweise beim Aufrufen von createMovie optional. Sie müssen es also in der Builder-Funktion angeben.
await MoviesConnector.instance.createMovie( title: 'Empire Strikes Back', releaseYear: 1980, genre: 'Sci-Fi').rating(5).execute();
Änderungen abonnieren
Weitere Informationen finden Sie unter Echtzeit-Updates von SQL Connect erhalten.
Umgang mit Änderungen an Aufzählungsfeldern
Das Schema einer App kann Aufzählungen enthalten, auf die über Ihre GraphQL-Abfragen zugegriffen werden kann.
Wenn sich das Design einer App ändert, können Sie neue unterstützte Enum-Werte hinzufügen. Angenommen, Sie möchten später im Lebenszyklus Ihrer Anwendung den Wert FULLSCREEN zum Enum AspectRatio hinzufügen.
Im SQL Connect-Workflow können Sie lokale Entwicklungstools verwenden, um Ihre Abfragen und SDKs zu aktualisieren.
Bevor Sie jedoch eine aktualisierte Version Ihrer Clients veröffentlichen, können ältere bereitgestellte Clients fehlerhaft sein.
Beispiel für eine ausfallsichere Implementierung
Das generierte SDK erzwingt die Verarbeitung unbekannter Werte. Das heißt, der Clientcode muss das EnumValue-Objekt entweder in Known oder Unknown entpacken.
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}');
}
}
Clientseitiges Caching aktivieren
SQL Connect bietet eine optionale clientseitige Caching-Funktion, die Sie durch Bearbeiten der Datei connector.yaml aktivieren können. Wenn diese Funktion aktiviert ist, werden die generierten Client-SDKs die Abfrageantworten lokal im Cache speichern. Dadurch kann die Anzahl der Datenbankanfragen Ihrer App reduziert werden und die datenbankabhängigen Teile Ihrer App können auch dann funktionieren, wenn die Netzwerkverfügbarkeit unterbrochen ist.
Wenn Sie das clientseitige Caching aktivieren möchten, fügen Sie Ihrer Connector-Konfiguration eine Client-Caching-Konfiguration hinzu:
generate:
javascriptSdk:
outputDir: ../dart/
package: "dataconnect_generated"
clientCache:
maxAge: 5s
storage: memory
Diese Konfiguration hat zwei Parameter, die beide optional sind:
maxAge: Das maximale Alter einer im Cache gespeicherten Antwort, bevor das Client-SDK neue Werte abruft. Beispiele: „0“, „30s“, „1h30m“.Der Standardwert für
maxAgeist0. Das bedeutet, dass Antworten im Cache gespeichert werden, das Client-SDK aber immer aktuelle Werte abruft. Die im Cache gespeicherten Werte werden nur verwendet, wennCACHE_ONLYaufexecute()festgelegt ist und das erste Ergebnis vonsubscribe()zurückgegeben wird.storage: Das Client-SDK kann so konfiguriert werden, dass Antworten entweder impersistent-Speicher oder inmemoryim Cache gespeichert werden. Impersistent-Speicher im Cache gespeicherte Ergebnisse bleiben auch nach einem Neustart der App erhalten. Bei der Ausrichtung auf Android oder iOS ist der Standardwertpersistent. Wenn Sie Webbrowser als Ziel festlegen, wird nur dermemory-Speicher unterstützt.
Nachdem Sie die Caching-Konfiguration Ihres Connectors aktualisiert haben, generieren Sie Ihre Client-SDKs neu und erstellen Sie Ihre Anwendung neu. Danach werden execute() und subscribe() Antworten im Cache speichern und die im Cache gespeicherten Werte gemäß der von Ihnen konfigurierten Richtlinie verwenden. Dies geschieht in der Regel automatisch, ohne dass Sie zusätzliche Schritte ausführen müssen. Beachten Sie jedoch Folgendes:
Das Standardverhalten von
execute()ist wie oben beschrieben: Wenn ein Ergebnis für eine Abfrage im Cache gespeichert ist und der im Cache gespeicherte Wert nicht älter alsmaxAgeist, wird der im Cache gespeicherte Wert verwendet. Dieses Standardverhalten wird alsPREFER_CACHE-Richtlinie bezeichnet.Sie können auch für einzelne Aufrufe von
execute()angeben, dass entweder nur im Cache gespeicherte Werte (CACHE_ONLY) bereitgestellt oder bedingungslos neue Werte vom Server (SERVER_ONLY) abgerufen werden sollen.await queryRef.execute(fetchPolicy: QueryFetchPolicy.cacheOnly);await queryRef.execute(fetchPolicy: QueryFetchPolicy.serverOnly);Wenn Sie
subscribe()aufrufen, werden die im Cache gespeicherten Inhalte immer sofort zurückgegeben, sofern sie vorhanden sind, unabhängig von der EinstellungmaxAge. Bei nachfolgenden Aufrufen vonexecute()werden Listener gemäß der konfiguriertenmaxAgebenachrichtigt.
Mutationen auf der Clientseite verwenden
Auf Mutationen kann auf dieselbe Weise wie auf Abfragen zugegriffen werden.
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();
Prototypen für Flutter-Apps erstellen und testen
Clients für die Verwendung eines lokalen Emulators instrumentieren
Sie können den SQL Connect-Emulator entweder über die VS Code-Erweiterung von SQL Connect oder über die Befehlszeile verwenden.
Die Instrumentierung der App für die Verbindung mit dem Emulator ist für beide Szenarien gleich.
import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'generated/movies.dart';
MoviesConnector.instance.dataConnect
.useDataConnectEmulator('127.0.0.1', 9399);
// Make calls from your app
QueryRef<ListMoviesData, void> ref = MoviesConnector.instance.listMovies.ref();
Wenn Sie zu Produktionsressourcen wechseln möchten, kommentieren Sie die Zeilen für die Verbindung zum Emulator aus.
Datentypen im Dart SDK
Der SQL Connect-Server stellt gängige GraphQL-Datentypen dar. Diese werden im SDK so dargestellt:
| SQL Connect-Typ | Dart |
|---|---|
| Zeitstempel | firebase_data_connect.Timestamp |
| Int (32-Bit) | int |
| Datum | DateTime |
| UUID | String |
| Int64 | int |
| Float | double |
| Boolesch | bool |
| Beliebig | firebase_data_connect.AnyValue |