Sử dụng các SDK Flutter đã tạo

SDK Firebase Data Connect cho phép bạn gọi các truy vấn và đột biến phía máy chủ ngay từ một ứng dụng Firebase. Bạn tạo một SDK ứng dụng tuỳ chỉnh song song khi thiết kế các lược đồ, truy vấn và đột biến mà bạn triển khai cho dịch vụ Data Connect. Sau đó, bạn tích hợp các phương thức từ SDK này vào logic của ứng dụng.

Như chúng tôi đã đề cập ở nơi khác, điều quan trọng cần lưu ý là các truy vấn và đột biến không được mã ứng dụng gửi và thực thi trên máy chủ.Data Connect Thay vào đó, khi được triển khai, các thao tác Data Connect sẽ được lưu trữ trên máy chủ như Cloud Functions. Điều này có nghĩa là bạn cần triển khai các thay đổi tương ứng phía máy khách để tránh làm gián đoạn người dùng hiện tại (ví dụ: trên các phiên bản ứng dụng cũ).

Đó là lý do Data Connect cung cấp cho bạn một môi trường phát triển và công cụ cho phép bạn tạo mẫu các lược đồ, truy vấn và đột biến được triển khai trên máy chủ. Nền tảng này cũng tự động tạo SDK phía máy khách trong khi bạn tạo mẫu.

Khi bạn đã lặp lại các bản cập nhật cho dịch vụ và ứng dụng khách, cả bản cập nhật phía máy chủ và phía máy khách đều đã sẵn sàng triển khai.

Quy trình phát triển ứng dụng là gì?

Nếu đã làm theo hướng dẫn Bắt đầu, bạn sẽ được giới thiệu quy trình phát triển tổng thể cho Data Connect. Trong hướng dẫn này, bạn sẽ tìm thấy thông tin chi tiết hơn về cách tạo SDK Flutter từ giản đồ của mình và cách xử lý các truy vấn cũng như đột biến của ứng dụng.

Tóm lại, để sử dụng các SDK Flutter đã tạo trong ứng dụng khách, bạn sẽ làm theo các bước tiên quyết sau:

  1. Thêm Firebase vào ứng dụng Flutter.
  2. Cài đặt CLI flutterfire dart pub global activate flutterfire_cli.
  3. Chạy flutterfire configure.

Sau đó:

  1. Phát triển giản đồ ứng dụng.
  2. Thiết lập quy trình tạo SDK:

  3. Khởi chạy mã ứng dụng và nhập thư viện.

  4. Triển khai các lệnh gọi đến truy vấnđột biến.

  5. Thiết lập và sử dụng trình mô phỏng Data Connect rồi lặp lại.

Tạo Flutter SDK

Sử dụng CLI Firebase để thiết lập các SDK Data Connect được tạo trong ứng dụng của bạn. Lệnh init sẽ phát hiện tất cả ứng dụng trong thư mục hiện tại và tự động cài đặt các SDK đã tạo.

firebase init dataconnect:sdk

Cập nhật SDK trong quá trình tạo mẫu

Nếu bạn đã cài đặt tiện ích Data Connect VS Code, thì tiện ích này sẽ luôn cập nhật các SDK đã tạo.

Nếu không sử dụng tiện ích Data Connect VS Code, bạn có thể dùng Firebase CLI để cập nhật các SDK đã tạo.

firebase dataconnect:sdk:generate --watch

Tạo SDK trong quy trình tạo bản dựng

Bạn có thể dùng Firebase CLI để tạo SDK Data Connect trong các quy trình tạo CI/CD.

firebase dataconnect:sdk:generate

Thiết lập mã ứng dụng khách

Khởi chạy ứng dụng Data Connect

Trước tiên, hãy khởi chạy ứng dụng của bạn theo hướng dẫn thiết lập Firebase tiêu chuẩn.

Sau đó, hãy cài đặt trình bổ trợ Data Connect:

flutter pub add firebase_data_connect

