Клиентские SDK Firebase Data Connect позволяют вызывать серверные запросы и мутации непосредственно из приложения Firebase. Вы генерируете пользовательский клиентский SDK параллельно с проектированием схем, запросов и мутаций, которые развертываете в сервисе Data Connect . Затем вы интегрируете методы из этого SDK в свою клиентскую логику.
Как мы уже упоминали ранее, важно отметить, что запросы и мутации Data Connect не отправляются клиентским кодом и не выполняются на сервере. Вместо этого, при развертывании операции Data Connect хранятся на сервере, как и в Cloud Functions. Это означает, что вам необходимо развернуть соответствующие изменения на стороне клиента, чтобы избежать проблем с существующими пользователями (например, в старых версиях приложения).
Именно поэтому Data Connect предоставляет вам среду разработки и инструменты, позволяющие создавать прототипы развернутых на сервере схем, запросов и мутаций. Кроме того, он автоматически генерирует SDK для клиентской части во время создания прототипов.
После внесения изменений в ваши сервисные и клиентские приложения, обновления как на стороне сервера, так и на стороне клиента готовы к развертыванию.
Каков рабочий процесс разработки клиентской части?
Если вы следовали инструкциям в разделе «Начало работы» , вы познакомились с общим процессом разработки Data Connect . В этом руководстве вы найдете более подробную информацию о генерации Flutter SDK из вашей схемы и работе с клиентскими запросами и мутациями.
Вкратце, для использования сгенерированных Flutter SDK в клиентских приложениях вам необходимо выполнить следующие предварительные шаги:
- Добавьте Firebase в ваше Flutter- приложение.
- Установите flutterfire CLI:
dart pub global activate flutterfire_cli. - Запустите команду
flutterfire configure.
Затем:
- Разработайте схему вашего приложения.
Настройка генерации SDK:
- С помощью кнопки «Добавить SDK в приложение» в нашем расширении Data Connect для VS Code.
- Обновите файл
connector.yaml.
Настройте и используйте эмулятор 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 можно генерировать SDK для Data Connect в процессах сборки CI/CD.
firebase dataconnect:sdk:generateНастройка клиентского кода
Инициализируйте приложение Data Connect .
Сначала инициализируйте приложение, используя стандартные инструкции по настройке Firebase .
Затем установите плагин Data Connect :
flutter pub add firebase_data_connectИнициализируйте SDK Data Connect Flutter.
Инициализируйте свой экземпляр Data Connect , используя информацию, которую вы использовали для настройки Data Connect (вся информация доступна на вкладке Data Connect в консоли Firebase ).
Импорт библиотек
Для инициализации клиентского кода необходимы два набора импортов: общие импорты Data Connect и специфические импорты сгенерированного SDK.
// general imports
import 'package:firebase_data_connect/firebase_data_connect.dart';
// generated queries and mutations from SDK
import 'generated/movies.dart';
Используйте запросы на стороне клиента.
Сгенерированный код уже будет содержать предопределенные ссылки на запросы (Query Refs). Все, что вам нужно сделать, это импортировать их и вызвать 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().then(data => showInUI(data)); // == MoviesConnector.instance.listMovies().ref().execute();
}
Необязательные поля
В некоторых запросах могут быть необязательные поля. В таких случаях Flutter SDK предоставляет метод-конструктор, и их необходимо будет задать отдельно.
Например, поле rating является необязательным при вызове createMovie , поэтому его необходимо указать в функции builder.
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 .
По мере изменения дизайна приложения вы можете добавлять новые значения, поддерживаемые перечислениями. Например, представьте, что на более позднем этапе жизненного цикла вашего приложения вы решили добавить значение FULLSCREEN в перечисление AspectRatio .
В рабочем процессе 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}");
}
}
Используйте мутации на стороне клиента.
Изменённые значения доступны так же, как и запросы.
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();
Создавайте прототипы и тестируйте свои приложения на Flutter.
Для обеспечения возможности использования локального эмулятора клиенты должны быть оснащены соответствующими инструментами.
Вы можете использовать эмулятор Data Connect как через расширение Data Connect для VS Code, так и через интерфейс командной строки.
Процесс подключения приложения к эмулятору одинаков в обоих случаях.
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();
Чтобы переключиться на производственные ресурсы, закомментируйте строки, отвечающие за подключение к эмулятору.
Типы данных в Dart SDK
Сервер Data Connect представляет распространенные типы данных GraphQL. В SDK они представлены следующим образом.
| Тип подключения данных | Дарт |
|---|---|
| Отметка времени | firebase_data_connect.Timestamp |
| Целое число (32-бит) | инт |
| Дата | Дата и время |
| UUID | нить |
| Int64 | инт |
| Плавать | двойной |
| Логический | буль |
| Любой | firebase_data_connect.AnyValue |