借助 Firebase Data Connect 客户端 SDK,您可以直接从 Firebase 应用调用服务器端查询和突变。在设计部署到 Data Connect 服务的架构、查询和突变时,您可以并行生成自定义客户端 SDK。然后,将此 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 生成:
- 使用 Data Connect VS Code 扩展程序中的向应用添加 SDK 按钮
- 通过更新
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
您可以在 CI/CD 构建流程中使用 Firebase CLI 生成 Data Connect SDK。
firebase dataconnect:sdk:generate
设置客户端代码
初始化 Data Connect 应用
首先,按照标准 Firebase 设置说明初始化您的应用。
然后,安装 Data Connect 插件:
flutter pub add firebase_data_connect
初始化 Data Connect Flutter SDK
使用您在设置 Data Connect 时所用的信息(全部可在 Firebase 控制台的“Data Connect”标签页中找到)初始化 Data Connect 实例。
导入库
初始化客户端代码需要两组导入,一组是常规 Data Connect 导入,另一组是特定的已生成的 SDK 导入。
// 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().then(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}");
}
}
在客户端使用突变
突变的访问方式与查询相同。
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 calls from your app
QueryRef<ListMoviesData, void> ref = MoviesConnector.instance.listMovies.ref();
如需切换到生产资源,请注释掉用于连接到模拟器的行。
Dart SDK 中的数据类型
Data Connect 服务器表示常见的 GraphQL 数据类型。在 SDK 中,这些参数表示如下。
数据连接类型 | Dart |
---|---|
时间戳 | firebase_data_connect.Timestamp |
Int(32 位) | 整数 |
日期 | DateTime |
UUID | 字符串 |
Int64 | 整数 |
浮点数 | double |
布尔值 | 布尔值 |
不限 | firebase_data_connect.AnyValue |