[{"data":1,"prerenderedAt":1296},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-getting-started-what-is-qora":342,"-fr-getting-started-what-is-qora-surround":1293},[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":11,"body":344,"description":1284,"extension":1285,"links":1286,"meta":1287,"navigation":1288,"path":12,"seo":1289,"stem":13,"__hash__":1292},"docs_fr/fr/01.getting-started/2.what-is-qora.md",{"type":345,"value":346,"toc":1275},"minimark",[347,355,366,371,374,707,710,961,972,976,981,997,1002,1019,1024,1043,1048,1053,1057,1161,1165,1181,1185,1207,1222,1226,1246,1250,1271],[348,349,350,354],"p",{},[351,352,353],"strong",{},"Qora"," est une bibliothèque de state serveur pour Flutter et Dart. Elle récupère, met en cache et synchronise les données que votre application charge depuis une API, et garde l'application utilisable quand le réseau ne l'est pas.",[348,356,357,358,365],{},"Si vous connaissez ",[359,360,364],"a",{"href":361,"rel":362},"https://tanstack.com/query",[363],"nofollow","TanStack Query",", vous connaissez déjà le modèle : les données serveur sont un cache avec un cycle de vie, pas un state global d'UI. Qora apporte ce modèle à Dart 3 avec les sealed classes et le pattern matching, sans génération de code.",[367,368,370],"h2",{"id":369},"le-problème-résolu","Le problème résolu",[348,372,373],{},"Une donnée qui vient d'un serveur n'est pas un compteur ni un champ de formulaire. Elle peut être périmée, elle est partagée entre plusieurs écrans, elle change quand quelqu'un écrit dessus, et elle disparaît avec le réseau. Gérée à la main, chaque écran finit avec le même code :",[375,376,382],"pre",{"className":377,"code":378,"filename":379,"language":380,"meta":381,"style":381},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class _UserScreenState extends State\u003CUserScreen> {\n  User? _user;\n  Object? _error;\n  bool _loading = false;\n\n  @override\n  void initState() {\n    super.initState();\n    _load();\n  }\n\n  Future\u003Cvoid> _load() async {\n    setState(() => _loading = true);\n    try {\n      _user = await api.getUser(widget.userId); // re-téléchargé à chaque visite\n      _error = null;\n    } catch (e) {\n      _error = e; // et l'utilisateur précédent est perdu en cas d'erreur\n    } finally {\n      setState(() => _loading = false);\n    }\n  }\n  // ...et rien ne rafraîchit cet écran quand un autre modifie l'utilisateur.\n}\n","without_qora.dart","dart","",[383,384,385,414,429,442,457,464,471,484,501,511,517,522,549,573,581,615,626,638,653,663,684,690,695,701],"code",{"__ignoreMap":381},[386,387,390,394,398,401,404,408,411],"span",{"class":388,"line":389},"line",1,[386,391,393],{"class":392},"sMK4o","class",[386,395,397],{"class":396},"sBMFI"," _UserScreenState",[386,399,400],{"class":392}," extends",[386,402,403],{"class":396}," State",[386,405,407],{"class":406},"sTEyZ","\u003C",[386,409,410],{"class":396},"UserScreen",[386,412,413],{"class":406},"> {\n",[386,415,417,420,423,426],{"class":388,"line":416},2,[386,418,419],{"class":396},"  User",[386,421,422],{"class":392},"?",[386,424,425],{"class":406}," _user",[386,427,428],{"class":392},";\n",[386,430,432,435,437,440],{"class":388,"line":431},3,[386,433,434],{"class":396},"  Object",[386,436,422],{"class":392},[386,438,439],{"class":406}," _error",[386,441,428],{"class":392},[386,443,445,448,451,454],{"class":388,"line":444},4,[386,446,447],{"class":396},"  bool",[386,449,450],{"class":406}," _loading ",[386,452,453],{"class":392},"=",[386,455,456],{"class":392}," false;\n",[386,458,460],{"class":388,"line":459},5,[386,461,463],{"emptyLinePlaceholder":462},true,"\n",[386,465,467],{"class":388,"line":466},6,[386,468,470],{"class":469},"spNyl","  @override\n",[386,472,474,477,481],{"class":388,"line":473},7,[386,475,476],{"class":469},"  void",[386,478,480],{"class":479},"s2Zo4"," initState",[386,482,483],{"class":406},"() {\n",[386,485,487,490,493,496,499],{"class":388,"line":486},8,[386,488,489],{"class":406},"    super",[386,491,492],{"class":392},".",[386,494,495],{"class":479},"initState",[386,497,498],{"class":406},"()",[386,500,428],{"class":392},[386,502,504,507,509],{"class":388,"line":503},9,[386,505,506],{"class":479},"    _load",[386,508,498],{"class":406},[386,510,428],{"class":392},[386,512,514],{"class":388,"line":513},10,[386,515,516],{"class":406},"  }\n",[386,518,520],{"class":388,"line":519},11,[386,521,463],{"emptyLinePlaceholder":462},[386,523,525,528,530,533,536,539,542,546],{"class":388,"line":524},12,[386,526,527],{"class":396},"  Future",[386,529,407],{"class":406},[386,531,532],{"class":469},"void",[386,534,535],{"class":406},"> ",[386,537,538],{"class":479},"_load",[386,540,541],{"class":406},"() ",[386,543,545],{"class":544},"s7zQu","async",[386,547,548],{"class":406}," {\n",[386,550,552,555,558,561,563,565,568,571],{"class":388,"line":551},13,[386,553,554],{"class":479},"    setState",[386,556,557],{"class":406},"(() ",[386,559,560],{"class":392},"=>",[386,562,450],{"class":406},[386,564,453],{"class":392},[386,566,567],{"class":392}," true",[386,569,570],{"class":406},")",[386,572,428],{"class":392},[386,574,576,579],{"class":388,"line":575},14,[386,577,578],{"class":544},"    try",[386,580,548],{"class":406},[386,582,584,587,589,592,595,597,600,603,605,608,611],{"class":388,"line":583},15,[386,585,586],{"class":406},"      _user ",[386,588,453],{"class":392},[386,590,591],{"class":544}," await",[386,593,594],{"class":406}," api",[386,596,492],{"class":392},[386,598,599],{"class":479},"getUser",[386,601,602],{"class":406},"(widget",[386,604,492],{"class":392},[386,606,607],{"class":406},"userId)",[386,609,610],{"class":392},";",[386,612,614],{"class":613},"sHwdD"," // re-téléchargé à chaque visite\n",[386,616,618,621,623],{"class":388,"line":617},16,[386,619,620],{"class":406},"      _error ",[386,622,453],{"class":392},[386,624,625],{"class":392}," null;\n",[386,627,629,632,635],{"class":388,"line":628},17,[386,630,631],{"class":406},"    } ",[386,633,634],{"class":544},"catch",[386,636,637],{"class":406}," (e) {\n",[386,639,641,643,645,648,650],{"class":388,"line":640},18,[386,642,620],{"class":406},[386,644,453],{"class":392},[386,646,647],{"class":406}," e",[386,649,610],{"class":392},[386,651,652],{"class":613}," // et l'utilisateur précédent est perdu en cas d'erreur\n",[386,654,656,658,661],{"class":388,"line":655},19,[386,657,631],{"class":406},[386,659,660],{"class":544},"finally",[386,662,548],{"class":406},[386,664,666,669,671,673,675,677,680,682],{"class":388,"line":665},20,[386,667,668],{"class":479},"      setState",[386,670,557],{"class":406},[386,672,560],{"class":392},[386,674,450],{"class":406},[386,676,453],{"class":392},[386,678,679],{"class":392}," false",[386,681,570],{"class":406},[386,683,428],{"class":392},[386,685,687],{"class":388,"line":686},21,[386,688,689],{"class":406},"    }\n",[386,691,693],{"class":388,"line":692},22,[386,694,516],{"class":406},[386,696,698],{"class":388,"line":697},23,[386,699,700],{"class":613},"  // ...et rien ne rafraîchit cet écran quand un autre modifie l'utilisateur.\n",[386,702,704],{"class":388,"line":703},24,[386,705,706],{"class":406},"}\n",[348,708,709],{},"Avec Qora, l'écran déclare de quelles données il a besoin et comment afficher chaque état :",[375,711,714],{"className":377,"code":712,"filename":713,"language":380,"meta":381,"style":381},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  builder: (context, state, fetchStatus) => switch (state) {\n    Success(:final data) => UserCard(data),\n    Failure(:final error, :final previousData) =>\n      previousData != null ? UserCard(previousData) : ErrorView(error),\n    Loading(:final previousData) =>\n      previousData != null ? UserCard(previousData) : const LoadingView(),\n    Initial() => const SizedBox.shrink(),\n  },\n)\n","user_screen.dart",[383,715,716,728,752,775,803,829,856,885,900,926,949,956],{"__ignoreMap":381},[386,717,718,720,722,725],{"class":388,"line":389},[386,719,108],{"class":396},[386,721,407],{"class":406},[386,723,724],{"class":396},"User",[386,726,727],{"class":406},">(\n",[386,729,730,733,736,739,743,746,749],{"class":388,"line":416},[386,731,732],{"class":406},"  queryKey",[386,734,735],{"class":392},":",[386,737,738],{"class":406}," [",[386,740,742],{"class":741},"sfazB","'users'",[386,744,745],{"class":392},",",[386,747,748],{"class":406}," userId]",[386,750,751],{"class":392},",\n",[386,753,754,757,759,762,764,766,768,770,773],{"class":388,"line":431},[386,755,756],{"class":406},"  fetcher",[386,758,735],{"class":392},[386,760,761],{"class":406}," () ",[386,763,560],{"class":392},[386,765,594],{"class":406},[386,767,492],{"class":392},[386,769,599],{"class":479},[386,771,772],{"class":406},"(userId)",[386,774,751],{"class":392},[386,776,777,780,782,785,787,790,792,795,797,800],{"class":388,"line":444},[386,778,779],{"class":406},"  builder",[386,781,735],{"class":392},[386,783,784],{"class":406}," (context",[386,786,745],{"class":392},[386,788,789],{"class":406}," state",[386,791,745],{"class":392},[386,793,794],{"class":406}," fetchStatus) ",[386,796,560],{"class":392},[386,798,799],{"class":544}," switch",[386,801,802],{"class":406}," (state) {\n",[386,804,805,808,811,813,816,819,821,824,827],{"class":388,"line":459},[386,806,807],{"class":396},"    Success",[386,809,810],{"class":406},"(",[386,812,735],{"class":392},[386,814,815],{"class":469},"final",[386,817,818],{"class":406}," data) ",[386,820,560],{"class":392},[386,822,823],{"class":396}," UserCard",[386,825,826],{"class":406},"(data)",[386,828,751],{"class":392},[386,830,831,834,836,838,840,843,845,848,850,853],{"class":388,"line":466},[386,832,833],{"class":396},"    Failure",[386,835,810],{"class":406},[386,837,735],{"class":392},[386,839,815],{"class":469},[386,841,842],{"class":406}," error",[386,844,745],{"class":392},[386,846,847],{"class":392}," :",[386,849,815],{"class":469},[386,851,852],{"class":406}," previousData) ",[386,854,855],{"class":392},"=>\n",[386,857,858,861,864,867,870,872,875,877,880,883],{"class":388,"line":473},[386,859,860],{"class":406},"      previousData ",[386,862,863],{"class":392},"!=",[386,865,866],{"class":392}," null",[386,868,869],{"class":392}," ?",[386,871,823],{"class":396},[386,873,874],{"class":406},"(previousData) ",[386,876,735],{"class":392},[386,878,879],{"class":396}," ErrorView",[386,881,882],{"class":406},"(error)",[386,884,751],{"class":392},[386,886,887,890,892,894,896,898],{"class":388,"line":486},[386,888,889],{"class":396},"    Loading",[386,891,810],{"class":406},[386,893,735],{"class":392},[386,895,815],{"class":469},[386,897,852],{"class":406},[386,899,855],{"class":392},[386,901,902,904,906,908,910,912,914,916,919,922,924],{"class":388,"line":503},[386,903,860],{"class":406},[386,905,863],{"class":392},[386,907,866],{"class":392},[386,909,869],{"class":392},[386,911,823],{"class":396},[386,913,874],{"class":406},[386,915,735],{"class":392},[386,917,918],{"class":469}," const",[386,920,921],{"class":396}," LoadingView",[386,923,498],{"class":406},[386,925,751],{"class":392},[386,927,928,931,933,935,937,940,942,945,947],{"class":388,"line":513},[386,929,930],{"class":396},"    Initial",[386,932,541],{"class":406},[386,934,560],{"class":392},[386,936,918],{"class":469},[386,938,939],{"class":396}," SizedBox",[386,941,492],{"class":392},[386,943,944],{"class":479},"shrink",[386,946,498],{"class":406},[386,948,751],{"class":392},[386,950,951,954],{"class":388,"line":519},[386,952,953],{"class":406},"  }",[386,955,751],{"class":392},[386,957,958],{"class":388,"line":524},[386,959,960],{"class":406},")\n",[348,962,963,964,967,968,971],{},"À la deuxième visite, l'utilisateur en cache s'affiche dès la première frame et se rafraîchit en arrière-plan. Deux widgets qui demandent ",[383,965,966],{},"['users', userId]"," partagent une seule requête. Après ",[383,969,970],{},"client.invalidate(['users', userId])",", chaque écran qui affiche cet utilisateur se met à jour. Le compilateur vérifie que chaque état est traité.",[367,973,975],{"id":974},"ce-que-vous-obtenez","Ce que vous obtenez",[348,977,978],{},[351,979,980],{},"Récupération et cache",[982,983,984,988,991,994],"ul",{},[985,986,987],"li",{},"Stale-while-revalidate : les données du cache d'abord, les données fraîches en arrière-plan",[985,989,990],{},"Déduplication des requêtes et retries automatiques avec backoff exponentiel",[985,992,993],{},"Invalidation par clé exacte, préfixe de clé, prédicat ou tag",[985,995,996],{},"Requêtes infinies, requêtes dépendantes, polling, prefetch",[348,998,999],{},[351,1000,1001],{},"Hors-ligne",[982,1003,1004,1009,1016],{},[985,1005,1006,1008],{},[383,1007,229],{}," : données du cache sauvegardées et restaurées avant la première frame",[985,1010,1011,1012,1015],{},"Des requêtes qui se mettent en pause hors-ligne, le signalent via ",[383,1013,1014],{},"FetchStatus.paused"," et reprennent à la reconnexion",[985,1017,1018],{},"Une file de mutations hors-ligne qui rejoue les écritures dans l'ordre au retour du réseau (en mémoire ; persistée entre deux redémarrages en 1.4)",[348,1020,1021],{},[351,1022,1023],{},"Écritures",[982,1025,1026,1040],{},[985,1027,1028,1029,1032,1033,1032,1036,1039],{},"Mutations avec ",[383,1030,1031],{},"onMutate"," / ",[383,1034,1035],{},"onError",[383,1037,1038],{},"onSuccess"," pour les mises à jour optimistes et le rollback",[985,1041,1042],{},"Invalidation automatique après une mutation réussie",[348,1044,1045],{},[351,1046,1047],{},"Outillage",[982,1049,1050],{},[985,1051,1052],{},"Un overlay DevTools dans l'application qui affiche chaque requête et chaque mutation en mode debug",[367,1054,1056],{"id":1055},"packages","Packages",[1058,1059,1060,1073],"table",{},[1061,1062,1063],"thead",{},[1064,1065,1066,1070],"tr",{},[1067,1068,1069],"th",{},"Package",[1067,1071,1072],{},"À utiliser pour",[1074,1075,1076,1104,1134,1147],"tbody",{},[1064,1077,1078,1088],{},[1079,1080,1081],"td",{},[359,1082,1085],{"href":1083,"rel":1084},"https://pub.dev/packages/qora_flutter",[363],[383,1086,1087],{},"qora_flutter",[1079,1089,1090,1091,1093,1094,1093,1096,1093,1098,1100,1101,492],{},"Les apps Flutter. Widgets (",[383,1092,103],{},", ",[383,1095,108],{},[383,1097,113],{},[383,1099,118],{},"), managers de cycle de vie et de connectivité. Inclut ",[383,1102,1103],{},"qora",[1064,1105,1106,1115],{},[1079,1107,1108],{},[359,1109,1112],{"href":1110,"rel":1111},"https://pub.dev/packages/qora_hooks",[363],[383,1113,1114],{},"qora_hooks",[1079,1116,1117,1118,1121,1122,1093,1125,1093,1128,1093,1131,492],{},"Les apps qui utilisent ",[383,1119,1120],{},"flutter_hooks"," : ",[383,1123,1124],{},"useQuery",[383,1126,1127],{},"useMutation",[383,1129,1130],{},"useInfiniteQuery",[383,1132,1133],{},"useFetchStatus",[1064,1135,1136,1144],{},[1079,1137,1138],{},[359,1139,1142],{"href":1140,"rel":1141},"https://pub.dev/packages/qora",[363],[383,1143,1103],{},[1079,1145,1146],{},"Dart pur : CLI, serveurs, packages partagés, tests. Aucune dépendance Flutter.",[1064,1148,1149,1158],{},[1079,1150,1151],{},[359,1152,1155],{"href":1153,"rel":1154},"https://pub.dev/packages/qora_devtools_overlay",[363],[383,1156,1157],{},"qora_devtools_overlay",[1079,1159,1160],{},"Le panneau de debug dans l'application, en dépendance de développement.",[367,1162,1164],{"id":1163},"state-serveur-et-state-client","State serveur et state client",[348,1166,1167,1168,1171,1172,1175,1176,1180],{},"Qora gère le ",[351,1169,1170],{},"state serveur"," : les données qui vivent sur un serveur et qui sont récupérées, mises en cache et resynchronisées. Il ne remplace pas votre state management pour le ",[351,1173,1174],{},"state client"," : l'onglet sélectionné, la saisie d'un formulaire, le thème. Gardez Riverpod, BLoC ou Provider pour cela ; les ",[359,1177,1179],{"href":1178},"../third-party/with-riverpod","guides d'intégration"," montrent comment les combiner.",[367,1182,1184],{"id":1183},"quand-ne-pas-utiliser-qora","Quand ne pas utiliser Qora",[982,1186,1187,1197],{},[985,1188,1189,1192,1193,1196],{},[351,1190,1191],{},"Une application en lecture seule, toujours en ligne, qui n'affiche jamais deux fois les mêmes données."," Un ",[383,1194,1195],{},"FutureBuilder"," suffit.",[985,1198,1199,1202,1203,1206],{},[351,1200,1201],{},"Des données temps réel poussées par une socket."," Vous pouvez écrire les événements de la socket dans le cache avec ",[383,1204,1205],{},"setQueryData",", mais le flux lui-même n'est pas le rôle de Qora.",[348,1208,1209,1210,1213,1214,1217,1218,492],{},"Pour une comparaison avec ",[383,1211,1212],{},"cached_query"," et ",[383,1215,1216],{},"flutter_query",", voir la ",[359,1219,1221],{"href":1220},"./comparison","page de comparaison",[367,1223,1225],{"id":1224},"prérequis","Prérequis",[982,1227,1228,1235],{},[985,1229,1230,1231,1234],{},"Dart ",[351,1232,1233],{},"3.5"," ou plus récent",[985,1236,1237,1238,1241,1242,1213,1244,570],{},"Flutter ",[351,1239,1240],{},"3.24"," ou plus récent (pour ",[383,1243,1087],{},[383,1245,1114],{},[367,1247,1249],{"id":1248},"étapes-suivantes","Étapes suivantes",[982,1251,1252,1258,1264],{},[985,1253,1254,1257],{},[359,1255,16],{"href":1256},"./installation"," : ajouter Qora et envelopper votre application",[985,1259,1260,1263],{},[359,1261,21],{"href":1262},"./quick-start"," : un écran liste et un écran détail, puis le passage hors-ligne",[985,1265,1266,1270],{},[359,1267,1269],{"href":1268},"./coming-from-tanstack-query","Venir de TanStack Query"," : l'API mise en correspondance option par option",[1272,1273,1274],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":381,"searchDepth":416,"depth":416,"links":1276},[1277,1278,1279,1280,1281,1282,1283],{"id":369,"depth":416,"text":370},{"id":974,"depth":416,"text":975},{"id":1055,"depth":416,"text":1056},{"id":1163,"depth":416,"text":1164},{"id":1183,"depth":416,"text":1184},{"id":1224,"depth":416,"text":1225},{"id":1248,"depth":416,"text":1249},"Qora récupère, met en cache et synchronise les données serveur dans Flutter et Dart, et garde votre application utilisable quand le réseau ne l'est pas.","md",null,{},{"icon":14},{"title":1290,"description":1291},"Qu'est-ce que Qora ? Le state serveur pour les apps Flutter qui fonctionnent hors-ligne","Qora récupère, met en cache et synchronise les données serveur dans Flutter et Dart. Données en cache dès la première frame, requêtes en pause hors-ligne, écritures mises en file et rejouées à la reconnexion.","v3kb6DVrhh6eHFTrH021eb02Y92fLjQxjWA6K9ahgWE",[1286,1294],{"title":16,"path":17,"stem":18,"description":1295,"icon":19,"children":-1},"Ajouter Qora à une application Flutter ou à un projet Dart pur, et le brancher avec un seul widget.",1794040404769]