Comparaison
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 configuration | Les trois |
| Des écritures faites hors-ligne, mises en file et rejouées | Qora |
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 reconnexion | Qora |
| L'invalidation par tags | Qora |
| La persistance disque avec un adaptateur prêt à l'emploi | cached_query (cached_storage) |
| La persistance disque sur votre propre backend de stockage | Qora ou cached_query |
| Une API 100 % hooks, la plus proche de TanStack Query sur le web | flutter_query |
| Hooks ou widgets builders, au choix | Qora |
| Un noyau Dart pur utilisable hors Flutter | Qora ou cached_query |
| Un onglet dans Flutter DevTools aujourd'hui | cached_query |
| Un overlay de debug dans l'application | Qora |
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 :
NetworkModepar requête : déclarer si une requête s'exécute uniquementonline,always(base locale) ouofflineFirst(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 deQoraState, 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.
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é :
// 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 :
| Couche | Outil 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.
Liens connexes
Démarrage rapide
Construire un écran liste et un écran détail avec Qora, voir le cache travailler, puis passer l'application hors-ligne.
Venant de TanStack Query
Correspondance précise des concepts, hooks et options de configuration de TanStack Query vers leurs équivalents Qora. Couvre ce qui est identique, ce qui est renommé et ce qui fonctionne différemment.