Prise en main

Comparaison

Comment Qora se compare à flutter_query et cached_query, les autres bibliothèques de state serveur pour Flutter.

Qora, flutter_query et cached_query sont des bibliothèques de state serveur construites pour des données résidant sur un serveur distant. Provider et BLoC ciblent le state client ; les comparer à Qora confond deux domaines de problèmes distincts.

Cette page documente les différences significatives entre les trois solutions de state serveur. Les informations sur les autres bibliothèques proviennent de leur documentation publique en novembre 2026 ; ouvrez une issue si quelque chose est obsolète.


Critères de sélection

Si vous avez besoin de...Meilleur choix
Un cache SWR solide avec un minimum de configurationLes trois
Des écritures faites hors-ligne, mises en file et rejouéesQora
Des requêtes qui se mettent en pause hors-ligne (FetchStatus.paused)Qora
Un mode réseau par requête (online / always / offlineFirst)Qora
Le contrôle du thundering herd à la reconnexionQora
L'invalidation par tagsQora
La persistance disque avec un adaptateur prêt à l'emploicached_query (cached_storage)
La persistance disque sur votre propre backend de stockageQora ou cached_query
Une API 100 % hooks, la plus proche de TanStack Query sur le webflutter_query
Hooks ou widgets builders, au choixQora
Un noyau Dart pur utilisable hors FlutterQora ou cached_query
Un onglet dans Flutter DevTools aujourd'huicached_query
Un overlay de debug dans l'applicationQora

Différenciateurs de Qora

Architecture hors-ligne

Le hors-ligne dans Qora est un ensemble de briques qui coopèrent, pas un simple flag de refetch à la reconnexion :

  • NetworkMode par requête : déclarer si une requête s'exécute uniquement online, always (base locale) ou offlineFirst (servir le cache, rafraîchir en arrière-plan une fois en ligne).
  • File de mutations hors-ligne : les écritures soumises hors-ligne renvoient un résultat optimiste, sont mises en file dans l'ordre et rejouées à la reconnexion. La file est en mémoire : elle survit aux changements de connectivité, pas à un redémarrage de l'application.
  • FetchStatus : un enum sur un second axe (fetching / paused / idle) émis indépendamment de QoraState, qui permet à l'UI de distinguer « pas de réseau » de « chargement ».
  • ReconnectStrategy : limite le thundering herd à la reconnexion avec un nombre maximal de refetchs simultanés et un jitter aléatoire entre les lots.
user_screen.dart
QoraBuilder<User>(
  queryKey: ['users', userId],
  fetcher: () => api.getUser(userId),
  options: const QoraOptions(networkMode: NetworkMode.offlineFirst),
  builder: (context, state, fetchStatus) {
    if (fetchStatus == FetchStatus.paused) {
      return OfflineBanner(staleData: state.dataOrNull);
    }
    return switch (state) {
      Success(:final data) => UserCard(data),
      Loading() => const CircularProgressIndicator(),
      Failure(:final error) => ErrorWidget('$error'),
      Initial() => const SizedBox.shrink(),
    };
  },
)

DevTools

L'overlay de Qora (qora_devtools_overlay) tourne dans votre application en mode debug et affiche chaque requête avec son état, ses données et sa fraîcheur, ainsi que la file de mutations. Une extension Flutter DevTools partageant le même protocole d'événements est en développement ; la version publiée sur pub.dev n'est pas encore compatible avec Qora 1.x.

Noyau Dart pur

Le package qora n'a aucune dépendance Flutter. Il fonctionne dans les applications CLI, le code Dart côté serveur et les suites de tests sans importer le Flutter SDK. qora_flutter est une couche de liaison de widgets opt-in mince au-dessus.

Invalidation avancée

invalidateQueries({required QueryFilter filter}) invalide par état, options de dernière utilisation ou toute combinaison, pas seulement par préfixe de clé :

main.dart
// Invalider toutes les requêtes en mode online qui n'ont pas encore réussi
client.invalidateQueries(
  filter: (key, state, opts) =>
      opts?.networkMode == NetworkMode.online && state is! Success,
);

cached_query : persistance prête à l'emploi

cached_query fournit cached_storage, une implémentation de stockage basée sur sqflite maintenue avec la bibliothèque, ainsi qu'une extension Flutter DevTools. Le PersistQoraClient de Qora couvre le même besoin via l'interface StorageAdapter, avec une implémentation en mémoire incluse ; les adaptateurs pour des backends précis (Hive, Isar, SharedPreferences) sont pour l'instant à implémenter dans votre application.


Complémentarité avec BLoC et Riverpod

Qora, BLoC et Riverpod adressent des préoccupations différentes et sont conçus pour être utilisés ensemble :

CoucheOutil approprié
Données résidant sur un serveur (requêtes, mutations, pagination)Qora
Machines d'état UI complexes (tunnels de paiement, formulaires multi-étapes)BLoC
State client et DI (thème, session d'authentification, graphe de services)Riverpod ou Provider

Une application en production utilise couramment les trois en combinaison. Consulter les guides d'intégration pour ajouter Qora à une base de code BLoC ou Riverpod existante.

Qora gère le state serveur. BLoC et Riverpod gèrent le state client. Les deux domaines sont complémentaires ; chaque bibliothèque opère dans son périmètre prévu.

Liens connexes

Copyright © 2026