Usa SDKs de Flutter generados

Los SDK de cliente de Firebase SQL Connect te permiten llamar a tus consultas y mutaciones del servidor directamente desde una app de Firebase. Generas un SDK de cliente personalizado en paralelo mientras diseñas los esquemas, las consultas y las mutaciones que implementas en tu servicio de SQL Connect. Luego, integra los métodos de este SDK en la lógica de tu cliente.

Como mencionamos en otra parte, es importante tener en cuenta que el código de cliente no envía las consultas y mutaciones de SQL Connect, y que estas no se ejecutan en el servidor. En cambio, cuando se implementan, las operaciones SQL Connect se almacenan en el servidor, como Cloud Functions. Esto significa que debes implementar los cambios correspondientes del lado del cliente para evitar que se interrumpa el servicio para los usuarios existentes (por ejemplo, en versiones anteriores de la app).

Por eso, SQL Connect te proporciona un entorno de desarrollo y herramientas para desarrolladores que te permiten crear prototipos de tus esquemas, consultas y mutaciones implementados en el servidor. También genera SDK del cliente de forma automática mientras creas prototipos.

Cuando hayas iterado las actualizaciones de tus apps de servicio y cliente, las actualizaciones del servidor y del cliente estarán listas para implementarse.

¿Cuál es el flujo de trabajo de desarrollo de clientes?

Si seguiste la guía de introducción, conociste el flujo de desarrollo general para SQL Connect. En esta guía, encontrarás información más detallada sobre cómo generar SDKs de Flutter a partir de tu esquema y trabajar con consultas y mutaciones de clientes.

En resumen, para usar los SDKs de Flutter generados en tus apps cliente, sigue estos pasos de requisitos previos:

  1. Agrega Firebase a tu app de Flutter.
  2. Instala la CLI de flutterfire dart pub global activate flutterfire_cli.
  3. Ejecuta flutterfire configure.

Luego, haz lo siguiente:

  1. Desarrolla el esquema de tu app.
  2. Configura la generación del SDK:

  3. Inicializa el código de cliente y, luego, importa las bibliotecas.

  4. Implementa llamadas a consultas y mutaciones.

  5. Configura y usa el emulador de SQL Connect, y realiza iteraciones.

Genera tu SDK de Flutter

Usa la CLI de Firebase para configurar los SDKs generados por SQL Connect en tus apps. El comando init debería detectar todas las apps de la carpeta actual y, luego, instalar los SDKs generados de forma automática.

firebase init dataconnect:sdk

Actualiza los SDKs mientras creas prototipos

Si tienes instalada la extensión de VS Code de SQL Connect, siempre mantendrá actualizados los SDKs generados.

Si no usas la extensión de VS Code de SQL Connect, puedes usar Firebase CLI para mantener actualizados los SDKs generados.

firebase dataconnect:sdk:generate --watch

Genera SDKs en canalizaciones de compilación

Puedes usar Firebase CLI para generar SDK de SQL Connect en los procesos de compilación de CI/CD.

firebase dataconnect:sdk:generate

Configura el código del cliente

Inicializa tu app de SQL Connect

Primero, inicializa tu app con las instrucciones de configuración estándar de Firebase.

Luego, instala el complemento SQL Connect:

flutter pub add firebase_data_connect

Inicializa el SDK de Flutter de SQL Connect

Inicializa tu instancia de SQL Connect con la información que usaste para configurar SQL Connect. Encuentra esta información en la página Bases de datos y almacenamiento > SQL Connect de la consola de Firebase.

Importa las bibliotecas

Se necesitan dos conjuntos de importaciones para inicializar el código de cliente: las importaciones generales de SQL Connect y las importaciones específicas del SDK generado.

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

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

Usa consultas en el cliente

El código generado ya incluirá referencias de consulta predefinidas. Solo debes importarlos y llamar a execute en ellos.

import 'generated/movies.dart';

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

Llama a los métodos de consulta del SDK

A continuación, se muestra un ejemplo en el que se usan estas funciones de acceso directo de acción:

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

Campos opcionales

Algunas consultas pueden tener campos opcionales. En estos casos, el SDK de Flutter expone un método de compilador y se debe configurar por separado.

Por ejemplo, el campo rating es opcional cuando se llama a createMovie, por lo que debes proporcionarlo en la función del compilador.

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

Suscríbete a los cambios

Consulta Obtén actualizaciones en tiempo real de SQL Connect.

Cómo controlar los cambios en los campos de enumeración

El esquema de una app puede contener enumeraciones, a las que pueden acceder tus consultas de GraphQL.

