使用生成的 Flutter SDK

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

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

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

当您对服务和客户端应用进行迭代更新后,服务器端和客户端更新即可部署。

客户端开发工作流程是什么?

如果您按照使用入门中的说明操作,则已了解 Data Connect 的整体开发流程。在本指南中,您可以详细了解如何从架构生成 Flutter SDK,以及如何处理客户端查询和突变。

总而言之,如需在客户端应用中使用生成的 Flutter SDK,您需要先完成以下前提条件步骤:

  1. 将 Firebase 添加到您的 Flutter 应用。
  2. 安装 flutterfire CLI dart pub global activate flutterfire_cli
  3. 运行 flutterfire configure

然后:

  1. 开发应用架构。
  2. 设置 SDK 生成:

    • 使用 Data Connect VS Code 扩展程序中的向应用添加 SDK 按钮
    • 通过更新connector.yaml
  3. 初始化客户端代码并导入库

  4. 实现对查询变更的调用。

  5. 设置并使用 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 对象解封装为 KnownUnknown

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