Firebase Data Connect pakiety SDK klienta umożliwiają wywoływanie zapytań i mutacji po stronie serwera bezpośrednio z aplikacji Firebase. Niestandardowy pakiet SDK klienta generujesz równolegle z projektowaniem schematów, zapytań i mutacji, które wdrażasz w usłudze Data Connect. Następnie zintegruj metody z tego pakietu SDK z logiką klienta.
Jak już wspominaliśmy, warto pamiętać, że Data Connect zapytania i mutacje nie są przesyłane przez kod klienta i wykonywane na serwerze. Zamiast tego po wdrożeniu operacje Data Connect są przechowywane na serwerze, tak jak Cloud Functions. Oznacza to, że musisz wdrożyć odpowiednie zmiany po stronie klienta, aby uniknąć problemów u dotychczasowych użytkowników (np. w starszych wersjach aplikacji).
Dlatego Data Connect udostępnia środowisko programistyczne i narzędzia, które umożliwiają tworzenie prototypów schematów, zapytań i mutacji wdrażanych na serwerze. Podczas tworzenia prototypu automatycznie generuje też pakiety SDK po stronie klienta.
Gdy wprowadzisz aktualizacje usługi i aplikacji klienckich, zarówno aktualizacje po stronie serwera, jak i po stronie klienta będą gotowe do wdrożenia.
Jak wygląda proces tworzenia aplikacji klienckiej?
Jeśli postępujesz zgodnie z instrukcjami w sekcji Pierwsze kroki, poznasz ogólny proces tworzenia aplikacji Data Connect. W tym przewodniku znajdziesz bardziej szczegółowe informacje o generowaniu pakietów Flutter SDK na podstawie schematu oraz o pracy z zapytaniami i mutacjami klienta.
Podsumowując, aby używać wygenerowanych pakietów Flutter SDK w aplikacjach klienckich, musisz wykonać te czynności wstępne:
- Dodaj Firebase do aplikacji Flutter.
- Zainstaluj interfejs wiersza poleceń flutterfire
dart pub global activate flutterfire_cli
. - Uruchom
flutterfire configure
.
Następnie:
- Opracuj schemat aplikacji.
Skonfiguruj generowanie pakietu SDK:
- Za pomocą przycisku Add SDK to app (Dodaj pakiet SDK do aplikacji) w naszym rozszerzeniu Data Connect VS Code.
- zaktualizować
connector.yaml
,
Skonfiguruj i używaj Data Connect emulatora i wprowadzaj zmiany.
Generowanie pakietu Flutter SDK
Podobnie jak w przypadku większości projektów Firebase, praca nad Firebase Data Connectkodem klienta odbywa się w lokalnym katalogu projektu. Zarówno rozszerzenie Data Connect VS Code, jak i Firebase CLI to ważne lokalne narzędzia do generowania kodu klienta i zarządzania nim.
Opcje generowania pakietu SDK są powiązane z kilkoma wpisami w dataconnect.yaml
pliku wygenerowanym podczas inicjowania projektu.
Inicjowanie generowania pakietu SDK
Wconnector.yaml
dodaj outputDir
, package
i (w przypadku pakietu SDK na potrzeby internetu) packageJsonDir
.
connectorId: movies
generate:
dartSdk:
outputDir: ../../lib/generated # Feel free to change this to a different path
package: movies
outputDir
określa miejsce, w którym ma zostać wygenerowany pakiet SDK. Ścieżka jest względna względem katalogu, w którym znajduje się sam plik connector.yaml
.
Opcjonalnie możesz podać ścieżkę bezwzględną do pliku outputDir
.
package
określa nazwę pakietu.
Aktualizowanie pakietów SDK podczas tworzenia prototypu
Jeśli tworzysz interaktywny prototyp za pomocą rozszerzenia Data Connect VS Code
i jego Data Connect emulatora, pliki źródłowe pakietu SDK są automatycznie
generowane i aktualizowane podczas modyfikowania plików .gql
definiujących schematy, zapytania
i mutacje. Może to być przydatna funkcja w przypadku procesów roboczych z szybkim ponownym wczytywaniem.
.gql
aktualizacji, a także automatycznie aktualizować źródła pakietu SDK.
Możesz też użyć interfejsu wiersza poleceń, aby ponownie wygenerować pakiety SDK za każdym razem, gdy zmienią się pliki .gql:
firebase dataconnect:sdk:generate --watch
Generowanie pakietów SDK na potrzeby integracji i wersji produkcyjnych
W niektórych przypadkach, np. podczas przygotowywania źródeł projektu do przesłania na potrzeby testów CI, możesz wywołać interfejs wiersza poleceń Firebase w celu przeprowadzenia aktualizacji zbiorczej.
W takich przypadkach używaj firebase dataconnect:sdk:generate
.
Konfigurowanie kodu klienta
Zainicjuj aplikację Data Connect
Najpierw zainicjuj aplikację, korzystając ze standardowych instrukcji konfiguracji Firebase.
Następnie zainstaluj wtyczkę Data Connect:
flutter pub add firebase_data_connect
Zainicjuj Data Connect pakiet Flutter SDK.
Zainicjuj instancję Data Connect, używając informacji, które zostały użyte do skonfigurowania funkcji Data Connect (wszystkie są dostępne w konsoli Firebase na karcie Data Connect).
Importowanie bibliotek
Do zainicjowania kodu klienta potrzebne są 2 zestawy importów: ogólne importyData Connect i konkretne, wygenerowane importy SDK.
// general imports
import 'package:firebase_data_connect/firebase_data_connect.dart';
// generated queries and mutations from SDK
import 'generated/movies.dart';
Używanie zapytań po stronie klienta
Wygenerowany kod będzie już zawierać wstępnie zdefiniowane odwołania do zapytań. Wystarczy zaimportować i wywołać na nich funkcję execute
.
import 'generated/movies.dart';
await MoviesConnector.instance.listMovies().execute();
Wywoływanie metod zapytań pakietu SDK
Oto przykład użycia tych funkcji skrótów do działań:
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();
}
Pola opcjonalne
Niektóre zapytania mogą mieć pola opcjonalne. W takich przypadkach pakiet Flutter SDK udostępnia metodę budującą, którą należy ustawić osobno.
Na przykład pole rating
jest opcjonalne podczas wywoływania funkcji createMovie
, więc musisz je podać w funkcji konstruktora.
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi"}).rating(5).execute();
Subskrybowanie zmian
Możesz subskrybować zmiany (które będą aktualizowane za każdym razem, gdy wykonasz zapytanie).
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`
Obsługa zmian w polach wyliczeniowych
Schemat aplikacji może zawierać wyliczenia, do których można uzyskać dostęp za pomocą zapytań GraphQL.
W miarę zmian w projekcie aplikacji możesz dodawać nowe obsługiwane wartości wyliczeniowe. Załóżmy, że w późniejszym okresie istnienia aplikacji zdecydujesz się dodać wartość FULLSCREEN do wyliczenia AspectRatio
.
W przypadku przepływu pracy Data Connect możesz używać lokalnych narzędzi programistycznych do aktualizowania zapytań i pakietów SDK.
Zanim jednak udostępnisz zaktualizowaną wersję klientów, starsi wdrożeni klienci mogą przestać działać.
Przykład odpornej implementacji
Wygenerowany pakiet SDK wymusza obsługę nieznanych wartości. Oznacza to, że kod klienta musi rozpakować obiekt EnumValue
do obiektu Known
lub 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}");
}
}
Używanie mutacji po stronie klienta
Mutacje są dostępne w taki sam sposób jak zapytania.
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();
Tworzenie prototypów i testowanie aplikacji Flutter
Konfigurowanie klientów do korzystania z lokalnego emulatora
Możesz użyć Data Connect emulatora, korzystając z rozszerzenia Data Connect VS Code lub interfejsu CLI.
Instrumentowanie aplikacji w celu połączenia z emulatorem jest takie samo w obu scenariuszach.
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();
Aby przełączyć się na zasoby produkcyjne, zakomentuj wiersze służące do łączenia się z emulatorem.
Typy danych w pakiecie Dart SDK
Data Connect serwer reprezentuje typowe typy danych GraphQL. W pakiecie SDK są one reprezentowane w ten sposób:
Typ połączenia danych | Dart |
---|---|
Sygnatura czasowa | firebase_data_connect.Timestamp |
Liczba całkowita (32-bitowa) | int |
Data | DateTime |
UUID | ciąg znaków |
Int64 | int |
Liczba zmiennoprzecinkowa | podwójny |
Wartość logiczna | bool |
Dowolna | firebase_data_connect.AnyValue |