[{"data":1,"prerenderedAt":2826},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-core-concepts-caching":342,"-fr-core-concepts-caching-surround":2821},[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":67,"body":344,"description":2814,"extension":2815,"links":2816,"meta":2817,"navigation":2818,"path":68,"seo":2819,"stem":69,"__hash__":2820},"docs_fr/fr/02.core-concepts/4.caching.md",{"type":345,"value":346,"toc":2780},"minimark",[347,352,365,392,402,405,409,415,421,424,426,436,439,486,568,579,581,587,592,636,642,748,750,755,760,780,816,827,829,833,836,843,1020,1025,1028,1064,1164,1168,1171,1191,1195,1198,1226,1228,1232,1242,1249,1260,1386,1393,1405,1509,1511,1515,1529,1536,1666,1679,1681,1685,1695,1713,1758,1775,1777,1781,1785,1912,1916,2090,2094,2230,2247,2299,2311,2315,2366,2368,2375,2378,2470,2472,2476,2544,2546,2550,2561,2750,2752,2756,2776],[348,349,351],"h2",{"id":350},"fonctionnement-du-cache","Fonctionnement du cache",[353,354,355,356,360,361,364],"p",{},"Chaque résultat de requête est stocké en tant que ",[357,358,359],"code",{},"CacheEntry\u003CT>"," dans un ",[357,362,363],{},"QueryCache"," en mémoire, indexé par la clé de requête normalisée. Le cache pilote :",[366,367,368,376,382],"ul",{},[369,370,371,375],"li",{},[372,373,374],"strong",{},"Réponses instantanées"," : les données fraîches sont retournées sans appel réseau",[369,377,378,381],{},[372,379,380],{},"SWR"," : les données périmées sont retournées immédiatement pendant que les données fraîches sont récupérées en arrière-plan",[369,383,384,387,388,391],{},[372,385,386],{},"Mises à jour réactives"," : chaque ",[357,389,390],{},"CacheEntry"," contient un broadcast stream ; tout changement d'état atteint immédiatement tous les abonnés actifs",[393,394,400],"pre",{"className":395,"code":397,"language":398,"meta":399},[396],"language-text","fetchQuery(['users', 1])\n  │\n  ├─ Cache HIT  (frais)   → retourner les données immédiatement\n  ├─ Cache HIT  (périmé)  → retourner les données périmées + revalider en arrière-plan\n  └─ Cache MISS           → fetch → stocker → retourner les données\n","text","",[357,401,397],{"__ignoreMap":399},[403,404],"hr",{},[348,406,408],{"id":407},"cycle-de-vie-dune-entrée-de-cache","Cycle de vie d'une entrée de cache",[353,410,411,412,414],{},"Une ",[357,413,359],{}," traverse les étapes suivantes :",[393,416,419],{"className":417,"code":418,"language":398,"meta":399},[396],"Créée (Initial)\n  │  fetchQuery / watchQuery déclenché\n  ▼\nLoading → Success / Failure\n  │  staleTime écoulé\n  ▼\nPérimée (toujours en cache, accessible comme previousData)\n  │  dernier abonné se désabonne\n  ▼\nTimer GC démarré (= gcTime)\n  │  timer déclenché, aucun abonné actif\n  ▼\nÉvincée (supprimée du cache)\n",[357,420,418],{"__ignoreMap":399},[353,422,423],{},"Un sweep d'éviction en arrière-plan s'exécute également toutes les minutes pour supprimer les entrées inactives expirées.",[403,425],{},[348,427,429,432,433],{"id":428},"staletime-vs-gctime",[357,430,431],{},"staleTime"," vs ",[357,434,435],{},"gcTime",[353,437,438],{},"Ces deux durées contrôlent des comportements indépendants :",[440,441,442,458],"table",{},[443,444,445],"thead",{},[446,447,448,452,455],"tr",{},[449,450,451],"th",{},"Propriété",[449,453,454],{},"Défaut",[449,456,457],{},"Contrôle",[459,460,461,474],"tbody",{},[446,462,463,468,471],{},[464,465,466],"td",{},[357,467,431],{},[464,469,470],{},"0 (zéro)",[464,472,473],{},"Quand déclencher une revalidation en arrière-plan",[446,475,476,480,483],{},[464,477,478],{},[357,479,435],{},[464,481,482],{},"5 minutes",[464,484,485],{},"Quand supprimer une entrée inutilisée du cache",[393,487,492],{"className":488,"code":489,"filename":490,"language":491,"meta":399,"style":399},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraOptions(\n  staleTime: Duration(minutes: 5),   // données fraîches pendant 5 minutes\n  gcTime: Duration(minutes: 10),  // données inutilisées conservées 10 min en cache\n)\n","main.dart","dart",[357,493,494,506,538,562],{"__ignoreMap":399},[495,496,499,502],"span",{"class":497,"line":498},"line",1,[495,500,215],{"class":501},"sBMFI",[495,503,505],{"class":504},"sTEyZ","(\n",[495,507,509,512,516,519,522,524,528,531,534],{"class":497,"line":508},2,[495,510,511],{"class":504},"  staleTime",[495,513,515],{"class":514},"sMK4o",":",[495,517,518],{"class":501}," Duration",[495,520,521],{"class":504},"(minutes",[495,523,515],{"class":514},[495,525,527],{"class":526},"sbssI"," 5",[495,529,530],{"class":504},")",[495,532,533],{"class":514},",",[495,535,537],{"class":536},"sHwdD","   // données fraîches pendant 5 minutes\n",[495,539,541,544,546,548,550,552,555,557,559],{"class":497,"line":540},3,[495,542,543],{"class":504},"  gcTime",[495,545,515],{"class":514},[495,547,518],{"class":501},[495,549,521],{"class":504},[495,551,515],{"class":514},[495,553,554],{"class":526}," 10",[495,556,530],{"class":504},[495,558,533],{"class":514},[495,560,561],{"class":536},"  // données inutilisées conservées 10 min en cache\n",[495,563,565],{"class":497,"line":564},4,[495,566,567],{"class":504},")\n",[569,570,571,574,575,578],"tip",{},[357,572,573],{},"staleTime: Duration.zero"," (la valeur par défaut) signifie que les données sont ",[372,576,577],{},"toujours"," considérées comme périmées. Qora sert quand même les données en cache immédiatement ; il revalide également en arrière-plan à chaque accès.",[403,580],{},[348,582,584,586],{"id":583},"staletime-en-détail",[357,585,431],{}," en détail",[353,588,589,591],{},[357,590,431],{}," définit la fenêtre de fraîcheur. Pendant cette fenêtre, les données sont retournées depuis le cache sans aucune activité réseau :",[393,593,595],{"className":488,"code":594,"filename":490,"language":491,"meta":399,"style":399},"// staleTime : 5 minutes\n\n// t = 0:00 → fetch déclenché, Success stocké\n// t = 0:01 → fetchQuery → Cache HIT (frais) : pas d'appel réseau\n// t = 5:01 → fetchQuery → Cache HIT (périmé) : retourne les données en cache + revalide\n// t = 5:01 → requête réseau déclenchée en arrière-plan\n// t = 5:02 → Success mis à jour, abonnés au stream notifiés\n",[357,596,597,602,608,613,618,624,630],{"__ignoreMap":399},[495,598,599],{"class":497,"line":498},[495,600,601],{"class":536},"// staleTime : 5 minutes\n",[495,603,604],{"class":497,"line":508},[495,605,607],{"emptyLinePlaceholder":606},true,"\n",[495,609,610],{"class":497,"line":540},[495,611,612],{"class":536},"// t = 0:00 → fetch déclenché, Success stocké\n",[495,614,615],{"class":497,"line":564},[495,616,617],{"class":536},"// t = 0:01 → fetchQuery → Cache HIT (frais) : pas d'appel réseau\n",[495,619,621],{"class":497,"line":620},5,[495,622,623],{"class":536},"// t = 5:01 → fetchQuery → Cache HIT (périmé) : retourne les données en cache + revalide\n",[495,625,627],{"class":497,"line":626},6,[495,628,629],{"class":536},"// t = 5:01 → requête réseau déclenchée en arrière-plan\n",[495,631,633],{"class":497,"line":632},7,[495,634,635],{"class":536},"// t = 5:02 → Success mis à jour, abonnés au stream notifiés\n",[353,637,638,639,641],{},"Définir un ",[357,640,431],{}," long pour les données qui changent rarement :",[393,643,645],{"className":488,"code":644,"filename":490,"language":491,"meta":399,"style":399},"// Données de configuration : valides pendant 1 heure\noptions: QoraOptions(staleTime: Duration(hours: 1)),\n\n// Profil utilisateur : valide pendant 10 minutes\noptions: QoraOptions(staleTime: Duration(minutes: 10)),\n\n// Prix en direct : toujours périmé (défaut)\noptions: QoraOptions(staleTime: Duration.zero),\n",[357,646,647,652,683,687,692,716,720,725],{"__ignoreMap":399},[495,648,649],{"class":497,"line":498},[495,650,651],{"class":536},"// Données de configuration : valides pendant 1 heure\n",[495,653,654,657,659,662,665,667,669,672,674,677,680],{"class":497,"line":508},[495,655,656],{"class":504},"options",[495,658,515],{"class":514},[495,660,661],{"class":501}," QoraOptions",[495,663,664],{"class":504},"(staleTime",[495,666,515],{"class":514},[495,668,518],{"class":501},[495,670,671],{"class":504},"(hours",[495,673,515],{"class":514},[495,675,676],{"class":526}," 1",[495,678,679],{"class":504},"))",[495,681,682],{"class":514},",\n",[495,684,685],{"class":497,"line":540},[495,686,607],{"emptyLinePlaceholder":606},[495,688,689],{"class":497,"line":564},[495,690,691],{"class":536},"// Profil utilisateur : valide pendant 10 minutes\n",[495,693,694,696,698,700,702,704,706,708,710,712,714],{"class":497,"line":620},[495,695,656],{"class":504},[495,697,515],{"class":514},[495,699,661],{"class":501},[495,701,664],{"class":504},[495,703,515],{"class":514},[495,705,518],{"class":501},[495,707,521],{"class":504},[495,709,515],{"class":514},[495,711,554],{"class":526},[495,713,679],{"class":504},[495,715,682],{"class":514},[495,717,718],{"class":497,"line":626},[495,719,607],{"emptyLinePlaceholder":606},[495,721,722],{"class":497,"line":632},[495,723,724],{"class":536},"// Prix en direct : toujours périmé (défaut)\n",[495,726,728,730,732,734,736,738,740,743,746],{"class":497,"line":727},8,[495,729,656],{"class":504},[495,731,515],{"class":514},[495,733,661],{"class":501},[495,735,664],{"class":504},[495,737,515],{"class":514},[495,739,518],{"class":501},[495,741,742],{"class":514},".",[495,744,745],{"class":504},"zero)",[495,747,682],{"class":514},[403,749],{},[348,751,753,586],{"id":752},"gctime-en-détail",[357,754,435],{},[353,756,757,759],{},[357,758,435],{}," détermine combien de temps les données inactives restent en cache après le départ de tous les abonnés. Il préserve les données pour une re-navigation rapide :",[393,761,763],{"className":488,"code":762,"filename":490,"language":491,"meta":399,"style":399},"// L'utilisateur quitte → dernier abonné annule → timer GC démarre\n// L'utilisateur revient dans gcTime → entrée toujours en cache → affichage instantané\n// L'utilisateur revient après gcTime → entrée évincée → fetch complet requis\n",[357,764,765,770,775],{"__ignoreMap":399},[495,766,767],{"class":497,"line":498},[495,768,769],{"class":536},"// L'utilisateur quitte → dernier abonné annule → timer GC démarre\n",[495,771,772],{"class":497,"line":508},[495,773,774],{"class":536},"// L'utilisateur revient dans gcTime → entrée toujours en cache → affichage instantané\n",[495,776,777],{"class":497,"line":540},[495,778,779],{"class":536},"// L'utilisateur revient après gcTime → entrée évincée → fetch complet requis\n",[393,781,783],{"className":488,"code":782,"filename":490,"language":491,"meta":399,"style":399},"// Liste de posts : conserver en cache 2 minutes après avoir quitté la page\noptions: QoraOptions(gcTime: Duration(minutes: 2)),\n",[357,784,785,790],{"__ignoreMap":399},[495,786,787],{"class":497,"line":498},[495,788,789],{"class":536},"// Liste de posts : conserver en cache 2 minutes après avoir quitté la page\n",[495,791,792,794,796,798,801,803,805,807,809,812,814],{"class":497,"line":508},[495,793,656],{"class":504},[495,795,515],{"class":514},[495,797,661],{"class":501},[495,799,800],{"class":504},"(gcTime",[495,802,515],{"class":514},[495,804,518],{"class":501},[495,806,521],{"class":504},[495,808,515],{"class":514},[495,810,811],{"class":526}," 2",[495,813,679],{"class":504},[495,815,682],{"class":514},[817,818,819,822,823,826],"warning",{},[357,820,821],{},"gcTime: Duration.zero"," supprime l'entrée dès que tous les abonnés partent. La visite suivante repart toujours de ",[357,824,825],{},"Initial",". Ce comportement est correct pour les données sensibles qui ne doivent pas survivre à la session courante.",[403,828],{},[348,830,832],{"id":831},"partage-structurel-structural-sharing","Partage structurel (Structural Sharing)",[353,834,835],{},"Le partage structurel préserve l'égalité référentielle pour les données imbriquées inchangées entre les fetches. Quand un fetch retourne des données profondément égales aux données en cache, Qora conserve la référence précédente au lieu de la remplacer.",[353,837,838,839,842],{},"Cette fonctionnalité est activée par défaut (",[357,840,841],{},"QoraOptions.structuralSharing: true","). Elle répond directement au problème des reconstructions inutiles de widgets dans les interfaces utilisateur profondément imbriquées :",[393,844,846],{"className":488,"code":845,"filename":490,"language":491,"meta":399,"style":399},"// Sans partage structurel : chaque fetch crée une nouvelle référence,\n// ce qui oblige tous les widgets consommant cette requête à se reconstruire.\n//\n// Avec partage structurel (défaut) : si les données retournées sont\n// structurellement identiques aux données en cache, l'ancienne référence\n// est conservée. Les widgets qui vérifient identical(oldData, newData)\n// ou == ignorent le rendu.\n\nfinal client = QoraClient();\nawait client.fetchQuery\u003CMap\u003CString, dynamic>>(\n  key: ['config'],\n  fetcher: () => api.getConfig(),\n  options: QoraOptions(structuralSharing: true),\n);\n",[357,847,848,853,858,863,868,873,878,883,887,909,945,965,991,1013],{"__ignoreMap":399},[495,849,850],{"class":497,"line":498},[495,851,852],{"class":536},"// Sans partage structurel : chaque fetch crée une nouvelle référence,\n",[495,854,855],{"class":497,"line":508},[495,856,857],{"class":536},"// ce qui oblige tous les widgets consommant cette requête à se reconstruire.\n",[495,859,860],{"class":497,"line":540},[495,861,862],{"class":536},"//\n",[495,864,865],{"class":497,"line":564},[495,866,867],{"class":536},"// Avec partage structurel (défaut) : si les données retournées sont\n",[495,869,870],{"class":497,"line":620},[495,871,872],{"class":536},"// structurellement identiques aux données en cache, l'ancienne référence\n",[495,874,875],{"class":497,"line":626},[495,876,877],{"class":536},"// est conservée. Les widgets qui vérifient identical(oldData, newData)\n",[495,879,880],{"class":497,"line":632},[495,881,882],{"class":536},"// ou == ignorent le rendu.\n",[495,884,885],{"class":497,"line":727},[495,886,607],{"emptyLinePlaceholder":606},[495,888,890,894,897,900,903,906],{"class":497,"line":889},9,[495,891,893],{"class":892},"spNyl","final",[495,895,896],{"class":504}," client ",[495,898,899],{"class":514},"=",[495,901,902],{"class":501}," QoraClient",[495,904,905],{"class":504},"()",[495,907,908],{"class":514},";\n",[495,910,912,916,919,921,925,928,931,933,936,939,942],{"class":497,"line":911},10,[495,913,915],{"class":914},"s7zQu","await",[495,917,918],{"class":504}," client",[495,920,742],{"class":514},[495,922,924],{"class":923},"s2Zo4","fetchQuery",[495,926,927],{"class":504},"\u003C",[495,929,930],{"class":501},"Map",[495,932,927],{"class":504},[495,934,935],{"class":501},"String",[495,937,938],{"class":504},", ",[495,940,941],{"class":501},"dynamic",[495,943,944],{"class":504},">>(\n",[495,946,948,951,953,956,960,963],{"class":497,"line":947},11,[495,949,950],{"class":504},"  key",[495,952,515],{"class":514},[495,954,955],{"class":504}," [",[495,957,959],{"class":958},"sfazB","'config'",[495,961,962],{"class":504},"]",[495,964,682],{"class":514},[495,966,968,971,973,976,979,982,984,987,989],{"class":497,"line":967},12,[495,969,970],{"class":504},"  fetcher",[495,972,515],{"class":514},[495,974,975],{"class":504}," () ",[495,977,978],{"class":514},"=>",[495,980,981],{"class":504}," api",[495,983,742],{"class":514},[495,985,986],{"class":923},"getConfig",[495,988,905],{"class":504},[495,990,682],{"class":514},[495,992,994,997,999,1001,1004,1006,1009,1011],{"class":497,"line":993},13,[495,995,996],{"class":504},"  options",[495,998,515],{"class":514},[495,1000,661],{"class":501},[495,1002,1003],{"class":504},"(structuralSharing",[495,1005,515],{"class":514},[495,1007,1008],{"class":514}," true",[495,1010,530],{"class":504},[495,1012,682],{"class":514},[495,1014,1016,1018],{"class":497,"line":1015},14,[495,1017,530],{"class":504},[495,1019,908],{"class":514},[1021,1022,1024],"h3",{"id":1023},"fonctionnement","Fonctionnement",[353,1026,1027],{},"La comparaison d'égalité profonde est récursive :",[366,1029,1030,1035,1041,1047],{},[369,1031,1032,1034],{},[372,1033,930],{}," : compare la présence des clés et les valeurs récursivement",[369,1036,1037,1040],{},[372,1038,1039],{},"List"," : compare le nombre d'éléments et les éléments récursivement",[369,1042,1043,1046],{},[372,1044,1045],{},"Set"," : compare l'appartenance",[369,1048,1049,1052,1053,1056,1057,1059,1060,1063],{},[372,1050,1051],{},"Autres types"," : utilise ",[357,1054,1055],{},"=="," (surcharger ",[357,1058,1055],{}," et ",[357,1061,1062],{},"hashCode"," sur les classes de modèle personnalisées pour de meilleurs résultats)",[393,1065,1067],{"className":488,"code":1066,"filename":490,"language":491,"meta":399,"style":399},"final oldData = {'user': {'name': 'Alice', 'roles': ['admin']}};\nfinal newData = {'user': {'name': 'Alice', 'roles': ['admin']}};\n\n// structuralShare retourne oldData, elles sont profondément égales.\n// Tout widget détenant oldData verra identical(oldData, newData) == true.\n",[357,1068,1069,1113,1150,1154,1159],{"__ignoreMap":399},[495,1070,1071,1073,1076,1078,1081,1084,1086,1088,1091,1093,1096,1098,1101,1103,1105,1108,1111],{"class":497,"line":498},[495,1072,893],{"class":892},[495,1074,1075],{"class":504}," oldData ",[495,1077,899],{"class":514},[495,1079,1080],{"class":504}," {",[495,1082,1083],{"class":958},"'user'",[495,1085,515],{"class":514},[495,1087,1080],{"class":504},[495,1089,1090],{"class":958},"'name'",[495,1092,515],{"class":514},[495,1094,1095],{"class":958}," 'Alice'",[495,1097,533],{"class":514},[495,1099,1100],{"class":958}," 'roles'",[495,1102,515],{"class":514},[495,1104,955],{"class":504},[495,1106,1107],{"class":958},"'admin'",[495,1109,1110],{"class":504},"]}}",[495,1112,908],{"class":514},[495,1114,1115,1117,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148],{"class":497,"line":508},[495,1116,893],{"class":892},[495,1118,1119],{"class":504}," newData ",[495,1121,899],{"class":514},[495,1123,1080],{"class":504},[495,1125,1083],{"class":958},[495,1127,515],{"class":514},[495,1129,1080],{"class":504},[495,1131,1090],{"class":958},[495,1133,515],{"class":514},[495,1135,1095],{"class":958},[495,1137,533],{"class":514},[495,1139,1100],{"class":958},[495,1141,515],{"class":514},[495,1143,955],{"class":504},[495,1145,1107],{"class":958},[495,1147,1110],{"class":504},[495,1149,908],{"class":514},[495,1151,1152],{"class":497,"line":540},[495,1153,607],{"emptyLinePlaceholder":606},[495,1155,1156],{"class":497,"line":564},[495,1157,1158],{"class":536},"// structuralShare retourne oldData, elles sont profondément égales.\n",[495,1160,1161],{"class":497,"line":620},[495,1162,1163],{"class":536},"// Tout widget détenant oldData verra identical(oldData, newData) == true.\n",[1021,1165,1167],{"id":1166},"quand-désactiver","Quand désactiver",[353,1169,1170],{},"Désactiver le partage structurel uniquement si la vérification d'égalité profonde devient un goulot d'étranglement mesuré avec de très grandes structures de données :",[393,1172,1174],{"className":488,"code":1173,"filename":490,"language":491,"meta":399,"style":399},"QoraOptions(structuralSharing: false),\n",[357,1175,1176],{"__ignoreMap":399},[495,1177,1178,1180,1182,1184,1187,1189],{"class":497,"line":498},[495,1179,215],{"class":501},[495,1181,1003],{"class":504},[495,1183,515],{"class":514},[495,1185,1186],{"class":514}," false",[495,1188,530],{"class":504},[495,1190,682],{"class":514},[1021,1192,1194],{"id":1193},"portée","Portée",[353,1196,1197],{},"Le partage structurel s'applique à tous les chemins d'écriture du cache :",[366,1199,1200,1205,1211,1220],{},[369,1201,1202,1204],{},[357,1203,924],{}," après une réponse réseau réussie",[369,1206,1207,1210],{},[357,1208,1209],{},"setQueryData"," pour les écritures manuelles dans le cache",[369,1212,1213,1059,1216,1219],{},[357,1214,1215],{},"setInfiniteQueryData",[357,1217,1218],{},"updateInfiniteQueryState"," pour les requêtes infinies",[369,1221,1222,1225],{},[357,1223,1224],{},"hydrateQuery"," lors de la restauration de données persistées dans une entrée non-initiale",[403,1227],{},[348,1229,1231],{"id":1230},"pipeline-de-transformation","Pipeline de transformation",[353,1233,1234,1235,1059,1238,1241],{},"Qora vous permet de découpler la transformation des données du fetcher via ",[357,1236,1237],{},"QoraOptions.transform",[357,1239,1240],{},"QoraOptions.transformError",". Cela maintient le fetcher simple (appel API brut) et la transformation pure (testable isolément).",[1021,1243,1245,1248],{"id":1244},"transform-succès",[357,1246,1247],{},"transform",": succès",[353,1250,1251,1252,1255,1256,1259],{},"Appelée ",[372,1253,1254],{},"après"," la réussite du fetcher mais ",[372,1257,1258],{},"avant"," l'entrée des données dans le cache (et avant le partage structurel). La valeur transformée est ce qui est mis en cache et retourné aux appelants.",[393,1261,1264],{"className":488,"code":1262,"filename":1263,"language":491,"meta":399,"style":399},"fetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),  // retourne Map\u003CString, dynamic>\n  options: QoraOptions(\n    transform: (raw) => User.fromJson(raw as Map\u003CString, dynamic>),\n  ),\n);\n","user_repository.dart",[357,1265,1266,1278,1296,1321,1331,1373,1380],{"__ignoreMap":399},[495,1267,1268,1270,1272,1275],{"class":497,"line":498},[495,1269,924],{"class":923},[495,1271,927],{"class":504},[495,1273,1274],{"class":501},"User",[495,1276,1277],{"class":504},">(\n",[495,1279,1280,1282,1284,1286,1289,1291,1294],{"class":497,"line":508},[495,1281,950],{"class":504},[495,1283,515],{"class":514},[495,1285,955],{"class":504},[495,1287,1288],{"class":958},"'users'",[495,1290,533],{"class":514},[495,1292,1293],{"class":504}," userId]",[495,1295,682],{"class":514},[495,1297,1298,1300,1302,1304,1306,1308,1310,1313,1316,1318],{"class":497,"line":540},[495,1299,970],{"class":504},[495,1301,515],{"class":514},[495,1303,975],{"class":504},[495,1305,978],{"class":514},[495,1307,981],{"class":504},[495,1309,742],{"class":514},[495,1311,1312],{"class":923},"getUser",[495,1314,1315],{"class":504},"(userId)",[495,1317,533],{"class":514},[495,1319,1320],{"class":536},"  // retourne Map\u003CString, dynamic>\n",[495,1322,1323,1325,1327,1329],{"class":497,"line":564},[495,1324,996],{"class":504},[495,1326,515],{"class":514},[495,1328,661],{"class":501},[495,1330,505],{"class":504},[495,1332,1333,1336,1338,1341,1343,1346,1348,1351,1354,1357,1360,1362,1364,1366,1368,1371],{"class":497,"line":620},[495,1334,1335],{"class":504},"    transform",[495,1337,515],{"class":514},[495,1339,1340],{"class":504}," (raw) ",[495,1342,978],{"class":514},[495,1344,1345],{"class":501}," User",[495,1347,742],{"class":514},[495,1349,1350],{"class":923},"fromJson",[495,1352,1353],{"class":504},"(raw ",[495,1355,1356],{"class":514},"as",[495,1358,1359],{"class":501}," Map",[495,1361,927],{"class":504},[495,1363,935],{"class":501},[495,1365,938],{"class":504},[495,1367,941],{"class":501},[495,1369,1370],{"class":504},">)",[495,1372,682],{"class":514},[495,1374,1375,1378],{"class":497,"line":626},[495,1376,1377],{"class":504},"  )",[495,1379,682],{"class":514},[495,1381,1382,1384],{"class":497,"line":632},[495,1383,530],{"class":504},[495,1385,908],{"class":514},[1021,1387,1389,1392],{"id":1388},"transformerror-erreur",[357,1390,1391],{},"transformError",": erreur",[353,1394,1251,1395,1397,1398,1400,1401,1404],{},[372,1396,1254],{}," l'échec de toutes les tentatives mais ",[372,1399,1258],{}," l'entrée de l'erreur dans le cache et avant ",[357,1402,1403],{},"QoraClientConfig.errorMapper",". Utilisez-la pour normaliser les types d'erreur au niveau de la requête.",[393,1406,1409],{"className":488,"code":1407,"filename":1408,"language":491,"meta":399,"style":399},"fetchQuery\u003CPost>(\n  key: ['post', postId],\n  fetcher: () => api.getPost(postId),\n  options: QoraOptions(\n    transformError: (error) => AppError.fromException(error),\n  ),\n);\n","post_repository.dart",[357,1410,1411,1422,1440,1462,1472,1497,1503],{"__ignoreMap":399},[495,1412,1413,1415,1417,1420],{"class":497,"line":498},[495,1414,924],{"class":923},[495,1416,927],{"class":504},[495,1418,1419],{"class":501},"Post",[495,1421,1277],{"class":504},[495,1423,1424,1426,1428,1430,1433,1435,1438],{"class":497,"line":508},[495,1425,950],{"class":504},[495,1427,515],{"class":514},[495,1429,955],{"class":504},[495,1431,1432],{"class":958},"'post'",[495,1434,533],{"class":514},[495,1436,1437],{"class":504}," postId]",[495,1439,682],{"class":514},[495,1441,1442,1444,1446,1448,1450,1452,1454,1457,1460],{"class":497,"line":540},[495,1443,970],{"class":504},[495,1445,515],{"class":514},[495,1447,975],{"class":504},[495,1449,978],{"class":514},[495,1451,981],{"class":504},[495,1453,742],{"class":514},[495,1455,1456],{"class":923},"getPost",[495,1458,1459],{"class":504},"(postId)",[495,1461,682],{"class":514},[495,1463,1464,1466,1468,1470],{"class":497,"line":564},[495,1465,996],{"class":504},[495,1467,515],{"class":514},[495,1469,661],{"class":501},[495,1471,505],{"class":504},[495,1473,1474,1477,1479,1482,1484,1487,1489,1492,1495],{"class":497,"line":620},[495,1475,1476],{"class":504},"    transformError",[495,1478,515],{"class":514},[495,1480,1481],{"class":504}," (error) ",[495,1483,978],{"class":514},[495,1485,1486],{"class":501}," AppError",[495,1488,742],{"class":514},[495,1490,1491],{"class":923},"fromException",[495,1493,1494],{"class":504},"(error)",[495,1496,682],{"class":514},[495,1498,1499,1501],{"class":497,"line":626},[495,1500,1377],{"class":504},[495,1502,682],{"class":514},[495,1504,1505,1507],{"class":497,"line":632},[495,1506,530],{"class":504},[495,1508,908],{"class":514},[403,1510],{},[348,1512,1514],{"id":1513},"conserver-les-données-précédentes","Conserver les données précédentes",[353,1516,1517,1518,1521,1522,1525,1526,1528],{},"Utilisez ",[357,1519,1520],{},"QoraOptions.keepPreviousData"," pour supprimer le flash de chargement lors des re-fetches. L'entrée reste dans l'état ",[357,1523,1524],{},"Success"," avec les données précédentes pendant que le fetch est en cours, puis passe à ",[357,1527,1524],{}," avec les nouvelles données à la fin du fetch.",[353,1530,1531,1532,1535],{},"C'est particulièrement utile pour la ",[372,1533,1534],{},"pagination basée sur un offset",", où le changement de paramètre de page déclenche un fetch mais vous voulez que la page actuelle reste visible jusqu'à ce que la suivante soit prête :",[393,1537,1540],{"className":488,"code":1538,"filename":1539,"language":491,"meta":399,"style":399},"fetchQuery\u003CList\u003CPost>>(\n  key: ['posts', 'page', page],\n  fetcher: () => api.getPosts(page: page, limit: 20),\n  options: QoraOptions(\n    keepPreviousData: true,\n    staleTime: Duration.zero,\n  ),\n);\n","post_list.dart",[357,1541,1542,1556,1579,1618,1628,1638,1654,1660],{"__ignoreMap":399},[495,1543,1544,1546,1548,1550,1552,1554],{"class":497,"line":498},[495,1545,924],{"class":923},[495,1547,927],{"class":504},[495,1549,1039],{"class":501},[495,1551,927],{"class":504},[495,1553,1419],{"class":501},[495,1555,944],{"class":504},[495,1557,1558,1560,1562,1564,1567,1569,1572,1574,1577],{"class":497,"line":508},[495,1559,950],{"class":504},[495,1561,515],{"class":514},[495,1563,955],{"class":504},[495,1565,1566],{"class":958},"'posts'",[495,1568,533],{"class":514},[495,1570,1571],{"class":958}," 'page'",[495,1573,533],{"class":514},[495,1575,1576],{"class":504}," page]",[495,1578,682],{"class":514},[495,1580,1581,1583,1585,1587,1589,1591,1593,1596,1599,1601,1604,1606,1609,1611,1614,1616],{"class":497,"line":540},[495,1582,970],{"class":504},[495,1584,515],{"class":514},[495,1586,975],{"class":504},[495,1588,978],{"class":514},[495,1590,981],{"class":504},[495,1592,742],{"class":514},[495,1594,1595],{"class":923},"getPosts",[495,1597,1598],{"class":504},"(page",[495,1600,515],{"class":514},[495,1602,1603],{"class":504}," page",[495,1605,533],{"class":514},[495,1607,1608],{"class":504}," limit",[495,1610,515],{"class":514},[495,1612,1613],{"class":526}," 20",[495,1615,530],{"class":504},[495,1617,682],{"class":514},[495,1619,1620,1622,1624,1626],{"class":497,"line":564},[495,1621,996],{"class":504},[495,1623,515],{"class":514},[495,1625,661],{"class":501},[495,1627,505],{"class":504},[495,1629,1630,1633,1635],{"class":497,"line":620},[495,1631,1632],{"class":504},"    keepPreviousData",[495,1634,515],{"class":514},[495,1636,1637],{"class":514}," true,\n",[495,1639,1640,1643,1645,1647,1649,1652],{"class":497,"line":626},[495,1641,1642],{"class":504},"    staleTime",[495,1644,515],{"class":514},[495,1646,518],{"class":501},[495,1648,742],{"class":514},[495,1650,1651],{"class":504},"zero",[495,1653,682],{"class":514},[495,1655,1656,1658],{"class":497,"line":632},[495,1657,1377],{"class":504},[495,1659,682],{"class":514},[495,1661,1662,1664],{"class":497,"line":727},[495,1663,530],{"class":504},[495,1665,908],{"class":514},[353,1667,1668,1669,1671,1672,1675,1676,1678],{},"En cas d'échec du fetch, l'entrée reste dans ",[357,1670,1524],{}," avec les données précédentes au lieu de passer à ",[357,1673,1674],{},"Failure",". L'erreur est toujours propagée aux appelants impératifs (",[357,1677,924],{},") afin que la gestion d'erreur (toasts, boutons de reprise) fonctionne normalement.",[403,1680],{},[348,1682,1684],{"id":1683},"éviction-lru","Éviction LRU",[353,1686,1687,1688,1691,1692,1694],{},"Quand ",[357,1689,1690],{},"maxCacheSize"," est défini sur ",[357,1693,220],{},", le cache applique une limite via une stratégie LRU (Least Recently Used) :",[366,1696,1697,1707],{},[369,1698,1699,1700,1059,1703,1706],{},"L'entrée ",[372,1701,1702],{},"accédée le moins récemment",[372,1704,1705],{},"sans abonnés actifs"," est évincée pour faire de la place",[369,1708,1709,1710],{},"Les entrées actives (avec abonnés) ne sont ",[372,1711,1712],{},"jamais évincées de force",[393,1714,1716],{"className":488,"code":1715,"filename":490,"language":491,"meta":399,"style":399},"final client = QoraClient(\n  config: QoraClientConfig(maxCacheSize: 100),\n);\n",[357,1717,1718,1730,1752],{"__ignoreMap":399},[495,1719,1720,1722,1724,1726,1728],{"class":497,"line":498},[495,1721,893],{"class":892},[495,1723,896],{"class":504},[495,1725,899],{"class":514},[495,1727,902],{"class":501},[495,1729,505],{"class":504},[495,1731,1732,1735,1737,1740,1743,1745,1748,1750],{"class":497,"line":508},[495,1733,1734],{"class":504},"  config",[495,1736,515],{"class":514},[495,1738,1739],{"class":501}," QoraClientConfig",[495,1741,1742],{"class":504},"(maxCacheSize",[495,1744,515],{"class":514},[495,1746,1747],{"class":526}," 100",[495,1749,530],{"class":504},[495,1751,682],{"class":514},[495,1753,1754,1756],{"class":497,"line":540},[495,1755,530],{"class":504},[495,1757,908],{"class":514},[353,1759,1760,1761,938,1763,1766,1767,1770,1771,1774],{},"Chaque appel à ",[357,1762,924],{},[357,1764,1765],{},"watchQuery"," ou ",[357,1768,1769],{},"getQueryData"," met à jour ",[357,1772,1773],{},"lastAccessedAt",", maintenant les entrées en vie dans le classement LRU.",[403,1776],{},[348,1778,1780],{"id":1779},"contrôle-manuel-du-cache","Contrôle manuel du cache",[1021,1782,1784],{"id":1783},"lire-le-cache","Lire le cache",[393,1786,1788],{"className":488,"code":1787,"filename":490,"language":491,"meta":399,"style":399},"// Obtenir uniquement les données (null si pas Success / pas de previousData)\nfinal user = client.getQueryData\u003CUser>(['users', userId]);\n\n// Obtenir l'état complet\nfinal state = client.getQueryState\u003CUser>(['users', userId]);\n\n// Inspecter toutes les clés en cache\nfor (final key in client.cachedKeys) {\n  print(key);\n}\n",[357,1789,1790,1795,1826,1830,1835,1865,1869,1874,1897,1907],{"__ignoreMap":399},[495,1791,1792],{"class":497,"line":498},[495,1793,1794],{"class":536},"// Obtenir uniquement les données (null si pas Success / pas de previousData)\n",[495,1796,1797,1799,1802,1804,1806,1808,1810,1812,1814,1817,1819,1821,1824],{"class":497,"line":508},[495,1798,893],{"class":892},[495,1800,1801],{"class":504}," user ",[495,1803,899],{"class":514},[495,1805,918],{"class":504},[495,1807,742],{"class":514},[495,1809,1769],{"class":923},[495,1811,927],{"class":504},[495,1813,1274],{"class":501},[495,1815,1816],{"class":504},">([",[495,1818,1288],{"class":958},[495,1820,533],{"class":514},[495,1822,1823],{"class":504}," userId])",[495,1825,908],{"class":514},[495,1827,1828],{"class":497,"line":540},[495,1829,607],{"emptyLinePlaceholder":606},[495,1831,1832],{"class":497,"line":564},[495,1833,1834],{"class":536},"// Obtenir l'état complet\n",[495,1836,1837,1839,1842,1844,1846,1848,1851,1853,1855,1857,1859,1861,1863],{"class":497,"line":620},[495,1838,893],{"class":892},[495,1840,1841],{"class":504}," state ",[495,1843,899],{"class":514},[495,1845,918],{"class":504},[495,1847,742],{"class":514},[495,1849,1850],{"class":923},"getQueryState",[495,1852,927],{"class":504},[495,1854,1274],{"class":501},[495,1856,1816],{"class":504},[495,1858,1288],{"class":958},[495,1860,533],{"class":514},[495,1862,1823],{"class":504},[495,1864,908],{"class":514},[495,1866,1867],{"class":497,"line":626},[495,1868,607],{"emptyLinePlaceholder":606},[495,1870,1871],{"class":497,"line":632},[495,1872,1873],{"class":536},"// Inspecter toutes les clés en cache\n",[495,1875,1876,1879,1882,1884,1887,1890,1892,1894],{"class":497,"line":727},[495,1877,1878],{"class":914},"for",[495,1880,1881],{"class":504}," (",[495,1883,893],{"class":892},[495,1885,1886],{"class":504}," key ",[495,1888,1889],{"class":914},"in",[495,1891,918],{"class":504},[495,1893,742],{"class":514},[495,1895,1896],{"class":504},"cachedKeys) {\n",[495,1898,1899,1902,1905],{"class":497,"line":889},[495,1900,1901],{"class":923},"  print",[495,1903,1904],{"class":504},"(key)",[495,1906,908],{"class":514},[495,1908,1909],{"class":497,"line":911},[495,1910,1911],{"class":504},"}\n",[1021,1913,1915],{"id":1914},"écrire-dans-le-cache","Écrire dans le cache",[393,1917,1919],{"className":488,"code":1918,"filename":490,"language":491,"meta":399,"style":399},"// Injecter des données directement : tous les streams watchQuery actifs sont notifiés\nclient.setQueryData\u003CUser>(['users', userId], updatedUser);\n\n// Rollback vers un snapshot précédent\nfinal snapshot = client.getQueryData\u003CUser>(['users', userId]);\nclient.setQueryData(['users', userId], optimisticUser);\n\ntry {\n  await api.updateUser(userId, payload);\n} catch (_) {\n  client.restoreQueryData(['users', userId], snapshot);\n}\n",[357,1920,1921,1926,1954,1958,1963,1992,2016,2020,2028,2050,2061,2086],{"__ignoreMap":399},[495,1922,1923],{"class":497,"line":498},[495,1924,1925],{"class":536},"// Injecter des données directement : tous les streams watchQuery actifs sont notifiés\n",[495,1927,1928,1931,1933,1935,1937,1939,1941,1943,1945,1947,1949,1952],{"class":497,"line":508},[495,1929,1930],{"class":504},"client",[495,1932,742],{"class":514},[495,1934,1209],{"class":923},[495,1936,927],{"class":504},[495,1938,1274],{"class":501},[495,1940,1816],{"class":504},[495,1942,1288],{"class":958},[495,1944,533],{"class":514},[495,1946,1293],{"class":504},[495,1948,533],{"class":514},[495,1950,1951],{"class":504}," updatedUser)",[495,1953,908],{"class":514},[495,1955,1956],{"class":497,"line":540},[495,1957,607],{"emptyLinePlaceholder":606},[495,1959,1960],{"class":497,"line":564},[495,1961,1962],{"class":536},"// Rollback vers un snapshot précédent\n",[495,1964,1965,1967,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990],{"class":497,"line":620},[495,1966,893],{"class":892},[495,1968,1969],{"class":504}," snapshot ",[495,1971,899],{"class":514},[495,1973,918],{"class":504},[495,1975,742],{"class":514},[495,1977,1769],{"class":923},[495,1979,927],{"class":504},[495,1981,1274],{"class":501},[495,1983,1816],{"class":504},[495,1985,1288],{"class":958},[495,1987,533],{"class":514},[495,1989,1823],{"class":504},[495,1991,908],{"class":514},[495,1993,1994,1996,1998,2000,2003,2005,2007,2009,2011,2014],{"class":497,"line":626},[495,1995,1930],{"class":504},[495,1997,742],{"class":514},[495,1999,1209],{"class":923},[495,2001,2002],{"class":504},"([",[495,2004,1288],{"class":958},[495,2006,533],{"class":514},[495,2008,1293],{"class":504},[495,2010,533],{"class":514},[495,2012,2013],{"class":504}," optimisticUser)",[495,2015,908],{"class":514},[495,2017,2018],{"class":497,"line":632},[495,2019,607],{"emptyLinePlaceholder":606},[495,2021,2022,2025],{"class":497,"line":727},[495,2023,2024],{"class":914},"try",[495,2026,2027],{"class":504}," {\n",[495,2029,2030,2033,2035,2037,2040,2043,2045,2048],{"class":497,"line":889},[495,2031,2032],{"class":914},"  await",[495,2034,981],{"class":504},[495,2036,742],{"class":514},[495,2038,2039],{"class":923},"updateUser",[495,2041,2042],{"class":504},"(userId",[495,2044,533],{"class":514},[495,2046,2047],{"class":504}," payload)",[495,2049,908],{"class":514},[495,2051,2052,2055,2058],{"class":497,"line":911},[495,2053,2054],{"class":504},"} ",[495,2056,2057],{"class":914},"catch",[495,2059,2060],{"class":504}," (_) {\n",[495,2062,2063,2066,2068,2071,2073,2075,2077,2079,2081,2084],{"class":497,"line":947},[495,2064,2065],{"class":504},"  client",[495,2067,742],{"class":514},[495,2069,2070],{"class":923},"restoreQueryData",[495,2072,2002],{"class":504},[495,2074,1288],{"class":958},[495,2076,533],{"class":514},[495,2078,1293],{"class":504},[495,2080,533],{"class":514},[495,2082,2083],{"class":504}," snapshot)",[495,2085,908],{"class":514},[495,2087,2088],{"class":497,"line":967},[495,2089,1911],{"class":504},[1021,2091,2093],{"id":2092},"invalider-marquer-comme-périmé","Invalider (marquer comme périmé)",[393,2095,2097],{"className":488,"code":2096,"filename":490,"language":491,"meta":399,"style":399},"// Clé unique : les streams actifs passent immédiatement à Loading\nclient.invalidate(['users', userId]);\n\n// Plusieurs clés via prédicat\nclient.invalidateWhere((key) => key.firstOrNull == 'users');\n\n// Basée sur des tags : revalider toutes les requêtes fournissant le tag 'post'\nclient.invalidateTags([QueryTag('post')]);\n\n// Ressource spécifique : revalider uniquement les requêtes avec QueryTag('post', '123')\nclient.invalidateTags([QueryTag('post', '123')]);\n",[357,2098,2099,2104,2123,2127,2132,2163,2167,2172,2196,2200,2205],{"__ignoreMap":399},[495,2100,2101],{"class":497,"line":498},[495,2102,2103],{"class":536},"// Clé unique : les streams actifs passent immédiatement à Loading\n",[495,2105,2106,2108,2110,2113,2115,2117,2119,2121],{"class":497,"line":508},[495,2107,1930],{"class":504},[495,2109,742],{"class":514},[495,2111,2112],{"class":923},"invalidate",[495,2114,2002],{"class":504},[495,2116,1288],{"class":958},[495,2118,533],{"class":514},[495,2120,1823],{"class":504},[495,2122,908],{"class":514},[495,2124,2125],{"class":497,"line":540},[495,2126,607],{"emptyLinePlaceholder":606},[495,2128,2129],{"class":497,"line":564},[495,2130,2131],{"class":536},"// Plusieurs clés via prédicat\n",[495,2133,2134,2136,2138,2141,2144,2146,2149,2151,2154,2156,2159,2161],{"class":497,"line":620},[495,2135,1930],{"class":504},[495,2137,742],{"class":514},[495,2139,2140],{"class":923},"invalidateWhere",[495,2142,2143],{"class":504},"((key) ",[495,2145,978],{"class":514},[495,2147,2148],{"class":504}," key",[495,2150,742],{"class":514},[495,2152,2153],{"class":504},"firstOrNull ",[495,2155,1055],{"class":514},[495,2157,2158],{"class":958}," 'users'",[495,2160,530],{"class":504},[495,2162,908],{"class":514},[495,2164,2165],{"class":497,"line":626},[495,2166,607],{"emptyLinePlaceholder":606},[495,2168,2169],{"class":497,"line":632},[495,2170,2171],{"class":536},"// Basée sur des tags : revalider toutes les requêtes fournissant le tag 'post'\n",[495,2173,2174,2176,2178,2181,2183,2186,2189,2191,2194],{"class":497,"line":727},[495,2175,1930],{"class":504},[495,2177,742],{"class":514},[495,2179,2180],{"class":923},"invalidateTags",[495,2182,2002],{"class":504},[495,2184,2185],{"class":501},"QueryTag",[495,2187,2188],{"class":504},"(",[495,2190,1432],{"class":958},[495,2192,2193],{"class":504},")])",[495,2195,908],{"class":514},[495,2197,2198],{"class":497,"line":889},[495,2199,607],{"emptyLinePlaceholder":606},[495,2201,2202],{"class":497,"line":911},[495,2203,2204],{"class":536},"// Ressource spécifique : revalider uniquement les requêtes avec QueryTag('post', '123')\n",[495,2206,2207,2209,2211,2213,2215,2217,2219,2221,2223,2226,2228],{"class":497,"line":947},[495,2208,1930],{"class":504},[495,2210,742],{"class":514},[495,2212,2180],{"class":923},[495,2214,2002],{"class":504},[495,2216,2185],{"class":501},[495,2218,2188],{"class":504},[495,2220,1432],{"class":958},[495,2222,533],{"class":514},[495,2224,2225],{"class":958}," '123'",[495,2227,2193],{"class":504},[495,2229,908],{"class":514},[353,2231,2232,2233,2236,2237,2239,2240,2236,2243,2246],{},"L'invalidation basée sur les tags est l'approche la plus flexible. Les requêtes déclarent des tags via ",[357,2234,2235],{},"providesTags"," dans ",[357,2238,215],{},". Les mutations déclarent des tags via ",[357,2241,2242],{},"invalidatesTags",[357,2244,2245],{},"MutationOptions",". Les tags découplent l'invalidation de la structure des clés de requête : vous pouvez invalider des requêtes avec différents motifs de clés en un seul tag.",[393,2248,2250],{"className":488,"code":2249,"filename":490,"language":491,"meta":399,"style":399},"options: QoraOptions(\n  providesTags: [QueryTag('post'), QueryTag('user', userId)],\n)\n",[357,2251,2252,2262,2295],{"__ignoreMap":399},[495,2253,2254,2256,2258,2260],{"class":497,"line":498},[495,2255,656],{"class":504},[495,2257,515],{"class":514},[495,2259,661],{"class":501},[495,2261,505],{"class":504},[495,2263,2264,2267,2269,2271,2273,2275,2277,2279,2281,2284,2286,2288,2290,2293],{"class":497,"line":508},[495,2265,2266],{"class":504},"  providesTags",[495,2268,515],{"class":514},[495,2270,955],{"class":504},[495,2272,2185],{"class":501},[495,2274,2188],{"class":504},[495,2276,1432],{"class":958},[495,2278,530],{"class":504},[495,2280,533],{"class":514},[495,2282,2283],{"class":501}," QueryTag",[495,2285,2188],{"class":504},[495,2287,1083],{"class":958},[495,2289,533],{"class":514},[495,2291,2292],{"class":504}," userId)]",[495,2294,682],{"class":514},[495,2296,2297],{"class":497,"line":540},[495,2298,567],{"class":504},[353,2300,2301,2302,1059,2307,742],{},"Voir ",[2303,2304,2306],"a",{"href":2305},"../api-reference/qora-mutation#invalidatestags","MutationOptions.invalidatesTags",[2303,2308,2310],{"href":2309},"../api-reference/qora-options#providestags","QoraOptions.providesTags",[1021,2312,2314],{"id":2313},"supprimer-et-vider","Supprimer et vider",[393,2316,2318],{"className":488,"code":2317,"filename":490,"language":491,"meta":399,"style":399},"// Supprimer une entrée unique (GC immédiat)\nclient.removeQuery(['users', userId]);\n\n// Vider le cache entier (ex. lors d'une déconnexion)\nclient.clear();\n",[357,2319,2320,2325,2344,2348,2353],{"__ignoreMap":399},[495,2321,2322],{"class":497,"line":498},[495,2323,2324],{"class":536},"// Supprimer une entrée unique (GC immédiat)\n",[495,2326,2327,2329,2331,2334,2336,2338,2340,2342],{"class":497,"line":508},[495,2328,1930],{"class":504},[495,2330,742],{"class":514},[495,2332,2333],{"class":923},"removeQuery",[495,2335,2002],{"class":504},[495,2337,1288],{"class":958},[495,2339,533],{"class":514},[495,2341,1823],{"class":504},[495,2343,908],{"class":514},[495,2345,2346],{"class":497,"line":540},[495,2347,607],{"emptyLinePlaceholder":606},[495,2349,2350],{"class":497,"line":564},[495,2351,2352],{"class":536},"// Vider le cache entier (ex. lors d'une déconnexion)\n",[495,2354,2355,2357,2359,2362,2364],{"class":497,"line":620},[495,2356,1930],{"class":504},[495,2358,742],{"class":514},[495,2360,2361],{"class":923},"clear",[495,2363,905],{"class":504},[495,2365,908],{"class":514},[403,2367],{},[348,2369,2371,2372],{"id":2370},"callback-oncacheevict","Callback ",[357,2373,2374],{},"onCacheEvict",[353,2376,2377],{},"Réagir aux évictions de cache pour le logging ou la synchronisation du stockage :",[393,2379,2381],{"className":488,"code":2380,"filename":490,"language":491,"meta":399,"style":399},"final client = QoraClient(\n  config: QoraClientConfig(\n    onCacheEvict: (key) {\n      analytics.track('cache_evict', {'key': key.toString()});\n    },\n  ),\n);\n",[357,2382,2383,2395,2405,2415,2451,2458,2464],{"__ignoreMap":399},[495,2384,2385,2387,2389,2391,2393],{"class":497,"line":498},[495,2386,893],{"class":892},[495,2388,896],{"class":504},[495,2390,899],{"class":514},[495,2392,902],{"class":501},[495,2394,505],{"class":504},[495,2396,2397,2399,2401,2403],{"class":497,"line":508},[495,2398,1734],{"class":504},[495,2400,515],{"class":514},[495,2402,1739],{"class":501},[495,2404,505],{"class":504},[495,2406,2407,2410,2412],{"class":497,"line":540},[495,2408,2409],{"class":504},"    onCacheEvict",[495,2411,515],{"class":514},[495,2413,2414],{"class":504}," (key) {\n",[495,2416,2417,2420,2422,2425,2427,2430,2432,2434,2437,2439,2441,2443,2446,2449],{"class":497,"line":564},[495,2418,2419],{"class":504},"      analytics",[495,2421,742],{"class":514},[495,2423,2424],{"class":923},"track",[495,2426,2188],{"class":504},[495,2428,2429],{"class":958},"'cache_evict'",[495,2431,533],{"class":514},[495,2433,1080],{"class":504},[495,2435,2436],{"class":958},"'key'",[495,2438,515],{"class":514},[495,2440,2148],{"class":504},[495,2442,742],{"class":514},[495,2444,2445],{"class":923},"toString",[495,2447,2448],{"class":504},"()})",[495,2450,908],{"class":514},[495,2452,2453,2456],{"class":497,"line":620},[495,2454,2455],{"class":504},"    }",[495,2457,682],{"class":514},[495,2459,2460,2462],{"class":497,"line":626},[495,2461,1377],{"class":504},[495,2463,682],{"class":514},[495,2465,2466,2468],{"class":497,"line":632},[495,2467,530],{"class":504},[495,2469,908],{"class":514},[403,2471],{},[348,2473,2475],{"id":2474},"snapshot-de-debug","Snapshot de debug",[393,2477,2479],{"className":488,"code":2478,"filename":490,"language":491,"meta":399,"style":399},"print(client.debugInfo());\n// {\n//   total_queries: 12,\n//   active_queries: 3,\n//   inactive_queries: 9,\n//   non_success_queries: 1,\n//   pending_requests: 2,\n//   max_size: 100,\n//   keys: [['users', 1], ['posts'], ...]\n// }\n",[357,2480,2481,2499,2504,2509,2514,2519,2524,2529,2534,2539],{"__ignoreMap":399},[495,2482,2483,2486,2489,2491,2494,2497],{"class":497,"line":498},[495,2484,2485],{"class":923},"print",[495,2487,2488],{"class":504},"(client",[495,2490,742],{"class":514},[495,2492,2493],{"class":923},"debugInfo",[495,2495,2496],{"class":504},"())",[495,2498,908],{"class":514},[495,2500,2501],{"class":497,"line":508},[495,2502,2503],{"class":536},"// {\n",[495,2505,2506],{"class":497,"line":540},[495,2507,2508],{"class":536},"//   total_queries: 12,\n",[495,2510,2511],{"class":497,"line":564},[495,2512,2513],{"class":536},"//   active_queries: 3,\n",[495,2515,2516],{"class":497,"line":620},[495,2517,2518],{"class":536},"//   inactive_queries: 9,\n",[495,2520,2521],{"class":497,"line":626},[495,2522,2523],{"class":536},"//   non_success_queries: 1,\n",[495,2525,2526],{"class":497,"line":632},[495,2527,2528],{"class":536},"//   pending_requests: 2,\n",[495,2530,2531],{"class":497,"line":727},[495,2532,2533],{"class":536},"//   max_size: 100,\n",[495,2535,2536],{"class":497,"line":889},[495,2537,2538],{"class":536},"//   keys: [['users', 1], ['posts'], ...]\n",[495,2540,2541],{"class":497,"line":911},[495,2542,2543],{"class":536},"// }\n",[403,2545],{},[348,2547,2549],{"id":2548},"configuration-globale-vs-par-requête","Configuration globale vs par requête",[353,2551,2552,1059,2554,2556,2557,2560],{},[357,2553,435],{},[357,2555,431],{}," peuvent être définis globalement via ",[357,2558,2559],{},"QoraClientConfig.defaultOptions"," et surchargés par requête :",[393,2562,2564],{"className":488,"code":2563,"filename":490,"language":491,"meta":399,"style":399},"final client = QoraClient(\n  config: QoraClientConfig(\n    defaultOptions: QoraOptions(\n      staleTime: Duration(minutes: 5),  // défaut global\n      gcTime: Duration(minutes: 10),\n    ),\n  ),\n);\n\n// Cette requête surcharge uniquement staleTime\nawait client.fetchQuery\u003CConfig>(\n  key: ['config'],\n  fetcher: api.getConfig,\n  options: QoraOptions(staleTime: Duration(hours: 1)),\n  // gcTime hérite toujours des 10 minutes du global\n);\n",[357,2565,2566,2578,2588,2599,2621,2640,2647,2653,2659,2663,2668,2685,2699,2713,2737,2743],{"__ignoreMap":399},[495,2567,2568,2570,2572,2574,2576],{"class":497,"line":498},[495,2569,893],{"class":892},[495,2571,896],{"class":504},[495,2573,899],{"class":514},[495,2575,902],{"class":501},[495,2577,505],{"class":504},[495,2579,2580,2582,2584,2586],{"class":497,"line":508},[495,2581,1734],{"class":504},[495,2583,515],{"class":514},[495,2585,1739],{"class":501},[495,2587,505],{"class":504},[495,2589,2590,2593,2595,2597],{"class":497,"line":540},[495,2591,2592],{"class":504},"    defaultOptions",[495,2594,515],{"class":514},[495,2596,661],{"class":501},[495,2598,505],{"class":504},[495,2600,2601,2604,2606,2608,2610,2612,2614,2616,2618],{"class":497,"line":564},[495,2602,2603],{"class":504},"      staleTime",[495,2605,515],{"class":514},[495,2607,518],{"class":501},[495,2609,521],{"class":504},[495,2611,515],{"class":514},[495,2613,527],{"class":526},[495,2615,530],{"class":504},[495,2617,533],{"class":514},[495,2619,2620],{"class":536},"  // défaut global\n",[495,2622,2623,2626,2628,2630,2632,2634,2636,2638],{"class":497,"line":620},[495,2624,2625],{"class":504},"      gcTime",[495,2627,515],{"class":514},[495,2629,518],{"class":501},[495,2631,521],{"class":504},[495,2633,515],{"class":514},[495,2635,554],{"class":526},[495,2637,530],{"class":504},[495,2639,682],{"class":514},[495,2641,2642,2645],{"class":497,"line":626},[495,2643,2644],{"class":504},"    )",[495,2646,682],{"class":514},[495,2648,2649,2651],{"class":497,"line":632},[495,2650,1377],{"class":504},[495,2652,682],{"class":514},[495,2654,2655,2657],{"class":497,"line":727},[495,2656,530],{"class":504},[495,2658,908],{"class":514},[495,2660,2661],{"class":497,"line":889},[495,2662,607],{"emptyLinePlaceholder":606},[495,2664,2665],{"class":497,"line":911},[495,2666,2667],{"class":536},"// Cette requête surcharge uniquement staleTime\n",[495,2669,2670,2672,2674,2676,2678,2680,2683],{"class":497,"line":947},[495,2671,915],{"class":914},[495,2673,918],{"class":504},[495,2675,742],{"class":514},[495,2677,924],{"class":923},[495,2679,927],{"class":504},[495,2681,2682],{"class":501},"Config",[495,2684,1277],{"class":504},[495,2686,2687,2689,2691,2693,2695,2697],{"class":497,"line":967},[495,2688,950],{"class":504},[495,2690,515],{"class":514},[495,2692,955],{"class":504},[495,2694,959],{"class":958},[495,2696,962],{"class":504},[495,2698,682],{"class":514},[495,2700,2701,2703,2705,2707,2709,2711],{"class":497,"line":993},[495,2702,970],{"class":504},[495,2704,515],{"class":514},[495,2706,981],{"class":504},[495,2708,742],{"class":514},[495,2710,986],{"class":504},[495,2712,682],{"class":514},[495,2714,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735],{"class":497,"line":1015},[495,2716,996],{"class":504},[495,2718,515],{"class":514},[495,2720,661],{"class":501},[495,2722,664],{"class":504},[495,2724,515],{"class":514},[495,2726,518],{"class":501},[495,2728,671],{"class":504},[495,2730,515],{"class":514},[495,2732,676],{"class":526},[495,2734,679],{"class":504},[495,2736,682],{"class":514},[495,2738,2740],{"class":497,"line":2739},15,[495,2741,2742],{"class":536},"  // gcTime hérite toujours des 10 minutes du global\n",[495,2744,2746,2748],{"class":497,"line":2745},16,[495,2747,530],{"class":504},[495,2749,908],{"class":514},[403,2751],{},[348,2753,2755],{"id":2754},"étapes-suivantes","Étapes suivantes",[366,2757,2758,2764,2770],{},[369,2759,2760,2763],{},[2303,2761,72],{"href":2762},"./stale-while-revalidate"," : Fonctionnement de la revalidation en arrière-plan",[369,2765,2766,2769],{},[2303,2767,77],{"href":2768},"./deduplication"," : Une seule requête réseau pour de nombreux appelants",[369,2771,2772,2775],{},[2303,2773,2774],{"href":221},"API QoraClientConfig"," : Référence de configuration complète",[2777,2778,2779],"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":399,"searchDepth":508,"depth":508,"links":2781},[2782,2783,2784,2786,2788,2790,2795,2801,2802,2803,2809,2811,2812,2813],{"id":350,"depth":508,"text":351},{"id":407,"depth":508,"text":408},{"id":428,"depth":508,"text":2785},"staleTime vs gcTime",{"id":583,"depth":508,"text":2787},"staleTime en détail",{"id":752,"depth":508,"text":2789},"gcTime en détail",{"id":831,"depth":508,"text":832,"children":2791},[2792,2793,2794],{"id":1023,"depth":540,"text":1024},{"id":1166,"depth":540,"text":1167},{"id":1193,"depth":540,"text":1194},{"id":1230,"depth":508,"text":1231,"children":2796},[2797,2799],{"id":1244,"depth":540,"text":2798},"transform: succès",{"id":1388,"depth":540,"text":2800},"transformError: erreur",{"id":1513,"depth":508,"text":1514},{"id":1683,"depth":508,"text":1684},{"id":1779,"depth":508,"text":1780,"children":2804},[2805,2806,2807,2808],{"id":1783,"depth":540,"text":1784},{"id":1914,"depth":540,"text":1915},{"id":2092,"depth":540,"text":2093},{"id":2313,"depth":540,"text":2314},{"id":2370,"depth":508,"text":2810},"Callback onCacheEvict",{"id":2474,"depth":508,"text":2475},{"id":2548,"depth":508,"text":2549},{"id":2754,"depth":508,"text":2755},"Le cache de Qora permet un accès instantané aux données. Apprenez comment les entrées de cache sont créées, vieillissent et sont collectées par le GC, comment le partage structurel évite les reconstructions inutiles, et comment contrôler chaque comportement.","md",null,{},{"icon":70},{"title":67,"description":2814},"1Eej89ggG73JupNrevWgGm10ZMzIPpnBOPBvB71U5aA",[2822,2824],{"title":62,"path":63,"stem":64,"description":2823,"icon":65,"children":-1},"Les états des requêtes représentent le cycle de vie des opérations de récupération de données. Qora utilise des classes scellées pour fournir une gestion des états exhaustive et sûre au niveau des types, éliminant des catégories entières d'erreurs à l'exécution.",{"title":72,"path":73,"stem":74,"description":2825,"icon":75,"children":-1},"Le SWR de Qora retourne les données en cache immédiatement et revalide en arrière-plan pour maintenir les UIs réactives et les données à jour.",1794040406985]