[{"data":1,"prerenderedAt":1187},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-getting-started-comparison":342,"-fr-getting-started-comparison-surround":1182},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Prise en main","i-lucide-rocket","/fr/getting-started","fr/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Qu'est-ce que Qora ?","/fr/getting-started/what-is-qora","fr/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/fr/getting-started/installation","fr/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Démarrage rapide","/fr/getting-started/quick-start","fr/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparaison","/fr/getting-started/comparison","fr/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Venant de TanStack Query","/fr/getting-started/coming-from-tanstack-query","fr/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrer depuis d'Autres Librairies","/fr/getting-started/migrating-from-other-libraries","fr/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"Assistants IA","/fr/getting-started/ai-assistants","fr/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Concepts clés","i-lucide-book-open","/fr/core-concepts","fr/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Requêtes","/fr/core-concepts/queries","fr/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Clés de requête","/fr/core-concepts/query-keys","fr/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"États des requêtes","/fr/core-concepts/query-states","fr/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Cache","/fr/core-concepts/caching","fr/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/fr/core-concepts/stale-while-revalidate","fr/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Déduplication","/fr/core-concepts/deduplication","fr/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations et invalidation","/fr/core-concepts/mutations","fr/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Hors-ligne et réseau","/fr/core-concepts/offline","fr/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Usage avec Flutter","i-lucide-smartphone","/fr/flutter-integration","fr/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Configuration","/fr/flutter-integration/setup","fr/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/fr/flutter-integration/qora-scope","fr/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/fr/flutter-integration/qora-builder","fr/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/fr/flutter-integration/qora-mutation-builder","fr/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/fr/flutter-integration/infinite-query-builder","fr/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/fr/flutter-integration/hooks","fr/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Widgets de statut réseau","/fr/flutter-integration/network-status","fr/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Bonnes pratiques","/fr/flutter-integration/best-practices","fr/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Guides Pratiques","i-lucide-chef-hat","/fr/recipes","fr/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/fr/recipes/mutations","fr/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Mises à jour optimistes","/fr/recipes/optimistic-updates","fr/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistance","/fr/recipes/persistence","fr/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Réseau adaptatif","/fr/recipes/network-aware","fr/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Requêtes infinies","/fr/recipes/infinite-queries","fr/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Requêtes dépendantes","/fr/recipes/dependent-queries","fr/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Annulation","/fr/recipes/cancel-token","fr/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"Hydratation SSR","/fr/recipes/ssr-hydration","fr/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Gestion des erreurs","/fr/recipes/error-handling","fr/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Tests","/fr/recipes/testing","fr/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Prefetch au Niveau des Routes","/fr/recipes/prefetch","fr/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"Référence de l'API","i-lucide-file-code","/fr/api-reference","fr/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/fr/api-reference/qora-client","fr/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/fr/api-reference/qora-key","fr/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/fr/api-reference/qora-state","fr/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/fr/api-reference/qora-options","fr/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/fr/api-reference/qora-client-config","fr/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"API Mutation","/fr/api-reference/qora-mutation","fr/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/fr/api-reference/persist-qora-client","fr/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Requête infinie","/fr/api-reference/infinite-query","fr/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"Outils de debug","i-lucide-bug","/fr/devtools","fr/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Vue d'ensemble","/fr/devtools/overview","fr/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"Overlay intégré","/fr/devtools/overlay","fr/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Sérialisation des données","/fr/devtools/data-display","fr/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Intégrations tierces","i-lucide-puzzle","/fr/third-party","fr/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"Avec Provider","/fr/third-party/with-provider","fr/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"Avec BLoC","/fr/third-party/with-bloc","fr/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"Avec Riverpod","/fr/third-party/with-riverpod","fr/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"Avec RxDart","/fr/third-party/with-rxdart","fr/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"Avec Dio","/fr/third-party/with-dio","fr/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"Avec GraphQL","/fr/third-party/with-graphql","fr/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Exemples","/fr/examples","fr/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Étude de cas : Liste et détail utilisateur","/fr/examples/basic-query","fr/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Étude de cas : Mutations optimistes et rollback","/fr/examples/mutations-optimistic","fr/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Étude de cas : Feed à défilement infini","/fr/examples/infinite-scroll","fr/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Étude de cas : Application Todo offline-first","/fr/examples/offline-first","fr/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Étude de cas : Conscience réseau","/fr/examples/network-awareness","fr/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Étude de cas : Intégration des hooks","/fr/examples/hooks-integration","fr/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Étude de cas : Application Todo complète","/fr/examples/complete-todo-app","fr/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Aide","i-lucide-life-buoy","/fr/help","fr/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/fr/help/faq","fr/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Dépannage","/fr/help/troubleshooting","fr/09.help/2.troubleshooting",{"id":343,"title":25,"body":344,"description":1173,"extension":1174,"links":1175,"meta":1176,"navigation":1177,"path":26,"seo":1178,"stem":27,"__hash__":1181},"docs_fr/fr/01.getting-started/5.comparison.md",{"type":345,"value":346,"toc":1160},"minimark",[347,360,363,366,371,522,524,528,533,536,590,919,923,930,934,945,949,955,1042,1044,1050,1065,1067,1071,1074,1120,1123,1127,1129,1133,1156],[348,349,350,351,355,356,359],"p",{},"Qora, ",[352,353,354],"code",{},"flutter_query"," et ",[352,357,358],{},"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.",[348,361,362],{},"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.",[364,365],"hr",{},[367,368,370],"h2",{"id":369},"critères-de-sélection","Critères de sélection",[372,373,374,387],"table",{},[375,376,377],"thead",{},[378,379,380,384],"tr",{},[381,382,383],"th",{},"Si vous avez besoin de...",[381,385,386],{},"Meilleur choix",[388,389,390,399,410,423,432,441,450,463,475,484,493,504,513],"tbody",{},[378,391,392,396],{},[393,394,395],"td",{},"Un cache SWR solide avec un minimum de configuration",[393,397,398],{},"Les trois",[378,400,401,404],{},[393,402,403],{},"Des écritures faites hors-ligne, mises en file et rejouées",[393,405,406],{},[407,408,409],"strong",{},"Qora",[378,411,412,419],{},[393,413,414,415,418],{},"Des requêtes qui se mettent en pause hors-ligne (",[352,416,417],{},"FetchStatus.paused",")",[393,420,421],{},[407,422,409],{},[378,424,425,428],{},[393,426,427],{},"Un mode réseau par requête (online / always / offlineFirst)",[393,429,430],{},[407,431,409],{},[378,433,434,437],{},[393,435,436],{},"Le contrôle du thundering herd à la reconnexion",[393,438,439],{},[407,440,409],{},[378,442,443,446],{},[393,444,445],{},"L'invalidation par tags",[393,447,448],{},[407,449,409],{},[378,451,452,455],{},[393,453,454],{},"La persistance disque avec un adaptateur prêt à l'emploi",[393,456,457,459,460,418],{},[407,458,358],{}," (",[352,461,462],{},"cached_storage",[378,464,465,468],{},[393,466,467],{},"La persistance disque sur votre propre backend de stockage",[393,469,470,472,473],{},[407,471,409],{}," ou ",[407,474,358],{},[378,476,477,480],{},[393,478,479],{},"Une API 100 % hooks, la plus proche de TanStack Query sur le web",[393,481,482],{},[407,483,354],{},[378,485,486,489],{},[393,487,488],{},"Hooks ou widgets builders, au choix",[393,490,491],{},[407,492,409],{},[378,494,495,498],{},[393,496,497],{},"Un noyau Dart pur utilisable hors Flutter",[393,499,500,472,502],{},[407,501,409],{},[407,503,358],{},[378,505,506,509],{},[393,507,508],{},"Un onglet dans Flutter DevTools aujourd'hui",[393,510,511],{},[407,512,358],{},[378,514,515,518],{},[393,516,517],{},"Un overlay de debug dans l'application",[393,519,520],{},[407,521,409],{},[364,523],{},[367,525,527],{"id":526},"différenciateurs-de-qora","Différenciateurs de Qora",[529,530,532],"h3",{"id":531},"architecture-hors-ligne","Architecture hors-ligne",[348,534,535],{},"Le hors-ligne dans Qora est un ensemble de briques qui coopèrent, pas un simple flag de refetch à la reconnexion :",[537,538,539,561,567,582],"ul",{},[540,541,542,548,549,552,553,556,557,560],"li",{},[407,543,544,547],{},[352,545,546],{},"NetworkMode"," par requête"," : déclarer si une requête s'exécute uniquement ",[352,550,551],{},"online",", ",[352,554,555],{},"always"," (base locale) ou ",[352,558,559],{},"offlineFirst"," (servir le cache, rafraîchir en arrière-plan une fois en ligne).",[540,562,563,566],{},[407,564,565],{},"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.",[540,568,569,574,575,578,579,581],{},[407,570,571],{},[352,572,573],{},"FetchStatus"," : un enum sur un second axe (",[352,576,577],{},"fetching / paused / idle",") émis indépendamment de ",[352,580,211],{},", qui permet à l'UI de distinguer « pas de réseau » de « chargement ».",[540,583,584,589],{},[407,585,586],{},[352,587,588],{},"ReconnectStrategy"," : limite le thundering herd à la reconnexion avec un nombre maximal de refetchs simultanés et un jitter aléatoire entre les lots.",[591,592,598],"pre",{"className":593,"code":594,"filename":595,"language":596,"meta":597,"style":597},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: const QoraOptions(networkMode: NetworkMode.offlineFirst),\n  builder: (context, state, fetchStatus) {\n    if (fetchStatus == FetchStatus.paused) {\n      return OfflineBanner(staleData: state.dataOrNull);\n    }\n    return switch (state) {\n      Success(:final data) => UserCard(data),\n      Loading() => const CircularProgressIndicator(),\n      Failure(:final error) => ErrorWidget('$error'),\n      Initial() => const SizedBox.shrink(),\n    };\n  },\n)\n","user_screen.dart","dart","",[352,599,600,618,644,673,703,724,745,769,775,787,814,835,873,897,905,913],{"__ignoreMap":597},[601,602,605,608,612,615],"span",{"class":603,"line":604},"line",1,[601,606,108],{"class":607},"sBMFI",[601,609,611],{"class":610},"sTEyZ","\u003C",[601,613,614],{"class":607},"User",[601,616,617],{"class":610},">(\n",[601,619,621,624,628,631,635,638,641],{"class":603,"line":620},2,[601,622,623],{"class":610},"  queryKey",[601,625,627],{"class":626},"sMK4o",":",[601,629,630],{"class":610}," [",[601,632,634],{"class":633},"sfazB","'users'",[601,636,637],{"class":626},",",[601,639,640],{"class":610}," userId]",[601,642,643],{"class":626},",\n",[601,645,647,650,652,655,658,661,664,668,671],{"class":603,"line":646},3,[601,648,649],{"class":610},"  fetcher",[601,651,627],{"class":626},[601,653,654],{"class":610}," () ",[601,656,657],{"class":626},"=>",[601,659,660],{"class":610}," api",[601,662,663],{"class":626},".",[601,665,667],{"class":666},"s2Zo4","getUser",[601,669,670],{"class":610},"(userId)",[601,672,643],{"class":626},[601,674,676,679,681,685,688,691,693,696,698,701],{"class":603,"line":675},4,[601,677,678],{"class":610},"  options",[601,680,627],{"class":626},[601,682,684],{"class":683},"spNyl"," const",[601,686,687],{"class":607}," QoraOptions",[601,689,690],{"class":610},"(networkMode",[601,692,627],{"class":626},[601,694,695],{"class":607}," NetworkMode",[601,697,663],{"class":626},[601,699,700],{"class":610},"offlineFirst)",[601,702,643],{"class":626},[601,704,706,709,711,714,716,719,721],{"class":603,"line":705},5,[601,707,708],{"class":610},"  builder",[601,710,627],{"class":626},[601,712,713],{"class":610}," (context",[601,715,637],{"class":626},[601,717,718],{"class":610}," state",[601,720,637],{"class":626},[601,722,723],{"class":610}," fetchStatus) {\n",[601,725,727,731,734,737,740,742],{"class":603,"line":726},6,[601,728,730],{"class":729},"s7zQu","    if",[601,732,733],{"class":610}," (fetchStatus ",[601,735,736],{"class":626},"==",[601,738,739],{"class":607}," FetchStatus",[601,741,663],{"class":626},[601,743,744],{"class":610},"paused) {\n",[601,746,748,751,754,757,759,761,763,766],{"class":603,"line":747},7,[601,749,750],{"class":729},"      return",[601,752,753],{"class":607}," OfflineBanner",[601,755,756],{"class":610},"(staleData",[601,758,627],{"class":626},[601,760,718],{"class":610},[601,762,663],{"class":626},[601,764,765],{"class":610},"dataOrNull)",[601,767,768],{"class":626},";\n",[601,770,772],{"class":603,"line":771},8,[601,773,774],{"class":610},"    }\n",[601,776,778,781,784],{"class":603,"line":777},9,[601,779,780],{"class":729},"    return",[601,782,783],{"class":729}," switch",[601,785,786],{"class":610}," (state) {\n",[601,788,790,793,796,798,801,804,806,809,812],{"class":603,"line":789},10,[601,791,792],{"class":607},"      Success",[601,794,795],{"class":610},"(",[601,797,627],{"class":626},[601,799,800],{"class":683},"final",[601,802,803],{"class":610}," data) ",[601,805,657],{"class":626},[601,807,808],{"class":607}," UserCard",[601,810,811],{"class":610},"(data)",[601,813,643],{"class":626},[601,815,817,820,823,825,827,830,833],{"class":603,"line":816},11,[601,818,819],{"class":607},"      Loading",[601,821,822],{"class":610},"() ",[601,824,657],{"class":626},[601,826,684],{"class":683},[601,828,829],{"class":607}," CircularProgressIndicator",[601,831,832],{"class":610},"()",[601,834,643],{"class":626},[601,836,838,841,843,845,847,850,852,855,857,860,863,867,869,871],{"class":603,"line":837},12,[601,839,840],{"class":607},"      Failure",[601,842,795],{"class":610},[601,844,627],{"class":626},[601,846,800],{"class":683},[601,848,849],{"class":610}," error) ",[601,851,657],{"class":626},[601,853,854],{"class":607}," ErrorWidget",[601,856,795],{"class":610},[601,858,859],{"class":633},"'",[601,861,862],{"class":610},"$",[601,864,866],{"class":865},"sHdIc","error",[601,868,859],{"class":633},[601,870,418],{"class":610},[601,872,643],{"class":626},[601,874,876,879,881,883,885,888,890,893,895],{"class":603,"line":875},13,[601,877,878],{"class":607},"      Initial",[601,880,822],{"class":610},[601,882,657],{"class":626},[601,884,684],{"class":683},[601,886,887],{"class":607}," SizedBox",[601,889,663],{"class":626},[601,891,892],{"class":666},"shrink",[601,894,832],{"class":610},[601,896,643],{"class":626},[601,898,900,903],{"class":603,"line":899},14,[601,901,902],{"class":610},"    }",[601,904,768],{"class":626},[601,906,908,911],{"class":603,"line":907},15,[601,909,910],{"class":610},"  }",[601,912,643],{"class":626},[601,914,916],{"class":603,"line":915},16,[601,917,918],{"class":610},")\n",[529,920,922],{"id":921},"devtools","DevTools",[348,924,925,926,929],{},"L'overlay de Qora (",[352,927,928],{},"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.",[529,931,933],{"id":932},"noyau-dart-pur","Noyau Dart pur",[348,935,936,937,940,941,944],{},"Le package ",[352,938,939],{},"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. ",[352,942,943],{},"qora_flutter"," est une couche de liaison de widgets opt-in mince au-dessus.",[529,946,948],{"id":947},"invalidation-avancée","Invalidation avancée",[348,950,951,954],{},[352,952,953],{},"invalidateQueries({required QueryFilter filter})"," invalide par état, options de dernière utilisation ou toute combinaison, pas seulement par préfixe de clé :",[591,956,959],{"className":593,"code":957,"filename":958,"language":596,"meta":597,"style":597},"// Invalider toutes les requêtes en mode online qui n'ont pas encore réussi\nclient.invalidateQueries(\n  filter: (key, state, opts) =>\n      opts?.networkMode == NetworkMode.online && state is! Success,\n);\n","main.dart",[352,960,961,967,980,1002,1036],{"__ignoreMap":597},[601,962,963],{"class":603,"line":604},[601,964,966],{"class":965},"sHwdD","// Invalider toutes les requêtes en mode online qui n'ont pas encore réussi\n",[601,968,969,972,974,977],{"class":603,"line":620},[601,970,971],{"class":610},"client",[601,973,663],{"class":626},[601,975,976],{"class":666},"invalidateQueries",[601,978,979],{"class":610},"(\n",[601,981,982,985,987,990,992,994,996,999],{"class":603,"line":646},[601,983,984],{"class":610},"  filter",[601,986,627],{"class":626},[601,988,989],{"class":610}," (key",[601,991,637],{"class":626},[601,993,718],{"class":610},[601,995,637],{"class":626},[601,997,998],{"class":610}," opts) ",[601,1000,1001],{"class":626},"=>\n",[601,1003,1004,1007,1010,1013,1015,1017,1019,1022,1025,1028,1031,1034],{"class":603,"line":675},[601,1005,1006],{"class":610},"      opts",[601,1008,1009],{"class":626},"?.",[601,1011,1012],{"class":610},"networkMode ",[601,1014,736],{"class":626},[601,1016,695],{"class":607},[601,1018,663],{"class":626},[601,1020,1021],{"class":610},"online ",[601,1023,1024],{"class":626},"&&",[601,1026,1027],{"class":610}," state ",[601,1029,1030],{"class":626},"is!",[601,1032,1033],{"class":607}," Success",[601,1035,643],{"class":626},[601,1037,1038,1040],{"class":603,"line":705},[601,1039,418],{"class":610},[601,1041,768],{"class":626},[364,1043],{},[367,1045,1047,1049],{"id":1046},"cached_query-persistance-prête-à-lemploi",[352,1048,358],{}," : persistance prête à l'emploi",[348,1051,1052,1054,1055,1057,1058,1060,1061,1064],{},[352,1053,358],{}," fournit ",[352,1056,462],{},", une implémentation de stockage basée sur sqflite maintenue avec la bibliothèque, ainsi qu'une extension Flutter DevTools. Le ",[352,1059,229],{}," de Qora couvre le même besoin via l'interface ",[352,1062,1063],{},"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.",[364,1066],{},[367,1068,1070],{"id":1069},"complémentarité-avec-bloc-et-riverpod","Complémentarité avec BLoC et Riverpod",[348,1072,1073],{},"Qora, BLoC et Riverpod adressent des préoccupations différentes et sont conçus pour être utilisés ensemble :",[372,1075,1076,1086],{},[375,1077,1078],{},[378,1079,1080,1083],{},[381,1081,1082],{},"Couche",[381,1084,1085],{},"Outil approprié",[388,1087,1088,1097,1107],{},[378,1089,1090,1093],{},[393,1091,1092],{},"Données résidant sur un serveur (requêtes, mutations, pagination)",[393,1094,1095],{},[407,1096,409],{},[378,1098,1099,1102],{},[393,1100,1101],{},"Machines d'état UI complexes (tunnels de paiement, formulaires multi-étapes)",[393,1103,1104],{},[407,1105,1106],{},"BLoC",[378,1108,1109,1112],{},[393,1110,1111],{},"State client et DI (thème, session d'authentification, graphe de services)",[393,1113,1114,472,1117],{},[407,1115,1116],{},"Riverpod",[407,1118,1119],{},"Provider",[348,1121,1122],{},"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.",[1124,1125,1126],"tip",{},"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.",[364,1128],{},[367,1130,1132],{"id":1131},"liens-connexes","Liens connexes",[537,1134,1135,1141,1146,1151],{},[540,1136,1137],{},[1138,1139,264],"a",{"href":1140},"../third-party/with-provider",[540,1142,1143],{},[1138,1144,269],{"href":1145},"../third-party/with-bloc",[540,1147,1148],{},[1138,1149,273],{"href":1150},"../third-party/with-riverpod",[540,1152,1153],{},[1138,1154,16],{"href":1155},"./installation",[1157,1158,1159],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":597,"searchDepth":620,"depth":620,"links":1161},[1162,1163,1169,1171,1172],{"id":369,"depth":620,"text":370},{"id":526,"depth":620,"text":527,"children":1164},[1165,1166,1167,1168],{"id":531,"depth":646,"text":532},{"id":921,"depth":646,"text":922},{"id":932,"depth":646,"text":933},{"id":947,"depth":646,"text":948},{"id":1046,"depth":620,"text":1170},"cached_query : persistance prête à l'emploi",{"id":1069,"depth":620,"text":1070},{"id":1131,"depth":620,"text":1132},"Comment Qora se compare à flutter_query et cached_query, les autres bibliothèques de state serveur pour Flutter.","md",null,{},{"icon":28},{"title":1179,"description":1180},"Qora vs flutter_query vs cached_query, comparaison du state serveur","Comparaison des fonctionnalités entre Qora, flutter_query et cached_query sur le cache, le support hors-ligne, les DevTools et la pagination.","mvkKJ_xazFJd7h9kYsMeJuDFCHs5Iev6zKqzePc7jZI",[1183,1185],{"title":21,"path":22,"stem":23,"description":1184,"icon":6,"children":-1},"Construire un écran liste et un écran détail avec Qora, voir le cache travailler, puis passer l'application hors-ligne.",{"title":30,"path":31,"stem":32,"description":1186,"icon":33,"children":-1},"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.",1794040405000]