Khởi chạy Data Connect Flutter SDK

Khởi chạy phiên bản Data Connect bằng thông tin bạn đã dùng để thiết lập Data Connect (tất cả đều có trong thẻ Data Connect của bảng điều khiển Firebase).

Nhập thư viện

Bạn cần có hai nhóm dữ liệu nhập để khởi chạy mã ứng dụng, dữ liệu nhập Data Connect chung và dữ liệu nhập SDK cụ thể, được tạo.

// general imports
import 'package:firebase_data_connect/firebase_data_connect.dart';

// generated queries and mutations from SDK
import 'generated/movies.dart';

Sử dụng truy vấn ở phía máy khách

Mã được tạo sẽ đi kèm với các Query Ref được xác định trước. Bạn chỉ cần nhập và gọi execute trên các đối tượng đó.

import 'generated/movies.dart';

await MoviesConnector.instance.listMovies().execute();

Gọi phương thức truy vấn SDK

Sau đây là một ví dụ về cách sử dụng các hàm phím tắt thao tác này:

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

Trường tuỳ chọn

Một số truy vấn có thể có các trường không bắt buộc. Trong những trường hợp này, Flutter SDK sẽ hiển thị một phương thức trình tạo và bạn sẽ phải đặt riêng phương thức này.

Ví dụ: trường rating là không bắt buộc khi gọi createMovie, vì vậy, bạn cần cung cấp trường này trong hàm tạo.

await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi"}).rating(5).execute();

Đăng ký nhận thông báo về các thay đổi

