使用生成的 Flutter SDK

借助 Firebase Data Connect 客户端 SDK,您可以直接从 Firebase 应用调用服务器端查询和更改。在设计要部署到 Data Connect 服务的架构、查询和更改时,您可以并行生成自定义客户端 SDK。然后,将此 SDK 中的方法集成到您的客户端逻辑中。

正如我们在其他地方提到的那样,请务必注意,Data Connect 查询和更改不是由客户端代码提交并在服务器上执行的。而是在部署后,Data Connect 操作会像 Cloud Functions 函数一样存储在服务器上。这意味着,您需要部署相应的客户端更改,以免影响现有用户(例如,在旧版应用中)。

因此,Data Connect 为您提供了开发者环境和工具,可让您对部署在服务器上的架构、查询和更改进行原型设计。它还会在您进行原型设计时自动生成客户端 SDK。

迭代服务和客户端应用的更新后,服务器端和客户端更新都已准备好部署。

生成 Flutter SDK

与大多数 Firebase 项目一样,Firebase Data Connect 客户端代码的工作在本地项目目录中进行。Data Connect VS Code 扩展程序和 Firebase CLI 都是生成和管理客户端代码的重要本地工具。

SDK 生成选项的键值对应于您在初始化项目时生成的 dataconnect.yaml 文件中的多个条目。

初始化 SDK 生成

connector.yaml 中,添加 outputDirpackage 和(对于 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 源文件。这在热 (重新)加载工作流中非常有用。

在其他情况下,如果您使用的是 Firebase CLI 中的 Data Connect 模拟器,则可以对 .gql 更新设置监视,还可以自动更新 SDK 源代码。

或者,您也可以在 .gql 文件发生更改时使用 CLI 重新生成 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 时所用的信息初始化 Data Connect 实例(所有信息均可在 Firebase 控制台的“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';

对 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();

如需切换到正式版资源,请注释掉用于连接到模拟器的行。

在客户端使用查询

生成的代码将已包含预定义的查询引用。您只需导入这些类并对其调用 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();

Dart SDK 中的数据类型

Data Connect 服务器代表常见的 GraphQL 数据类型。这些参数在 SDK 中表示如下。

Data Connect 类型 Dart
时间戳 firebase_data_connect.Timestamp
Int(32 位) 整数
日期 DateTime
UUID 字符串
Int64 整数
浮点数 double
布尔值 布尔值
不限 firebase_data_connect.AnyValue