A medida que cambia el diseño de una app, puedes agregar nuevos valores admitidos de enum. Por ejemplo, imagina que, más adelante en el ciclo de vida de tu aplicación, decides agregar un valor FULLSCREEN a la enumeración AspectRatio.

En el flujo de trabajo de SQL Connect, puedes usar herramientas de desarrollo locales para actualizar tus consultas y SDKs.

Sin embargo, antes de lanzar una versión actualizada de tus clientes, es posible que los clientes implementados más antiguos dejen de funcionar.

Ejemplo de implementación resiliente

El SDK generado fuerza el control de los valores desconocidos. Es decir, el código del cliente debe desenvolver el objeto EnumValue en Known o 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}');
  }
}

Habilita el almacenamiento en caché del cliente

SQL Connect tiene una función opcional de almacenamiento en caché del cliente, que puedes habilitar editando el archivo connector.yaml. Cuando se habilita esta función, los SDKs de cliente generados almacenarán en caché de forma local las respuestas a las consultas, lo que puede reducir la cantidad de solicitudes a la base de datos que realiza tu app y permite que las partes de tu app que dependen de la base de datos funcionen cuando se interrumpe la disponibilidad de la red.

Para habilitar el almacenamiento en caché del cliente, agrega una configuración de almacenamiento en caché del cliente a la configuración de tu conector:

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

Esta configuración tiene dos parámetros, ambos opcionales:

  • maxAge: Es la antigüedad máxima que puede tener una respuesta almacenada en caché antes de que el SDK del cliente recupere valores nuevos. Ejemplos: "0", "30s", "1h30m".

    El valor predeterminado de maxAge es 0, lo que significa que las respuestas se almacenan en caché, pero el SDK de cliente siempre recuperará valores nuevos. Los valores almacenados en caché solo se usarán cuando se especifique CACHE_ONLY en execute() y el resultado inicial que se devuelva de subscribe().

  • storage: El SDK cliente se puede configurar para almacenar en caché las respuestas en el almacenamiento de persistent o en memory. Los resultados almacenados en caché en el almacenamiento de persistent persistirán cuando se reinicie la app. Cuando se segmenta para Android o iOS, el valor predeterminado es persistent. Cuando se segmenta para navegadores web, solo se admite el almacenamiento de memory.

Después de actualizar la configuración de almacenamiento en caché de tu conector, vuelve a generar los SDKs de cliente y a compilar tu app. Una vez que lo hayas hecho, execute() y subscribe() almacenarán en caché las respuestas y usarán los valores almacenados en caché según la política que configuraste. Por lo general, esto sucede de forma automática, sin que debas realizar pasos adicionales. Sin embargo, ten en cuenta lo siguiente:

  • El comportamiento predeterminado de execute() es el que se describió anteriormente: si se almacena en caché un resultado para una consulta y el valor almacenado en caché no es anterior a maxAge, se usa el valor almacenado en caché. Este comportamiento predeterminado se denomina política PREFER_CACHE.

    También puedes especificar que las invocaciones individuales de execute() solo entreguen valores almacenados en caché (CACHE_ONLY) o que recuperen valores nuevos del servidor de forma incondicional (SERVER_ONLY).

    await queryRef.execute(fetchPolicy: QueryFetchPolicy.cacheOnly);
    
    await queryRef.execute(fetchPolicy: QueryFetchPolicy.serverOnly);
    
  • Cuando llames a subscribe(), siempre se devolverá de inmediato el contenido almacenado en caché si existe, independientemente de la configuración de maxAge. Las llamadas posteriores a execute() notificarán a los objetos de escucha según el maxAge configurado.

Usa mutaciones en el cliente

Se puede acceder a las mutaciones de la misma manera que a las consultas.

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

Crea prototipos y prueba tus apps de Flutter

Instrumenta clientes para que usen un emulador local

Puedes usar el emulador de SQL Connect, ya sea desde la extensión de VS Code de SQL Connect o desde la CLI.

La instrumentación de la app para conectarse al emulador es la misma en ambos casos.

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

Para cambiar a los recursos de producción, marca como comentario las líneas que se conectan al emulador.

Tipos de datos en el SDK de Dart

El servidor de SQL Connect representa los tipos de datos comunes de GraphQL. Se representan en el SDK de la siguiente manera.

SQL Connect Tipo Dart
Marca de tiempo firebase_data_connect.Timestamp
Int (32 bits) int
Fecha DateTime
UUID string
Int64 int
Número de punto flotante double
Booleano bool
Cualquiera firebase_data_connect.AnyValue