v1.3.1 est disponible

Le state serveur pour les apps Flutter qui fonctionnent hors-ligne

Qora récupère, met en cache et synchronise les données serveur, et garde votre application utilisable quand le réseau ne l'est pas. Les données sauvegardées s'affichent dès le démarrage, les requêtes se mettent en pause hors-ligne et reprennent à la reconnexion, et les écritures faites hors-ligne sont mises en file puis rejouées dans l'ordre.
user_screen.dart
// Données du cache dès la première frame, conservées pendant refetchs et erreurs.
QoraBuilder<User>(
  queryKey: ['users', userId],
  fetcher: () => api.getUser(userId),
  builder: (context, state, fetchStatus) => Column(children: [
    if (fetchStatus == FetchStatus.paused) const OfflineBanner(),
    if (state.dataOrNull case final user?) UserCard(user),
  ]),
)

// Écrit hors-ligne : affiché tout de suite, envoyé à la reconnexion.
QoraMutationBuilder<Comment, String, void>(
  mutator: (text) => api.postComment(text),
  options: MutationOptions(
    offlineQueue: true,
    optimisticResponse: (text) => Comment.draft(text),
    invalidates: [['comments']],
  ),
  builder: (context, state, mutate) => SendButton(onSend: mutate),
)

Le hors-ligne, intégré

Pas un simple flag de refetch à la reconnexion : trois briques qui travaillent ensemble, branchées par un seul widget.
    Données sauvegardées au démarrage
    PersistQoraClient écrit les fetchs réussis dans votre stockage et les restaure avant la première frame. Les entrées périmées s'affichent immédiatement et se revalident en arrière-plan.
    Des requêtes qui savent qu'elles sont hors-ligne
    Les requêtes se mettent en pause quand l'appareil est hors-ligne et le signalent via FetchStatus.paused : l'UI distingue « pas de réseau » de « chargement ». Elles reprennent à la reconnexion, avec du jitter pour éviter le thundering herd.
    Des écritures qui attendent le réseau
    Les mutations faites hors-ligne renvoient un résultat optimiste immédiatement et sont rejouées dans l'ordre à la reconnexion. La file est en mémoire aujourd'hui ; la persister entre deux redémarrages est l'objectif de la 1.4.

Tout ce qu'on attend d'une bibliothèque de requêtes

    Stale-while-revalidate
    Les données du cache s'affichent dès la première frame ; les données fraîches les remplacent en arrière-plan.
    Déduplication des requêtes
    Dix widgets qui observent la même clé partagent une entrée de cache et un seul appel réseau.
    Invalidation précise
    Par clé exacte, par préfixe, par prédicat ou par tag. Les requêtes montées se relancent automatiquement.
    Mises à jour optimistes
    Mettez à jour le cache dans onMutate, restaurez le snapshot dans onError, invalidez en cas de succès.
    État sur deux axes
    Un QoraState scellé à matcher de façon exhaustive, plus un FetchStatus séparé. Les données précédentes ne sont jamais perdues lors d'un refetch ou d'une erreur.
    Requêtes infinies
    Pagination par curseur ou par page avec une fenêtre mémoire maxPages.
    Builders ou hooks
    Les widgets QoraBuilder, ou useQuery et useMutation avec qora_hooks.
    DevTools dans l'app
    Un overlay actif en debug uniquement qui affiche chaque requête, son état, sa fraîcheur et la file de mutations.
    Noyau Dart pur
    Aucune dépendance Flutter et aucune génération de code. Fonctionne dans les CLI, les serveurs et les tests.

Compatible avec ce que vous utilisez déjà

Qora gère les données serveur. Gardez votre state management pour l'état de l'UI et votre client HTTP pour le transport.
    Riverpod
    Exposer les requêtes Qora aux providers.
    BLoC
    Alimenter cubits et blocs depuis le cache.
    Dio et GraphQL
    Mapper les erreurs de transport, rafraîchir les tokens, encapsuler graphql et ferry.
    Vous venez d'une autre bibliothèque
    Correspondance des API depuis cached_query, flutter_query et TanStack Query.

Votre première requête en cinq minutes

Ajoutez un package, enveloppez votre app avec QoraScope.auto et liez une requête à un widget. Pas de génération de code, pas d'échafaudage de providers.
Copyright © 2026