Utiliser les SDK Flutter générés

Les SDK client Firebase SQL Connect vous permettent d'appeler vos requêtes et mutations côté serveur directement à partir d'une application Firebase. Vous générez un SDK client personnalisé en parallèle lorsque vous concevez les schémas, les requêtes et les mutations que vous déployez dans votre SQL Connect service. Ensuite, vous intégrez les méthodes de ce SDK dans votre logique client.

Comme nous l'avons mentionné ailleurs, il est important de noter que les SQL Connect requêtes et les mutations ne sont pas envoyées par le code client et exécutées sur le serveur. Au lieu de cela, une fois déployées, les SQL Connect opérations sont stockées sur le serveur comme Cloud Functions. Cela signifie que vous devez déployer les modifications côté client correspondantes pour éviter de perturber les utilisateurs existants (par exemple, sur les anciennes versions de l'application).

C'est pourquoi SQL Connect vous fournit un environnement de développement et des outils qui vous permettent de prototyper vos schémas, requêtes et mutations déployés sur le serveur. Il génère également automatiquement des SDK côté client pendant que vous créez des prototypes.

Une fois que vous avez itéré les mises à jour de votre service et de vos applications clientes, les mises à jour côté serveur et côté client sont prêtes à être déployées.

Quel est le workflow de développement client ?

Si vous avez suivi la section Premiers pas, vous avez découvert le flux de développement global pour SQL Connect. Dans ce guide, vous trouverez des informations plus détaillées sur la génération de SDK Flutter à partir de votre schéma, ainsi que sur l'utilisation des requêtes et des mutations client.

En résumé, pour utiliser les SDK Flutter générés dans vos applications clientes, vous devez suivre les étapes préalables suivantes :

  1. Ajoutez Firebase à votre application Flutter.
  2. Installez la CLI flutterfire dart pub global activate flutterfire_cli.
  3. Exécutez flutterfire configure.

Puis :

  1. Développez le schéma de votre application.
  2. Configurez la génération du SDK :

  3. Initialisez votre code client et importez des bibliothèques.

  4. Implémentez des appels aux requêtes et aux mutations.

  5. Configurez et utilisez l'émulateur SQL Connect et itérez.

Générez votre SDK Flutter

Utilisez la Firebase CLI pour configurer les SQL Connect générés dans vos applications. La commande init doit détecter toutes les applications du dossier actuel et installer automatiquement les SDK générés.

firebase init dataconnect:sdk

Mettez à jour les SDK lors de la création de prototypes

Si l'extension SQL Connect VS Code est installée, elle maintiendra toujours les SDK générés à jour.

Si vous n'utilisez pas l'extension SQL Connect VS Code, vous pouvez utiliser la CLI Firebase pour maintenir les SDK générés à jour.

firebase dataconnect:sdk:generate --watch

Générez des SDK dans des pipelines de compilation

Vous pouvez utiliser la CLI Firebase pour générer des SQL Connect SDK dans les processus de compilation CI/CD.

firebase dataconnect:sdk:generate

Configurez le code client

Initialisez votre application SQL Connect

Commencez par initialiser votre application en suivant les instructions de configuration Firebase standards.

Ensuite, installez le SQL Connect plug-in :

flutter pub add firebase_data_connect

Initialisez le SDK FlutterSQL Connect

Initialisez votre SQL Connect instance à l'aide des informations que vous avez utilisées pour configurer SQL Connect (toutes disponibles dans l'onglet SQL Connect de la console Firebase).

Importez des bibliothèques

Deux ensembles d'importations sont nécessaires pour initialiser votre code client : les importations générales SQL Connect et les importations de SDK spécifiques générées.

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

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

Utilisez des requêtes côté client

Le code généré est déjà fourni avec des références de requête prédéfinies. Il vous suffit de les importer et d'appeler execute sur celles-ci.

import 'generated/movies.dart';

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

Appelez les méthodes de requête du SDK

Voici un exemple d'utilisation de ces fonctions de raccourci d'action :

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

Champs facultatifs

Certaines requêtes peuvent comporter des champs facultatifs. Dans ce cas, le SDK Flutter expose une méthode de compilation qui doit être définie séparément.

Par exemple, le champ rating est facultatif lorsque vous appelez createMovie. Vous devez donc le fournir dans la fonction de compilation.

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

Abonnez-vous aux modifications

Consultez Recevoir des mises à jour en temps réel de SQL Connect.

Gérez les modifications apportées aux champs d'énumération

Le schéma d'une application peut contenir des énumérations, auxquelles vos requêtes GraphQL peuvent accéder.

