借助 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 项目一样,Firebase Data Connect客户端Firebase Data Connect代码的开发工作在本地项目目录中进行。Data Connect VS Code 扩展程序和 Firebase CLI 都是用于生成和管理客户端代码的重要本地工具。
SDK 生成选项与您初始化项目时生成的 dataconnect.yaml
文件中的多个条目相关联。
初始化 SDK 生成
在connector.yaml
中,添加 outputDir
、package
和(对于 Web SDK)packageJsonDir
。
connectorId: movies
generate:
dartSdk:
outputDir: ../../lib/generated # Feel free to change this to a different path
package: movies
outputDir
用于指定生成的 SDK 应输出到何处。此路径相对于包含 connector.yaml
文件的目录。您可以选择提供 outputDir
的绝对路径。
package
指定软件包名称。
在原型设计期间更新 SDK
如果您使用 Data Connect VS Code 扩展程序及其 Data Connect 模拟器进行交互式原型设计,那么在您修改定义架构、查询和变更的 .gql
文件时,系统会自动生成并更新 SDK 源文件。在热(重新)加载工作流中,这可能是一项实用功能。
.gql
更新,还可以自动更新 SDK 来源。
或者,您也可以使用 CLI 在每次更改 .gql 文件时重新生成 SDK:
firebase dataconnect:sdk:generate --watch
生成用于集成和正式版发布的 SDK
在某些情况下(例如准备要提交以进行 CI 测试的项目源),您可以调用 Firebase CLI 进行批量更新。
在这些情况下,请使用 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`
在客户端使用突变
突变的访问方式与查询相同。
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 |