Bạn có thể đăng ký nhận thông báo về các thay đổi (thông báo sẽ được cập nhật bất cứ khi nào bạn thực hiện một truy vấn).

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`

Xử lý các thay đổi đối với trường liệt kê

Lược đồ của một ứng dụng có thể chứa các giá trị liệt kê mà bạn có thể truy cập bằng các truy vấn GraphQL.

Khi thiết kế của ứng dụng thay đổi, bạn có thể thêm các giá trị được hỗ trợ của enum mới. Ví dụ: giả sử sau này trong vòng đời của ứng dụng, bạn quyết định thêm giá trị FULLSCREEN vào enum AspectRatio.

Trong quy trình Data Connect, bạn có thể sử dụng công cụ phát triển cục bộ để cập nhật các truy vấn và SDK.

Tuy nhiên, trước khi bạn phát hành phiên bản mới của ứng dụng khách, các ứng dụng khách cũ đã triển khai có thể bị lỗi.

Ví dụ về cách triển khai có khả năng phục hồi

SDK được tạo sẽ buộc xử lý các giá trị không xác định. Tức là mã ứng dụng phải giải gói đối tượng EnumValue thành Known hoặc 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}");
  }
}

Bật tính năng lưu vào bộ nhớ đệm phía máy khách

Data Connect có một tính năng lưu vào bộ nhớ đệm phía máy khách không bắt buộc mà bạn có thể bật bằng cách chỉnh sửa tệp connector.yaml. Khi tính năng này được bật, các SDK ứng dụng đã tạo sẽ lưu trữ cục bộ các phản hồi truy vấn, điều này có thể làm giảm số lượng yêu cầu cơ sở dữ liệu mà ứng dụng của bạn thực hiện và cho phép các phần phụ thuộc cơ sở dữ liệu của ứng dụng hoạt động khi kết nối mạng bị gián đoạn.

Để bật tính năng lưu vào bộ nhớ đệm phía máy khách, hãy thêm cấu hình lưu vào bộ nhớ đệm phía máy khách vào cấu hình trình kết nối:

generate:
  javascriptSdk:
    outputDir: ../dart/
    package: "dataconnect_generated"
    clientCache:
      maxAge: 5s
      storage: memory

Cấu hình này có 2 tham số, cả hai đều không bắt buộc:

  • maxAge: Độ tuổi tối đa mà một phản hồi được lưu vào bộ nhớ đệm có thể có trước khi SDK ứng dụng tìm nạp các giá trị mới. Ví dụ: "0", "30s", "1h30m".

    Giá trị mặc định cho maxAge0, nghĩa là các phản hồi được lưu vào bộ nhớ đệm, nhưng SDK ứng dụng sẽ luôn tìm nạp các giá trị mới. Các giá trị được lưu vào bộ nhớ đệm sẽ chỉ được dùng khi CACHE_ONLY được chỉ định thành execute() và kết quả ban đầu được trả về từ subscribe().

  • storage: Bạn có thể định cấu hình SDK ứng dụng để lưu phản hồi vào bộ nhớ đệm trong bộ nhớ persistent hoặc trong memory. Kết quả được lưu vào bộ nhớ đệm trong bộ nhớ persistent sẽ duy trì trong suốt quá trình khởi động lại ứng dụng. Khi nhắm đến Android hoặc iOS, giá trị mặc định là persistent. Khi nhắm đến trình duyệt web, chỉ bộ nhớ memory được hỗ trợ.

Sau khi bạn cập nhật cấu hình lưu vào bộ nhớ đệm của trình kết nối, hãy tạo lại SDK ứng dụng và tạo lại ứng dụng của bạn. Sau khi bạn thực hiện xong, execute()subscribe() sẽ lưu vào bộ nhớ đệm các phản hồi và sử dụng các giá trị được lưu vào bộ nhớ đệm theo chính sách mà bạn đã định cấu hình. Quá trình này thường diễn ra tự động mà bạn không cần làm gì thêm; tuy nhiên, hãy lưu ý những điều sau:

  • Hành vi mặc định của execute() như mô tả ở trên: nếu một kết quả được lưu vào bộ nhớ đệm cho một truy vấn và giá trị được lưu vào bộ nhớ đệm không cũ hơn maxAge, thì hãy sử dụng giá trị được lưu vào bộ nhớ đệm. Hành vi mặc định này được gọi là chính sách PREFER_CACHE.

    Bạn cũng có thể chỉ định cho từng lệnh gọi của execute() để chỉ phân phát các giá trị được lưu vào bộ nhớ đệm (CACHE_ONLY) hoặc để tìm nạp vô điều kiện các giá trị mới từ máy chủ (SERVER_ONLY).

    await queryRef.execute(fetchPolicy: QueryFetchPolicy.cacheOnly);
    
    await queryRef.execute(fetchPolicy: QueryFetchPolicy.serverOnly);
    
  • Khi bạn gọi subscribe(), hàm này sẽ luôn trả về ngay nội dung được lưu vào bộ nhớ đệm (nếu có), bất kể chế độ cài đặt maxAge. Các lệnh gọi tiếp theo đến execute() sẽ thông báo cho các trình nghe theo maxAge đã định cấu hình.

Sử dụng các đột biến ở phía máy khách

Bạn có thể truy cập vào các đột biến theo cách tương tự như truy vấn.

await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();

Tạo mẫu và kiểm thử ứng dụng Flutter

Thiết bị đo lường để sử dụng trình mô phỏng cục bộ

Bạn có thể sử dụng trình mô phỏng Data Connect, cho dù là từ tiện ích Data Connect VS Code hay từ CLI.

Việc đo lường ứng dụng để kết nối với trình mô phỏng là như nhau đối với cả hai trường hợp.

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

Để chuyển sang tài nguyên phát hành công khai, hãy nhận xét các dòng để kết nối với trình mô phỏng.

Các loại dữ liệu trong Dart SDK

Máy chủ Data Connect đại diện cho các kiểu dữ liệu GraphQL phổ biến. Các loại này được biểu thị trong SDK như sau.

Loại Data Connect Dart
Dấu thời gian firebase_data_connect.Timestamp
Int (32 bit) int
Ngày DateTime
mã nhận dạng duy nhất (UUID) chuỗi
Int64 int
Nổi double
Boolean bool
Bất kỳ firebase_data_connect.AnyValue