À mesure que la conception d'une application évolue, vous pouvez ajouter de nouvelles valeurs compatibles avec l'énumération. Par exemple, imaginez que, plus tard dans le cycle de vie de votre application, vous décidez d'ajouter une valeur FULLSCREEN à l'énumération AspectRatio.

Dans le workflow SQL Connect, vous pouvez utiliser des outils de développement locaux pour mettre à jour vos requêtes et vos SDK.

Toutefois, avant de publier une version mise à jour de vos clients, les anciens clients déployés peuvent cesser de fonctionner.

Exemple d'implémentation résiliente

Le SDK généré force la gestion des valeurs inconnues. Autrement dit, le code client doit décompresser l'objet EnumValue en Known ou 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}');
  }
}

Activez la mise en cache côté client

SQL Connect dispose d'une fonctionnalité de mise en cache côté client facultative, que vous pouvez activer en modifiant le fichier connector.yaml. Lorsque cette fonctionnalité est activée, les SDK client générés mettent en cache localement les réponses aux requêtes, ce qui peut réduire le nombre de requêtes de base de données effectuées par votre application et permettre aux parties de votre application qui dépendent de la base de données de fonctionner lorsque la disponibilité du réseau est interrompue.

Pour activer la mise en cache côté client, ajoutez une configuration de mise en cache client à la configuration de votre connecteur :

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

Cette configuration comporte deux paramètres, tous deux facultatifs :

  • maxAge: âge maximal qu'une réponse mise en cache peut avoir avant que le SDK client ne récupère de nouvelles valeurs. Exemples : "0", "30s", "1h30m".

    La valeur par défaut de maxAge est 0, ce qui signifie que les réponses sont mises en cache, mais que le SDK client récupère toujours de nouvelles valeurs. Les valeurs mises en cache ne sont utilisées que lorsque CACHE_ONLY est spécifié pour execute() et que le résultat initial est renvoyé par subscribe().

  • storage: le SDK client peut être configuré pour mettre en cache les réponses dans un stockage persistent ou dans une memory. Les résultats mis en cache dans le stockage persistent sont conservés lors des redémarrages de l'application. Lorsque vous ciblez Android ou iOS, la valeur par défaut est persistent. Lorsque vous ciblez des navigateurs Web, seul le stockage memory est compatible.

Après avoir mis à jour la configuration de mise en cache de votre connecteur, régénérez vos SDK client et recréez votre application. Une fois cela fait, execute() et subscribe() mettront en cache les réponses et utiliseront les valeurs mises en cache conformément à la règle que vous avez configurée. Cela se produit généralement automatiquement, sans aucune autre action de votre part. Toutefois, notez les points suivants :

  • Le comportement par défaut de execute() est décrit ci-dessus : si un résultat est mis en cache pour une requête et que la valeur mise en cache n'est pas plus ancienne que maxAge, utilisez la valeur mise en cache. Ce comportement par défaut est appelé règle PREFER_CACHE.

    Vous pouvez également spécifier des appels individuels à execute() pour ne diffuser que les valeurs mises en cache (CACHE_ONLY) ou pour récupérer inconditionnellement de nouvelles valeurs à partir du serveur (SERVER_ONLY).

    await queryRef.execute(fetchPolicy: QueryFetchPolicy.cacheOnly);
    
    await queryRef.execute(fetchPolicy: QueryFetchPolicy.serverOnly);
    
  • Lorsque vous appelez subscribe(), il renvoie toujours immédiatement le contenu mis en cache s'il existe, quel que soit le paramètre maxAge. Les appels suivants à execute() avertissent les écouteurs en fonction de la valeur maxAge configurée.

Utilisez des mutations côté client

Les mutations sont accessibles de la même manière que les requêtes.

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

Créez des prototypes et testez vos applications Flutter

Instrumentez les clients pour utiliser un émulateur local

Vous pouvez utiliser l'émulateur SQL Connect, que ce soit à partir de l' extension SQL Connect VS Code ou de la CLI.

L'instrumentation de l'application pour se connecter à l'émulateur est la même dans les deux cas.

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

Pour passer aux ressources de production, commentez les lignes de connexion à l'émulateur.

Types de données dans le SDK Dart

Le serveur SQL Connect représente les types de données GraphQL courants. Ils sont représentés comme suit dans le SDK.

Type SQL Connect Dart
Horodatage firebase_data_connect.Timestamp
Int (32 bits) int
Date DateTime
UUID chaîne
Int64 int
Float double
Booléen booléen
Tous firebase_data_connect.AnyValue