[{"data":1,"prerenderedAt":1967},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-getting-started-migrating-from-other-libraries":342,"-fr-getting-started-migrating-from-other-libraries-surround":1962},[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":35,"body":344,"description":1955,"extension":1956,"links":1957,"meta":1958,"navigation":1959,"path":36,"seo":1960,"stem":37,"__hash__":1961},"docs_fr/fr/01.getting-started/7.migrating-from-other-libraries.md",{"type":345,"value":346,"toc":1941},"minimark",[347,370,380,385,391,506,509,513,530,535,719,743,747,756,1141,1144,1351,1353,1357,1372,1375,1599,1603,1609,1735,1739,1774,1776,1779,1789,1929,1937],[348,349,350,351,361,362,369],"p",{},"Ce guide fait correspondre les concepts de ",[352,353,357],"a",{"href":354,"rel":355},"https://pub.dev/packages/flutter_query",[356],"nofollow",[358,359,360],"code",{},"flutter_query"," et ",[352,363,366],{"href":364,"rel":365},"https://pub.dev/packages/cached_query",[356],[358,367,368],{},"cached_query"," à ceux de Qora. Les deux librairies sont solides ; le but n'est pas de les critiquer mais de rendre la migration prévisible.",[371,372,373,374,376,377,379],"note",{},"Les détails d'API des autres librairies ont été vérifiés sur ",[358,375,360],{}," 0.11 et ",[358,378,368],{}," 3.7. Sur une autre version, vérifiez les noms dans leur propre documentation.",[381,382,384],"h2",{"id":383},"migrer-progressivement","Migrer progressivement",[348,386,387,388,390],{},"Pas besoin de tout réécrire d'un coup. Un ",[358,389,103],{}," peut cohabiter avec un autre provider : vous pouvez migrer un écran ou une fonctionnalité à la fois.",[392,393,398],"pre",{"className":394,"code":395,"language":396,"meta":397,"style":397},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","void main() {\n  runApp(\n    QoraScope.auto(\n      client: QoraClient(),\n      child: const MyApp(), // les providers existants restent à l'intérieur\n    ),\n  );\n}\n","dart","",[358,399,400,417,426,442,460,483,491,500],{"__ignoreMap":397},[401,402,405,409,413],"span",{"class":403,"line":404},"line",1,[401,406,408],{"class":407},"spNyl","void",[401,410,412],{"class":411},"s2Zo4"," main",[401,414,416],{"class":415},"sTEyZ","() {\n",[401,418,420,423],{"class":403,"line":419},2,[401,421,422],{"class":411},"  runApp",[401,424,425],{"class":415},"(\n",[401,427,429,433,437,440],{"class":403,"line":428},3,[401,430,432],{"class":431},"sBMFI","    QoraScope",[401,434,436],{"class":435},"sMK4o",".",[401,438,439],{"class":411},"auto",[401,441,425],{"class":415},[401,443,445,448,451,454,457],{"class":403,"line":444},4,[401,446,447],{"class":415},"      client",[401,449,450],{"class":435},":",[401,452,453],{"class":431}," QoraClient",[401,455,456],{"class":415},"()",[401,458,459],{"class":435},",\n",[401,461,463,466,468,471,474,476,479],{"class":403,"line":462},5,[401,464,465],{"class":415},"      child",[401,467,450],{"class":435},[401,469,470],{"class":407}," const",[401,472,473],{"class":431}," MyApp",[401,475,456],{"class":415},[401,477,478],{"class":435},",",[401,480,482],{"class":481},"sHwdD"," // les providers existants restent à l'intérieur\n",[401,484,486,489],{"class":403,"line":485},6,[401,487,488],{"class":415},"    )",[401,490,459],{"class":435},[401,492,494,497],{"class":403,"line":493},7,[401,495,496],{"class":415},"  )",[401,498,499],{"class":435},";\n",[401,501,503],{"class":403,"line":502},8,[401,504,505],{"class":415},"}\n",[507,508],"hr",{},[381,510,512],{"id":511},"depuis-flutter_query","Depuis flutter_query",[348,514,515,517,518,521,522,529],{},[358,516,360],{}," repose sur des hooks (",[358,519,520],{},"flutter_hooks",") et suit TanStack Query de près. Le chemin le plus rapide est ",[352,523,526],{"href":524,"rel":525},"https://pub.dev/packages/qora_hooks",[356],[358,527,528],{},"qora_hooks",", qui garde le même style.",[531,532,534],"h3",{"id":533},"correspondance-des-concepts","Correspondance des concepts",[536,537,538,553],"table",{},[539,540,541],"thead",{},[542,543,544,548,550],"tr",{},[545,546,547],"th",{},"Concept",[545,549,360],{},[545,551,552],{},"Qora",[554,555,556,572,587,600,618,633,648,670,685,700],"tbody",{},[542,557,558,562,567],{},[559,560,561],"td",{},"Provider",[559,563,564],{},[358,565,566],{},"QueryClientProvider(client: QueryClient())",[559,568,569],{},[358,570,571],{},"QoraScope(client: QoraClient())",[542,573,574,577,582],{},[559,575,576],{},"Requête (hooks)",[559,578,579],{},[358,580,581],{},"useQuery(key, (context) => fn())",[559,583,584],{},[358,585,586],{},"useQuery(key: key, fetcher: fn)",[542,588,589,592,595],{},[559,590,591],{},"Requête (widget)",[559,593,594],{},"non fourni",[559,596,597],{},[358,598,599],{},"QoraBuilder\u003CT>",[542,601,602,605,610],{},[559,603,604],{},"Mutation",[559,606,607],{},[358,608,609],{},"useMutation((vars, context) => fn(vars))",[559,611,612,615,616],{},[358,613,614],{},"useMutation(mutator: fn)"," ou ",[358,617,113],{},[542,619,620,623,628],{},[559,621,622],{},"Fenêtre de fraîcheur",[559,624,625],{},[358,626,627],{},"staleDuration",[559,629,630],{},[358,631,632],{},"QoraOptions.staleTime",[542,634,635,638,643],{},[559,636,637],{},"Rétention du cache inactif",[559,639,640],{},[358,641,642],{},"gcDuration",[559,644,645],{},[358,646,647],{},"QoraOptions.gcTime",[542,649,650,653,662],{},[559,651,652],{},"Placeholder / seed",[559,654,655,658,659],{},[358,656,657],{},"placeholder",", ",[358,660,661],{},"seed",[559,663,664,658,667],{},[358,665,666],{},"placeholderData",[358,668,669],{},"initialData",[542,671,672,675,680],{},[559,673,674],{},"Invalider (préfixe, défaut)",[559,676,677],{},[358,678,679],{},"client.invalidateQueries(queryKey: ['todos'])",[559,681,682],{},[358,683,684],{},"client.invalidatePrefix(['todos'])",[542,686,687,690,695],{},[559,688,689],{},"Invalider (exact)",[559,691,692],{},[358,693,694],{},"invalidateQueries(queryKey: k, exact: true)",[559,696,697],{},[358,698,699],{},"client.invalidate(k)",[542,701,702,705,713],{},[559,703,704],{},"Lire / écrire le cache",[559,706,707,658,710],{},[358,708,709],{},"getQueryData",[358,711,712],{},"setQueryData",[559,714,715,658,717],{},[358,716,709],{},[358,718,712],{},[720,721,722,725,726,730,731,734,735,738,739,742],"warning",{},[358,723,724],{},"invalidateQueries"," de flutter_query matche ",[727,728,729],"strong",{},"par préfixe"," par défaut. ",[358,732,733],{},"invalidate(key)"," de Qora est ",[727,736,737],{},"exact",". Utilisez ",[358,740,741],{},"invalidatePrefix"," là où vous comptiez sur le comportement par défaut.",[531,744,746],{"id":745},"lire-létat","Lire l'état",[348,748,749,751,752,755],{},[358,750,360],{}," expose des booléens sur un objet résultat. Qora retourne un ",[358,753,754],{},"QoraState\u003CT>"," scellé : le compilateur vérifie que chaque cas est traité, et les données périmées restent disponibles pendant un refetch ou une erreur.",[392,757,759],{"className":394,"code":758,"language":396,"meta":397,"style":397},"// flutter_query\nfinal result = useQuery(const ['user'], (context) => api.getUser());\nif (result.isLoading) return const CircularProgressIndicator();\nif (result.isError) return Text('Error: ${result.error}');\nreturn UserCard(result.data!);\n\n// Qora (qora_hooks)\nfinal state = useQuery\u003CUser>(key: const ['user'], fetcher: api.getUser);\nreturn switch (state) {\n  Success(:final data) => UserCard(data),\n  Failure(:final error, :final previousData) =>\n    previousData != null ? UserCard(previousData) : Text('Error: $error'),\n  Loading(:final previousData) =>\n    previousData != null ? UserCard(previousData) : const CircularProgressIndicator(),\n  Initial() => const SizedBox.shrink(),\n};\n",[358,760,761,766,817,843,887,909,915,920,966,977,1001,1029,1068,1084,1109,1134],{"__ignoreMap":397},[401,762,763],{"class":403,"line":404},[401,764,765],{"class":481},"// flutter_query\n",[401,767,768,771,774,777,780,783,786,789,793,796,798,801,804,807,809,812,815],{"class":403,"line":419},[401,769,770],{"class":407},"final",[401,772,773],{"class":415}," result ",[401,775,776],{"class":435},"=",[401,778,779],{"class":411}," useQuery",[401,781,782],{"class":415},"(",[401,784,785],{"class":407},"const",[401,787,788],{"class":415}," [",[401,790,792],{"class":791},"sfazB","'user'",[401,794,795],{"class":415},"]",[401,797,478],{"class":435},[401,799,800],{"class":415}," (context) ",[401,802,803],{"class":435},"=>",[401,805,806],{"class":415}," api",[401,808,436],{"class":435},[401,810,811],{"class":411},"getUser",[401,813,814],{"class":415},"())",[401,816,499],{"class":435},[401,818,819,823,826,828,831,834,836,839,841],{"class":403,"line":428},[401,820,822],{"class":821},"s7zQu","if",[401,824,825],{"class":415}," (result",[401,827,436],{"class":435},[401,829,830],{"class":415},"isLoading) ",[401,832,833],{"class":821},"return",[401,835,470],{"class":407},[401,837,838],{"class":431}," CircularProgressIndicator",[401,840,456],{"class":415},[401,842,499],{"class":435},[401,844,845,847,849,851,854,856,859,861,864,867,871,873,876,879,882,885],{"class":403,"line":444},[401,846,822],{"class":821},[401,848,825],{"class":415},[401,850,436],{"class":435},[401,852,853],{"class":415},"isError) ",[401,855,833],{"class":821},[401,857,858],{"class":431}," Text",[401,860,782],{"class":415},[401,862,863],{"class":791},"'Error: ",[401,865,866],{"class":415},"${",[401,868,870],{"class":869},"sHdIc","result",[401,872,436],{"class":415},[401,874,875],{"class":869},"error",[401,877,878],{"class":415},"}",[401,880,881],{"class":791},"'",[401,883,884],{"class":415},")",[401,886,499],{"class":435},[401,888,889,891,894,897,899,902,905,907],{"class":403,"line":462},[401,890,833],{"class":821},[401,892,893],{"class":431}," UserCard",[401,895,896],{"class":415},"(result",[401,898,436],{"class":435},[401,900,901],{"class":415},"data",[401,903,904],{"class":435},"!",[401,906,884],{"class":415},[401,908,499],{"class":435},[401,910,911],{"class":403,"line":485},[401,912,914],{"emptyLinePlaceholder":913},true,"\n",[401,916,917],{"class":403,"line":493},[401,918,919],{"class":481},"// Qora (qora_hooks)\n",[401,921,922,924,927,929,931,934,937,940,942,944,946,948,950,952,955,957,959,961,964],{"class":403,"line":502},[401,923,770],{"class":407},[401,925,926],{"class":415}," state ",[401,928,776],{"class":435},[401,930,779],{"class":411},[401,932,933],{"class":415},"\u003C",[401,935,936],{"class":431},"User",[401,938,939],{"class":415},">(key",[401,941,450],{"class":435},[401,943,470],{"class":407},[401,945,788],{"class":415},[401,947,792],{"class":791},[401,949,795],{"class":415},[401,951,478],{"class":435},[401,953,954],{"class":415}," fetcher",[401,956,450],{"class":435},[401,958,806],{"class":415},[401,960,436],{"class":435},[401,962,963],{"class":415},"getUser)",[401,965,499],{"class":435},[401,967,969,971,974],{"class":403,"line":968},9,[401,970,833],{"class":821},[401,972,973],{"class":821}," switch",[401,975,976],{"class":415}," (state) {\n",[401,978,980,983,985,987,989,992,994,996,999],{"class":403,"line":979},10,[401,981,982],{"class":431},"  Success",[401,984,782],{"class":415},[401,986,450],{"class":435},[401,988,770],{"class":407},[401,990,991],{"class":415}," data) ",[401,993,803],{"class":435},[401,995,893],{"class":431},[401,997,998],{"class":415},"(data)",[401,1000,459],{"class":435},[401,1002,1004,1007,1009,1011,1013,1016,1018,1021,1023,1026],{"class":403,"line":1003},11,[401,1005,1006],{"class":431},"  Failure",[401,1008,782],{"class":415},[401,1010,450],{"class":435},[401,1012,770],{"class":407},[401,1014,1015],{"class":415}," error",[401,1017,478],{"class":435},[401,1019,1020],{"class":435}," :",[401,1022,770],{"class":407},[401,1024,1025],{"class":415}," previousData) ",[401,1027,1028],{"class":435},"=>\n",[401,1030,1032,1035,1038,1041,1044,1046,1049,1051,1053,1055,1057,1060,1062,1064,1066],{"class":403,"line":1031},12,[401,1033,1034],{"class":415},"    previousData ",[401,1036,1037],{"class":435},"!=",[401,1039,1040],{"class":435}," null",[401,1042,1043],{"class":435}," ?",[401,1045,893],{"class":431},[401,1047,1048],{"class":415},"(previousData) ",[401,1050,450],{"class":435},[401,1052,858],{"class":431},[401,1054,782],{"class":415},[401,1056,863],{"class":791},[401,1058,1059],{"class":415},"$",[401,1061,875],{"class":869},[401,1063,881],{"class":791},[401,1065,884],{"class":415},[401,1067,459],{"class":435},[401,1069,1071,1074,1076,1078,1080,1082],{"class":403,"line":1070},13,[401,1072,1073],{"class":431},"  Loading",[401,1075,782],{"class":415},[401,1077,450],{"class":435},[401,1079,770],{"class":407},[401,1081,1025],{"class":415},[401,1083,1028],{"class":435},[401,1085,1087,1089,1091,1093,1095,1097,1099,1101,1103,1105,1107],{"class":403,"line":1086},14,[401,1088,1034],{"class":415},[401,1090,1037],{"class":435},[401,1092,1040],{"class":435},[401,1094,1043],{"class":435},[401,1096,893],{"class":431},[401,1098,1048],{"class":415},[401,1100,450],{"class":435},[401,1102,470],{"class":407},[401,1104,838],{"class":431},[401,1106,456],{"class":415},[401,1108,459],{"class":435},[401,1110,1112,1115,1118,1120,1122,1125,1127,1130,1132],{"class":403,"line":1111},15,[401,1113,1114],{"class":431},"  Initial",[401,1116,1117],{"class":415},"() ",[401,1119,803],{"class":435},[401,1121,470],{"class":407},[401,1123,1124],{"class":431}," SizedBox",[401,1126,436],{"class":435},[401,1128,1129],{"class":411},"shrink",[401,1131,456],{"class":415},[401,1133,459],{"class":435},[401,1135,1137,1139],{"class":403,"line":1136},16,[401,1138,878],{"class":415},[401,1140,499],{"class":435},[531,1142,82],{"id":1143},"mutations-et-invalidation",[392,1145,1147],{"className":394,"code":1146,"language":396,"meta":397,"style":397},"// flutter_query\nfinal mutation = useMutation\u003CTodo, Exception, String, void>(\n  (title, context) => api.createTodo(title),\n  onSuccess: (data, variables, onMutateResult, context) {\n    // invalider ['todos'] via le QueryClient\n  },\n);\n\n// Qora : on déclare ce qu'il faut rafraîchir, sans callback manuel\nfinal mutation = useMutation\u003CTodo, String>(\n  mutator: api.createTodo,\n  options: const MutationOptions(invalidates: [['todos']]),\n);\nmutation.mutate('Buy milk');\n",[358,1148,1149,1153,1187,1211,1236,1241,1248,1254,1258,1263,1283,1298,1326,1332],{"__ignoreMap":397},[401,1150,1151],{"class":403,"line":404},[401,1152,765],{"class":481},[401,1154,1155,1157,1160,1162,1165,1167,1170,1172,1175,1177,1180,1182,1184],{"class":403,"line":419},[401,1156,770],{"class":407},[401,1158,1159],{"class":415}," mutation ",[401,1161,776],{"class":435},[401,1163,1164],{"class":411}," useMutation",[401,1166,933],{"class":415},[401,1168,1169],{"class":431},"Todo",[401,1171,658],{"class":415},[401,1173,1174],{"class":431},"Exception",[401,1176,658],{"class":415},[401,1178,1179],{"class":431},"String",[401,1181,658],{"class":415},[401,1183,408],{"class":407},[401,1185,1186],{"class":415},">(\n",[401,1188,1189,1192,1194,1197,1199,1201,1203,1206,1209],{"class":403,"line":428},[401,1190,1191],{"class":415},"  (title",[401,1193,478],{"class":435},[401,1195,1196],{"class":415}," context) ",[401,1198,803],{"class":435},[401,1200,806],{"class":415},[401,1202,436],{"class":435},[401,1204,1205],{"class":411},"createTodo",[401,1207,1208],{"class":415},"(title)",[401,1210,459],{"class":435},[401,1212,1213,1216,1218,1221,1223,1226,1228,1231,1233],{"class":403,"line":444},[401,1214,1215],{"class":415},"  onSuccess",[401,1217,450],{"class":435},[401,1219,1220],{"class":415}," (data",[401,1222,478],{"class":435},[401,1224,1225],{"class":415}," variables",[401,1227,478],{"class":435},[401,1229,1230],{"class":415}," onMutateResult",[401,1232,478],{"class":435},[401,1234,1235],{"class":415}," context) {\n",[401,1237,1238],{"class":403,"line":462},[401,1239,1240],{"class":481},"    // invalider ['todos'] via le QueryClient\n",[401,1242,1243,1246],{"class":403,"line":485},[401,1244,1245],{"class":415},"  }",[401,1247,459],{"class":435},[401,1249,1250,1252],{"class":403,"line":493},[401,1251,884],{"class":415},[401,1253,499],{"class":435},[401,1255,1256],{"class":403,"line":502},[401,1257,914],{"emptyLinePlaceholder":913},[401,1259,1260],{"class":403,"line":968},[401,1261,1262],{"class":481},"// Qora : on déclare ce qu'il faut rafraîchir, sans callback manuel\n",[401,1264,1265,1267,1269,1271,1273,1275,1277,1279,1281],{"class":403,"line":979},[401,1266,770],{"class":407},[401,1268,1159],{"class":415},[401,1270,776],{"class":435},[401,1272,1164],{"class":411},[401,1274,933],{"class":415},[401,1276,1169],{"class":431},[401,1278,658],{"class":415},[401,1280,1179],{"class":431},[401,1282,1186],{"class":415},[401,1284,1285,1288,1290,1292,1294,1296],{"class":403,"line":1003},[401,1286,1287],{"class":415},"  mutator",[401,1289,450],{"class":435},[401,1291,806],{"class":415},[401,1293,436],{"class":435},[401,1295,1205],{"class":415},[401,1297,459],{"class":435},[401,1299,1300,1303,1305,1307,1310,1313,1315,1318,1321,1324],{"class":403,"line":1031},[401,1301,1302],{"class":415},"  options",[401,1304,450],{"class":435},[401,1306,470],{"class":407},[401,1308,1309],{"class":431}," MutationOptions",[401,1311,1312],{"class":415},"(invalidates",[401,1314,450],{"class":435},[401,1316,1317],{"class":415}," [[",[401,1319,1320],{"class":791},"'todos'",[401,1322,1323],{"class":415},"]])",[401,1325,459],{"class":435},[401,1327,1328,1330],{"class":403,"line":1070},[401,1329,884],{"class":415},[401,1331,499],{"class":435},[401,1333,1334,1337,1339,1342,1344,1347,1349],{"class":403,"line":1086},[401,1335,1336],{"class":415},"mutation",[401,1338,436],{"class":435},[401,1340,1341],{"class":411},"mutate",[401,1343,782],{"class":415},[401,1345,1346],{"class":791},"'Buy milk'",[401,1348,884],{"class":415},[401,1350,499],{"class":435},[507,1352],{},[381,1354,1356],{"id":1355},"depuis-cached_query","Depuis cached_query",[348,1358,1359,1361,1362,1365,1366,1368,1369,436],{},[358,1360,368],{}," est orienté objet : on crée des instances ",[358,1363,1364],{},"Query"," / ",[358,1367,604],{}," (souvent dans un repository) et on écoute leurs streams, avec les widgets Flutter dans ",[358,1370,1371],{},"cached_query_flutter",[531,1373,534],{"id":1374},"correspondance-des-concepts-1",[536,1376,1377,1387],{},[539,1378,1379],{},[542,1380,1381,1383,1385],{},[545,1382,547],{},[545,1384,368],{},[545,1386,552],{},[554,1388,1389,1404,1419,1443,1458,1472,1488,1508,1528,1543,1563,1581],{},[542,1390,1391,1394,1399],{},[559,1392,1393],{},"Config globale",[559,1395,1396],{},[358,1397,1398],{},"CachedQuery.instance.config(...)",[559,1400,1401],{},[358,1402,1403],{},"QoraClient(config: QoraClientConfig(...))",[542,1405,1406,1409,1414],{},[559,1407,1408],{},"Requête",[559,1410,1411],{},[358,1412,1413],{},"Query(key: 'user', queryFn: fn)",[559,1415,1416],{},[358,1417,1418],{},"client.watchQuery(key: ['user'], fetcher: fn)",[542,1420,1421,1424,1433],{},[559,1422,1423],{},"Stream",[559,1425,1426,1429,1430,884],{},[358,1427,1428],{},"query.stream"," (",[358,1431,1432],{},"QueryStatus",[559,1434,1435,1365,1438,1429,1441,884],{},[358,1436,1437],{},"watchQuery",[358,1439,1440],{},"watchState",[358,1442,211],{},[542,1444,1445,1448,1453],{},[559,1446,1447],{},"Lecture ponctuelle",[559,1449,1450],{},[358,1451,1452],{},"await query.result",[559,1454,1455],{},[358,1456,1457],{},"await client.fetchQuery(key: ..., fetcher: ...)",[542,1459,1460,1463,1468],{},[559,1461,1462],{},"Widget",[559,1464,1465],{},[358,1466,1467],{},"QueryBuilder",[559,1469,1470],{},[358,1471,599],{},[542,1473,1474,1477,1482],{},[559,1475,1476],{},"Forcer un refetch",[559,1478,1479],{},[358,1480,1481],{},"query.refetch()",[559,1483,1484,1487],{},[358,1485,1486],{},"client.invalidate(key)"," (les watchers actifs refetch)",[542,1489,1490,1493,1498],{},[559,1491,1492],{},"Invalider en masse",[559,1494,1495],{},[358,1496,1497],{},"CachedQuery.instance.invalidateCache(...)",[559,1499,1500,658,1502,658,1505],{},[358,1501,741],{},[358,1503,1504],{},"invalidateWhere",[358,1506,1507],{},"invalidateTags",[542,1509,1510,1513,1520],{},[559,1511,1512],{},"Fraîcheur / rétention",[559,1514,1515,658,1517],{},[358,1516,627],{},[358,1518,1519],{},"cacheDuration",[559,1521,1522,658,1525],{},[358,1523,1524],{},"staleTime",[358,1526,1527],{},"gcTime",[542,1529,1530,1533,1538],{},[559,1531,1532],{},"Liste infinie",[559,1534,1535],{},[358,1536,1537],{},"InfiniteQuery\u003CT, Arg>",[559,1539,1540],{},[358,1541,1542],{},"InfiniteQueryBuilder\u003CTData, TPageParam>",[542,1544,1545,1547,1552],{},[559,1546,604],{},[559,1548,1549],{},[358,1550,1551],{},"Mutation(mutationFn: fn, invalidateQueries: [...])",[559,1553,1554,1365,1556,1559,1560],{},[358,1555,113],{},[358,1557,1558],{},"useMutation"," avec ",[358,1561,1562],{},"MutationOptions.invalidates",[542,1564,1565,1567,1573],{},[559,1566,153],{},[559,1568,1569,1572],{},[358,1570,1571],{},"cached_storage"," (sqflite)",[559,1574,1575,1577,1578],{},[358,1576,229],{}," + votre ",[358,1579,1580],{},"StorageAdapter",[542,1582,1583,1586,1594],{},[559,1584,1585],{},"Refetch au retour / à la reconnexion",[559,1587,1588,658,1591],{},[358,1589,1590],{},"refetchOnResume",[358,1592,1593],{},"refetchOnConnection",[559,1595,1596],{},[358,1597,1598],{},"QoraScope.auto()",[531,1600,1602],{"id":1601},"clés","Clés",[348,1604,1605,1606,1608],{},"Les clés ",[358,1607,368],{}," sont en général des chaînes. Les clés Qora sont des listes, ce qui rend l'invalidation par préfixe naturelle :",[392,1610,1612],{"className":394,"code":1611,"language":396,"meta":397,"style":397},"// cached_query\nQuery(key: 'user-$id', queryFn: () => api.getUser(id));\n\n// Qora\nclient.watchQuery(key: ['users', id], fetcher: () => api.getUser(id));\nclient.invalidatePrefix(['users']); // toutes les requêtes utilisateur\n",[358,1613,1614,1619,1661,1665,1670,1713],{"__ignoreMap":397},[401,1615,1616],{"class":403,"line":404},[401,1617,1618],{"class":481},"// cached_query\n",[401,1620,1621,1623,1626,1628,1631,1633,1636,1638,1640,1643,1645,1648,1650,1652,1654,1656,1659],{"class":403,"line":419},[401,1622,1364],{"class":431},[401,1624,1625],{"class":415},"(key",[401,1627,450],{"class":435},[401,1629,1630],{"class":791}," 'user-",[401,1632,1059],{"class":415},[401,1634,1635],{"class":869},"id",[401,1637,881],{"class":791},[401,1639,478],{"class":435},[401,1641,1642],{"class":415}," queryFn",[401,1644,450],{"class":435},[401,1646,1647],{"class":415}," () ",[401,1649,803],{"class":435},[401,1651,806],{"class":415},[401,1653,436],{"class":435},[401,1655,811],{"class":411},[401,1657,1658],{"class":415},"(id))",[401,1660,499],{"class":435},[401,1662,1663],{"class":403,"line":428},[401,1664,914],{"emptyLinePlaceholder":913},[401,1666,1667],{"class":403,"line":444},[401,1668,1669],{"class":481},"// Qora\n",[401,1671,1672,1675,1677,1679,1681,1683,1685,1688,1690,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711],{"class":403,"line":462},[401,1673,1674],{"class":415},"client",[401,1676,436],{"class":435},[401,1678,1437],{"class":411},[401,1680,1625],{"class":415},[401,1682,450],{"class":435},[401,1684,788],{"class":415},[401,1686,1687],{"class":791},"'users'",[401,1689,478],{"class":435},[401,1691,1692],{"class":415}," id]",[401,1694,478],{"class":435},[401,1696,954],{"class":415},[401,1698,450],{"class":435},[401,1700,1647],{"class":415},[401,1702,803],{"class":435},[401,1704,806],{"class":415},[401,1706,436],{"class":435},[401,1708,811],{"class":411},[401,1710,1658],{"class":415},[401,1712,499],{"class":435},[401,1714,1715,1717,1719,1721,1724,1726,1729,1732],{"class":403,"line":485},[401,1716,1674],{"class":415},[401,1718,436],{"class":435},[401,1720,741],{"class":411},[401,1722,1723],{"class":415},"([",[401,1725,1687],{"class":791},[401,1727,1728],{"class":415},"])",[401,1730,1731],{"class":435},";",[401,1733,1734],{"class":481}," // toutes les requêtes utilisateur\n",[531,1736,1738],{"id":1737},"ce-que-vous-gagnez","Ce que vous gagnez",[1740,1741,1742,1749,1762,1768],"ul",{},[1743,1744,1745,1748],"li",{},[727,1746,1747],{},"File de mutations hors ligne"," : les écritures faites hors ligne sont mises en file et rejouées dans l'ordre à la reconnexion, avec une UI optimiste entre-temps.",[1743,1750,1751,1754,1755,1757,1758,1761],{},[727,1752,1753],{},"État à deux axes"," : ",[358,1756,211],{}," (données) et ",[358,1759,1760],{},"FetchStatus"," (fetching / paused / idle) sont indépendants, donc « hors ligne avec données périmées » est un état de première classe.",[1743,1763,1764,1767],{},[727,1765,1766],{},"Invalidation par tags"," : les mutations invalident des tags logiques plutôt que des clés codées en dur.",[1743,1769,1770,1773],{},[727,1771,1772],{},"Overlay DevTools intégré à l'app"," pour inspecter le cache, les timelines et les mutations.",[507,1775],{},[381,1777,182],{"id":1778},"gestion-des-erreurs",[348,1780,1781,1782,1785,1786,1020],{},"Les deux librairies exposent les erreurs brutes. Avec Qora, on les mappe une seule fois via ",[358,1783,1784],{},"QoraClientConfig.errorMapper",", qui reçoit l'erreur et sa stack trace et retourne une ",[358,1787,1788],{},"QoraException",[392,1790,1792],{"className":394,"code":1791,"language":396,"meta":397,"style":397},"import 'package:qora_flutter/qora_flutter.dart';\n\nfinal client = QoraClient(\n  config: QoraClientConfig(\n    errorMapper: (Object error, StackTrace? stackTrace) => error is QoraException\n        ? error\n        : QoraException(error.toString(), originalError: error, stackTrace: stackTrace),\n  ),\n);\n",[358,1793,1794,1805,1809,1822,1834,1870,1878,1917,1923],{"__ignoreMap":397},[401,1795,1796,1800,1803],{"class":403,"line":404},[401,1797,1799],{"class":1798},"sbssI","import",[401,1801,1802],{"class":791}," 'package:qora_flutter/qora_flutter.dart'",[401,1804,499],{"class":435},[401,1806,1807],{"class":403,"line":419},[401,1808,914],{"emptyLinePlaceholder":913},[401,1810,1811,1813,1816,1818,1820],{"class":403,"line":428},[401,1812,770],{"class":407},[401,1814,1815],{"class":415}," client ",[401,1817,776],{"class":435},[401,1819,453],{"class":431},[401,1821,425],{"class":415},[401,1823,1824,1827,1829,1832],{"class":403,"line":444},[401,1825,1826],{"class":415},"  config",[401,1828,450],{"class":435},[401,1830,1831],{"class":431}," QoraClientConfig",[401,1833,425],{"class":415},[401,1835,1836,1839,1841,1843,1846,1848,1850,1853,1856,1859,1861,1864,1867],{"class":403,"line":462},[401,1837,1838],{"class":415},"    errorMapper",[401,1840,450],{"class":435},[401,1842,1429],{"class":415},[401,1844,1845],{"class":431},"Object",[401,1847,1015],{"class":415},[401,1849,478],{"class":435},[401,1851,1852],{"class":431}," StackTrace",[401,1854,1855],{"class":435},"?",[401,1857,1858],{"class":415}," stackTrace) ",[401,1860,803],{"class":435},[401,1862,1863],{"class":415}," error ",[401,1865,1866],{"class":435},"is",[401,1868,1869],{"class":431}," QoraException\n",[401,1871,1872,1875],{"class":403,"line":485},[401,1873,1874],{"class":435},"        ?",[401,1876,1877],{"class":415}," error\n",[401,1879,1880,1883,1886,1889,1891,1894,1896,1898,1901,1903,1905,1907,1910,1912,1915],{"class":403,"line":493},[401,1881,1882],{"class":435},"        :",[401,1884,1885],{"class":431}," QoraException",[401,1887,1888],{"class":415},"(error",[401,1890,436],{"class":435},[401,1892,1893],{"class":411},"toString",[401,1895,456],{"class":415},[401,1897,478],{"class":435},[401,1899,1900],{"class":415}," originalError",[401,1902,450],{"class":435},[401,1904,1015],{"class":415},[401,1906,478],{"class":435},[401,1908,1909],{"class":415}," stackTrace",[401,1911,450],{"class":435},[401,1913,1914],{"class":415}," stackTrace)",[401,1916,459],{"class":435},[401,1918,1919,1921],{"class":403,"line":502},[401,1920,496],{"class":415},[401,1922,459],{"class":435},[401,1924,1925,1927],{"class":403,"line":968},[401,1926,884],{"class":415},[401,1928,499],{"class":435},[348,1930,1931,1932,1936],{},"Voir ",[352,1933,1935],{"href":1934},"../third-party/with-dio","l'intégration Dio"," pour un mapper complet.",[1938,1939,1940],"style",{},"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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}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 pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":397,"searchDepth":419,"depth":419,"links":1942},[1943,1944,1949,1954],{"id":383,"depth":419,"text":384},{"id":511,"depth":419,"text":512,"children":1945},[1946,1947,1948],{"id":533,"depth":428,"text":534},{"id":745,"depth":428,"text":746},{"id":1143,"depth":428,"text":82},{"id":1355,"depth":419,"text":1356,"children":1950},[1951,1952,1953],{"id":1374,"depth":428,"text":534},{"id":1601,"depth":428,"text":1602},{"id":1737,"depth":428,"text":1738},{"id":1778,"depth":419,"text":182},"Faire correspondre les concepts de flutter_query et cached_query à Qora et migrer écran par écran.","md",null,{},{"icon":38},{"title":35,"description":1955},"RSJMbZdQxHbGFlcD8mn9VF01vjwBAiRu9KIKFvgWFgQ",[1963,1965],{"title":30,"path":31,"stem":32,"description":1964,"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.",{"title":40,"path":41,"stem":42,"description":1966,"icon":43,"children":-1},"Donner à Claude, Cursor, Copilot ou tout assistant de code le contexte nécessaire pour écrire du code Qora correct.",1794040396156]