[{"data":1,"prerenderedAt":3051},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-recipes-prefetch":342,"-fr-recipes-prefetch-surround":3046},[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":192,"body":344,"description":3033,"extension":3034,"links":3035,"meta":3036,"navigation":626,"path":193,"seo":3037,"stem":194,"__hash__":3045},"docs_fr/fr/04.recipes/12.prefetch.md",{"type":345,"value":346,"toc":3015},"minimark",[347,351,354,359,362,416,423,735,737,741,751,767,772,1160,1164,1167,1383,1385,1389,1400,1837,1841,1844,2101,2103,2107,2150,2154,2160,2163,2170,2307,2321,2430,2432,2440,2446,2668,2674,2676,2680,2686,2967,2969,2973,3011],[348,349,350],"p",{},"Le prefetch au niveau des routes garantit que les données sont déjà en cache au moment où l'utilisateur navigue vers un nouvel écran. Ce guide couvre le prefetch par redirection GoRouter, par résolveur AutoRoute, les stratégies de gestion d'erreurs et les compromis entre cache-first et network-first.",[352,353],"hr",{},[355,356,358],"h2",{"id":357},"api-principale","API principale",[348,360,361],{},"Qora fournit trois primitives de prefetch, de la plus déclarative à la plus impérative :",[363,364,365,378],"table",{},[366,367,368],"thead",{},[369,370,371,375],"tr",{},[372,373,374],"th",{},"Primitive",[372,376,377],{},"Quand l'utiliser",[379,380,381,394,405],"tbody",{},[369,382,383,391],{},[384,385,386,390],"td",{},[387,388,389],"code",{},"QoraPrefetch\u003CT>"," (widget)",[384,392,393],{},"Envelopper un enfant déjà dans l'arbre (survol, focus, défilement).",[369,395,396,402],{},[384,397,398,401],{},[387,399,400],{},"context.prefetch\u003CT>()"," (extension)",[384,403,404],{},"Déclenchement impératif depuis un callback de geste ou événement de route.",[369,406,407,413],{},[384,408,409,412],{},[387,410,411],{},"client.prefetch\u003CT>()"," (cœur)",[384,414,415],{},"Tout contexte Dart sans arbre de widgets (gardes de route, résolveurs).",[348,417,418,419,422],{},"Les trois sont sans effet quand des données fraîches existent déjà pour la ",[387,420,421],{},"queryKey"," donnée. Le prefetch s'exécute une fois par clé ; les appels répétés sont sûrs et peu coûteux.",[424,425,431],"pre",{"className":426,"code":427,"filename":428,"language":429,"meta":430,"style":430},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Widget : envelopper un enfant qui implique \"susceptible de naviguer\"\nMouseRegion(\n  onEnter: (_) => setState(() => _prefetch = true),\n  child: _prefetch\n      ? QoraPrefetch\u003CUser>(\n          queryKey: ['user', userId],\n          fetcher: () => api.getUser(userId),\n          child: UserListTile(userId: userId),\n        )\n      : UserListTile(userId: userId),\n)\n\n// Impératif : appeler depuis n'importe quel callback\nGestureDetector(\n  onLongPress: () => context.prefetch\u003CUser>(\n    key: ['user', userId],\n    fetcher: () => api.getUser(userId),\n  ),\n  child: UserTile(userId),\n)\n","lib/features/user_detail_screen.dart","dart","",[387,432,433,442,453,493,504,522,545,572,593,599,615,621,628,634,642,668,686,708,716,730],{"__ignoreMap":430},[434,435,438],"span",{"class":436,"line":437},"line",1,[434,439,441],{"class":440},"sHwdD","// Widget : envelopper un enfant qui implique \"susceptible de naviguer\"\n",[434,443,445,449],{"class":436,"line":444},2,[434,446,448],{"class":447},"sBMFI","MouseRegion",[434,450,452],{"class":451},"sTEyZ","(\n",[434,454,456,459,463,466,469,473,476,478,481,484,487,490],{"class":436,"line":455},3,[434,457,458],{"class":451},"  onEnter",[434,460,462],{"class":461},"sMK4o",":",[434,464,465],{"class":451}," (_) ",[434,467,468],{"class":461},"=>",[434,470,472],{"class":471},"s2Zo4"," setState",[434,474,475],{"class":451},"(() ",[434,477,468],{"class":461},[434,479,480],{"class":451}," _prefetch ",[434,482,483],{"class":461},"=",[434,485,486],{"class":461}," true",[434,488,489],{"class":451},")",[434,491,492],{"class":461},",\n",[434,494,496,499,501],{"class":436,"line":495},4,[434,497,498],{"class":451},"  child",[434,500,462],{"class":461},[434,502,503],{"class":451}," _prefetch\n",[434,505,507,510,513,516,519],{"class":436,"line":506},5,[434,508,509],{"class":461},"      ?",[434,511,512],{"class":447}," QoraPrefetch",[434,514,515],{"class":451},"\u003C",[434,517,518],{"class":447},"User",[434,520,521],{"class":451},">(\n",[434,523,525,528,530,533,537,540,543],{"class":436,"line":524},6,[434,526,527],{"class":451},"          queryKey",[434,529,462],{"class":461},[434,531,532],{"class":451}," [",[434,534,536],{"class":535},"sfazB","'user'",[434,538,539],{"class":461},",",[434,541,542],{"class":451}," userId]",[434,544,492],{"class":461},[434,546,548,551,553,556,558,561,564,567,570],{"class":436,"line":547},7,[434,549,550],{"class":451},"          fetcher",[434,552,462],{"class":461},[434,554,555],{"class":451}," () ",[434,557,468],{"class":461},[434,559,560],{"class":451}," api",[434,562,563],{"class":461},".",[434,565,566],{"class":471},"getUser",[434,568,569],{"class":451},"(userId)",[434,571,492],{"class":461},[434,573,575,578,580,583,586,588,591],{"class":436,"line":574},8,[434,576,577],{"class":451},"          child",[434,579,462],{"class":461},[434,581,582],{"class":447}," UserListTile",[434,584,585],{"class":451},"(userId",[434,587,462],{"class":461},[434,589,590],{"class":451}," userId)",[434,592,492],{"class":461},[434,594,596],{"class":436,"line":595},9,[434,597,598],{"class":451},"        )\n",[434,600,602,605,607,609,611,613],{"class":436,"line":601},10,[434,603,604],{"class":461},"      :",[434,606,582],{"class":447},[434,608,585],{"class":451},[434,610,462],{"class":461},[434,612,590],{"class":451},[434,614,492],{"class":461},[434,616,618],{"class":436,"line":617},11,[434,619,620],{"class":451},")\n",[434,622,624],{"class":436,"line":623},12,[434,625,627],{"emptyLinePlaceholder":626},true,"\n",[434,629,631],{"class":436,"line":630},13,[434,632,633],{"class":440},"// Impératif : appeler depuis n'importe quel callback\n",[434,635,637,640],{"class":436,"line":636},14,[434,638,639],{"class":447},"GestureDetector",[434,641,452],{"class":451},[434,643,645,648,650,652,654,657,659,662,664,666],{"class":436,"line":644},15,[434,646,647],{"class":451},"  onLongPress",[434,649,462],{"class":461},[434,651,555],{"class":451},[434,653,468],{"class":461},[434,655,656],{"class":451}," context",[434,658,563],{"class":461},[434,660,661],{"class":471},"prefetch",[434,663,515],{"class":451},[434,665,518],{"class":447},[434,667,521],{"class":451},[434,669,671,674,676,678,680,682,684],{"class":436,"line":670},16,[434,672,673],{"class":451},"    key",[434,675,462],{"class":461},[434,677,532],{"class":451},[434,679,536],{"class":535},[434,681,539],{"class":461},[434,683,542],{"class":451},[434,685,492],{"class":461},[434,687,689,692,694,696,698,700,702,704,706],{"class":436,"line":688},17,[434,690,691],{"class":451},"    fetcher",[434,693,462],{"class":461},[434,695,555],{"class":451},[434,697,468],{"class":461},[434,699,560],{"class":451},[434,701,563],{"class":461},[434,703,566],{"class":471},[434,705,569],{"class":451},[434,707,492],{"class":461},[434,709,711,714],{"class":436,"line":710},18,[434,712,713],{"class":451},"  )",[434,715,492],{"class":461},[434,717,719,721,723,726,728],{"class":436,"line":718},19,[434,720,498],{"class":451},[434,722,462],{"class":461},[434,724,725],{"class":447}," UserTile",[434,727,569],{"class":451},[434,729,492],{"class":461},[434,731,733],{"class":436,"line":732},20,[434,734,620],{"class":451},[352,736],{},[355,738,740],{"id":739},"gorouter-prefetch-par-redirection","GoRouter : Prefetch par Redirection",[348,742,743,744,747,748,750],{},"GoRouter prend en charge les callbacks ",[387,745,746],{},"redirect"," qui s'exécutent avant qu'une route ne soit activée. Utilisez-les pour précharger les données de manière synchrone (fire-and-forget), puis laissez la garde de route continuer immédiatement. Lorsque le widget d'écran monte, son ",[387,749,108],{}," lit depuis le cache sans attente réseau.",[752,753,754,755,757,758,762,763,766],"tip",{},"Le callback ",[387,756,746],{}," s'exécute de manière synchrone. Le prefetch est de type fire-and-forget : ",[759,760,761],"strong",{},"ne pas"," ",[387,764,765],{},"await"," le prefetch, ou vous bloquerez la transition de navigation.",[768,769,771],"h3",{"id":770},"implémentation","Implémentation",[424,773,776],{"className":426,"code":774,"filename":775,"language":429,"meta":430,"style":430},"import 'package:go_router/go_router.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nfinal _client = QoraClient();\n\nfinal appRouter = GoRouter(\n  routes: [\n    GoRoute(\n      path: '/users',\n      builder: (_, __) => const UserListScreen(),\n      routes: [\n        GoRoute(\n          path: ':id',\n          redirect: (context, state) {\n            // Précharger le détail utilisateur pendant que la liste est visible.\n            final userId = state.pathParameters['id']!;\n            _client.prefetch\u003CUser>(\n              key: ['user', userId],\n              fetcher: () => api.getUser(userId),\n            ).ignore(); // fire-and-forget\n            return null; // continuer vers la route\n          },\n          builder: (_, state) {\n            final userId = state.pathParameters['id']!;\n            return UserDetailScreen(userId: userId);\n          },\n        ),\n      ],\n    ),\n  ],\n);\n","lib/app_router.dart",[387,777,778,790,799,803,822,826,840,850,857,869,896,905,912,924,939,944,971,986,1003,1024,1042,1055,1063,1077,1098,1114,1121,1129,1137,1145,1153],{"__ignoreMap":430},[434,779,780,784,787],{"class":436,"line":437},[434,781,783],{"class":782},"sbssI","import",[434,785,786],{"class":535}," 'package:go_router/go_router.dart'",[434,788,789],{"class":461},";\n",[434,791,792,794,797],{"class":436,"line":444},[434,793,783],{"class":782},[434,795,796],{"class":535}," 'package:qora_flutter/qora_flutter.dart'",[434,798,789],{"class":461},[434,800,801],{"class":436,"line":455},[434,802,627],{"emptyLinePlaceholder":626},[434,804,805,809,812,814,817,820],{"class":436,"line":495},[434,806,808],{"class":807},"spNyl","final",[434,810,811],{"class":451}," _client ",[434,813,483],{"class":461},[434,815,816],{"class":447}," QoraClient",[434,818,819],{"class":451},"()",[434,821,789],{"class":461},[434,823,824],{"class":436,"line":506},[434,825,627],{"emptyLinePlaceholder":626},[434,827,828,830,833,835,838],{"class":436,"line":524},[434,829,808],{"class":807},[434,831,832],{"class":451}," appRouter ",[434,834,483],{"class":461},[434,836,837],{"class":447}," GoRouter",[434,839,452],{"class":451},[434,841,842,845,847],{"class":436,"line":547},[434,843,844],{"class":451},"  routes",[434,846,462],{"class":461},[434,848,849],{"class":451}," [\n",[434,851,852,855],{"class":436,"line":574},[434,853,854],{"class":447},"    GoRoute",[434,856,452],{"class":451},[434,858,859,862,864,867],{"class":436,"line":595},[434,860,861],{"class":451},"      path",[434,863,462],{"class":461},[434,865,866],{"class":535}," '/users'",[434,868,492],{"class":461},[434,870,871,874,876,879,881,884,886,889,892,894],{"class":436,"line":601},[434,872,873],{"class":451},"      builder",[434,875,462],{"class":461},[434,877,878],{"class":451}," (_",[434,880,539],{"class":461},[434,882,883],{"class":451}," __) ",[434,885,468],{"class":461},[434,887,888],{"class":807}," const",[434,890,891],{"class":447}," UserListScreen",[434,893,819],{"class":451},[434,895,492],{"class":461},[434,897,898,901,903],{"class":436,"line":617},[434,899,900],{"class":451},"      routes",[434,902,462],{"class":461},[434,904,849],{"class":451},[434,906,907,910],{"class":436,"line":623},[434,908,909],{"class":447},"        GoRoute",[434,911,452],{"class":451},[434,913,914,917,919,922],{"class":436,"line":630},[434,915,916],{"class":451},"          path",[434,918,462],{"class":461},[434,920,921],{"class":535}," ':id'",[434,923,492],{"class":461},[434,925,926,929,931,934,936],{"class":436,"line":636},[434,927,928],{"class":451},"          redirect",[434,930,462],{"class":461},[434,932,933],{"class":451}," (context",[434,935,539],{"class":461},[434,937,938],{"class":451}," state) {\n",[434,940,941],{"class":436,"line":644},[434,942,943],{"class":440},"            // Précharger le détail utilisateur pendant que la liste est visible.\n",[434,945,946,949,952,954,957,959,962,965,968],{"class":436,"line":670},[434,947,948],{"class":807},"            final",[434,950,951],{"class":451}," userId ",[434,953,483],{"class":461},[434,955,956],{"class":451}," state",[434,958,563],{"class":461},[434,960,961],{"class":451},"pathParameters[",[434,963,964],{"class":535},"'id'",[434,966,967],{"class":451},"]",[434,969,970],{"class":461},"!;\n",[434,972,973,976,978,980,982,984],{"class":436,"line":688},[434,974,975],{"class":451},"            _client",[434,977,563],{"class":461},[434,979,661],{"class":471},[434,981,515],{"class":451},[434,983,518],{"class":447},[434,985,521],{"class":451},[434,987,988,991,993,995,997,999,1001],{"class":436,"line":710},[434,989,990],{"class":451},"              key",[434,992,462],{"class":461},[434,994,532],{"class":451},[434,996,536],{"class":535},[434,998,539],{"class":461},[434,1000,542],{"class":451},[434,1002,492],{"class":461},[434,1004,1005,1008,1010,1012,1014,1016,1018,1020,1022],{"class":436,"line":718},[434,1006,1007],{"class":451},"              fetcher",[434,1009,462],{"class":461},[434,1011,555],{"class":451},[434,1013,468],{"class":461},[434,1015,560],{"class":451},[434,1017,563],{"class":461},[434,1019,566],{"class":471},[434,1021,569],{"class":451},[434,1023,492],{"class":461},[434,1025,1026,1029,1031,1034,1036,1039],{"class":436,"line":732},[434,1027,1028],{"class":451},"            )",[434,1030,563],{"class":461},[434,1032,1033],{"class":471},"ignore",[434,1035,819],{"class":451},[434,1037,1038],{"class":461},";",[434,1040,1041],{"class":440}," // fire-and-forget\n",[434,1043,1045,1049,1052],{"class":436,"line":1044},21,[434,1046,1048],{"class":1047},"s7zQu","            return",[434,1050,1051],{"class":461}," null;",[434,1053,1054],{"class":440}," // continuer vers la route\n",[434,1056,1058,1061],{"class":436,"line":1057},22,[434,1059,1060],{"class":451},"          }",[434,1062,492],{"class":461},[434,1064,1066,1069,1071,1073,1075],{"class":436,"line":1065},23,[434,1067,1068],{"class":451},"          builder",[434,1070,462],{"class":461},[434,1072,878],{"class":451},[434,1074,539],{"class":461},[434,1076,938],{"class":451},[434,1078,1080,1082,1084,1086,1088,1090,1092,1094,1096],{"class":436,"line":1079},24,[434,1081,948],{"class":807},[434,1083,951],{"class":451},[434,1085,483],{"class":461},[434,1087,956],{"class":451},[434,1089,563],{"class":461},[434,1091,961],{"class":451},[434,1093,964],{"class":535},[434,1095,967],{"class":451},[434,1097,970],{"class":461},[434,1099,1101,1103,1106,1108,1110,1112],{"class":436,"line":1100},25,[434,1102,1048],{"class":1047},[434,1104,1105],{"class":447}," UserDetailScreen",[434,1107,585],{"class":451},[434,1109,462],{"class":461},[434,1111,590],{"class":451},[434,1113,789],{"class":461},[434,1115,1117,1119],{"class":436,"line":1116},26,[434,1118,1060],{"class":451},[434,1120,492],{"class":461},[434,1122,1124,1127],{"class":436,"line":1123},27,[434,1125,1126],{"class":451},"        )",[434,1128,492],{"class":461},[434,1130,1132,1135],{"class":436,"line":1131},28,[434,1133,1134],{"class":451},"      ]",[434,1136,492],{"class":461},[434,1138,1140,1143],{"class":436,"line":1139},29,[434,1141,1142],{"class":451},"    )",[434,1144,492],{"class":461},[434,1146,1148,1151],{"class":436,"line":1147},30,[434,1149,1150],{"class":451},"  ]",[434,1152,492],{"class":461},[434,1154,1156,1158],{"class":436,"line":1155},31,[434,1157,489],{"class":451},[434,1159,789],{"class":461},[768,1161,1163],{"id":1162},"avec-gestion-derreurs","Avec gestion d'erreurs",[348,1165,1166],{},"Les échecs de prefetch ne doivent jamais bloquer la navigation. Enveloppez le fetcher dans un try/catch et logguez les erreurs pour l'observabilité :",[424,1168,1170],{"className":426,"code":1169,"filename":775,"language":429,"meta":430,"style":430},"redirect: (context, state) {\n  final userId = state.pathParameters['id']!;\n  _client.prefetch\u003CUser>(\n    key: ['user', userId],\n    fetcher: () async {\n      try {\n        return await api.getUser(userId);\n      } catch (e, s) {\n        log('Échec du prefetch pour user $userId', error: e, stackTrace: s);\n        rethrow; // toujours capturé par l'état Failure de Qora\n      }\n    },\n  ).ignore();\n  return null;\n},\n",[387,1171,1172,1184,1205,1220,1236,1250,1257,1275,1291,1334,1344,1349,1356,1368,1376],{"__ignoreMap":430},[434,1173,1174,1176,1178,1180,1182],{"class":436,"line":437},[434,1175,746],{"class":451},[434,1177,462],{"class":461},[434,1179,933],{"class":451},[434,1181,539],{"class":461},[434,1183,938],{"class":451},[434,1185,1186,1189,1191,1193,1195,1197,1199,1201,1203],{"class":436,"line":444},[434,1187,1188],{"class":807},"  final",[434,1190,951],{"class":451},[434,1192,483],{"class":461},[434,1194,956],{"class":451},[434,1196,563],{"class":461},[434,1198,961],{"class":451},[434,1200,964],{"class":535},[434,1202,967],{"class":451},[434,1204,970],{"class":461},[434,1206,1207,1210,1212,1214,1216,1218],{"class":436,"line":455},[434,1208,1209],{"class":451},"  _client",[434,1211,563],{"class":461},[434,1213,661],{"class":471},[434,1215,515],{"class":451},[434,1217,518],{"class":447},[434,1219,521],{"class":451},[434,1221,1222,1224,1226,1228,1230,1232,1234],{"class":436,"line":495},[434,1223,673],{"class":451},[434,1225,462],{"class":461},[434,1227,532],{"class":451},[434,1229,536],{"class":535},[434,1231,539],{"class":461},[434,1233,542],{"class":451},[434,1235,492],{"class":461},[434,1237,1238,1240,1242,1244,1247],{"class":436,"line":506},[434,1239,691],{"class":451},[434,1241,462],{"class":461},[434,1243,555],{"class":451},[434,1245,1246],{"class":1047},"async",[434,1248,1249],{"class":451}," {\n",[434,1251,1252,1255],{"class":436,"line":524},[434,1253,1254],{"class":1047},"      try",[434,1256,1249],{"class":451},[434,1258,1259,1262,1265,1267,1269,1271,1273],{"class":436,"line":547},[434,1260,1261],{"class":1047},"        return",[434,1263,1264],{"class":1047}," await",[434,1266,560],{"class":451},[434,1268,563],{"class":461},[434,1270,566],{"class":471},[434,1272,569],{"class":451},[434,1274,789],{"class":461},[434,1276,1277,1280,1283,1286,1288],{"class":436,"line":574},[434,1278,1279],{"class":451},"      } ",[434,1281,1282],{"class":1047},"catch",[434,1284,1285],{"class":451}," (e",[434,1287,539],{"class":461},[434,1289,1290],{"class":451}," s) {\n",[434,1292,1293,1296,1299,1302,1305,1309,1312,1314,1317,1319,1322,1324,1327,1329,1332],{"class":436,"line":595},[434,1294,1295],{"class":471},"        log",[434,1297,1298],{"class":451},"(",[434,1300,1301],{"class":535},"'Échec du prefetch pour user ",[434,1303,1304],{"class":451},"$",[434,1306,1308],{"class":1307},"sHdIc","userId",[434,1310,1311],{"class":535},"'",[434,1313,539],{"class":461},[434,1315,1316],{"class":451}," error",[434,1318,462],{"class":461},[434,1320,1321],{"class":451}," e",[434,1323,539],{"class":461},[434,1325,1326],{"class":451}," stackTrace",[434,1328,462],{"class":461},[434,1330,1331],{"class":451}," s)",[434,1333,789],{"class":461},[434,1335,1336,1339,1341],{"class":436,"line":601},[434,1337,1338],{"class":1047},"        rethrow",[434,1340,1038],{"class":461},[434,1342,1343],{"class":440}," // toujours capturé par l'état Failure de Qora\n",[434,1345,1346],{"class":436,"line":617},[434,1347,1348],{"class":451},"      }\n",[434,1350,1351,1354],{"class":436,"line":623},[434,1352,1353],{"class":451},"    }",[434,1355,492],{"class":461},[434,1357,1358,1360,1362,1364,1366],{"class":436,"line":630},[434,1359,713],{"class":451},[434,1361,563],{"class":461},[434,1363,1033],{"class":471},[434,1365,819],{"class":451},[434,1367,789],{"class":461},[434,1369,1370,1373],{"class":436,"line":636},[434,1371,1372],{"class":1047},"  return",[434,1374,1375],{"class":461}," null;\n",[434,1377,1378,1381],{"class":436,"line":644},[434,1379,1380],{"class":451},"}",[434,1382,492],{"class":461},[352,1384],{},[355,1386,1388],{"id":1387},"autoroute-prefetch-par-résolveur","AutoRoute : Prefetch par Résolveur",[348,1390,1391,1392,1395,1396,1399],{},"AutoRoute utilise ",[387,1393,1394],{},"RouteGuard"," ou un callback ",[387,1397,1398],{},"onNavigation"," dans le délégué du routeur. Une approche par résolveur déclenche le prefetch avant que le résolveur ne retourne la route. La route s'affiche seulement après que le prefetch est envoyé :",[424,1401,1403],{"className":426,"code":1402,"filename":775,"language":429,"meta":430,"style":430},"import 'package:auto_route/auto_route.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nfinal _client = QoraClient();\n\n@AutoRouterConfig()\nclass AppRouter extends RootStackRouter {\n  @override\n  List\u003CAutoRoute> get routes => [\n        AutoRoute(page: UserListRoute.page, path: '/users', children: [\n          AutoRoute(\n            page: UserDetailRoute.page,\n            path: ':id',\n            guards: [PrefetchGuard()],\n          ),\n        ]),\n      ];\n}\n\nclass PrefetchGuard extends AutoRouteGuard {\n  @override\n  Future\u003Cvoid> onNavigation(\n    NavigationResolver resolver,\n    StackRouter router,\n  ) async {\n    final userId = resolver.route.pathParams.getString('id');\n    if (userId != null) {\n      _client\n          .prefetch\u003CUser>(\n            key: ['user', userId],\n            fetcher: () => api.getUser(userId),\n          )\n          .ignore();\n    }\n    // Ne jamais bloquer : résoudre immédiatement, les données chargent en arrière-plan.\n    resolver.next();\n  }\n}\n",[387,1404,1405,1414,1422,1426,1440,1444,1452,1468,1473,1496,1532,1539,1555,1566,1583,1590,1597,1603,1608,1612,1626,1630,1646,1656,1666,1675,1709,1726,1731,1744,1761,1782,1788,1799,1805,1811,1826,1832],{"__ignoreMap":430},[434,1406,1407,1409,1412],{"class":436,"line":437},[434,1408,783],{"class":782},[434,1410,1411],{"class":535}," 'package:auto_route/auto_route.dart'",[434,1413,789],{"class":461},[434,1415,1416,1418,1420],{"class":436,"line":444},[434,1417,783],{"class":782},[434,1419,796],{"class":535},[434,1421,789],{"class":461},[434,1423,1424],{"class":436,"line":455},[434,1425,627],{"emptyLinePlaceholder":626},[434,1427,1428,1430,1432,1434,1436,1438],{"class":436,"line":495},[434,1429,808],{"class":807},[434,1431,811],{"class":451},[434,1433,483],{"class":461},[434,1435,816],{"class":447},[434,1437,819],{"class":451},[434,1439,789],{"class":461},[434,1441,1442],{"class":436,"line":506},[434,1443,627],{"emptyLinePlaceholder":626},[434,1445,1446,1449],{"class":436,"line":524},[434,1447,1448],{"class":807},"@AutoRouterConfig",[434,1450,1451],{"class":451},"()\n",[434,1453,1454,1457,1460,1463,1466],{"class":436,"line":547},[434,1455,1456],{"class":461},"class",[434,1458,1459],{"class":447}," AppRouter",[434,1461,1462],{"class":461}," extends",[434,1464,1465],{"class":447}," RootStackRouter",[434,1467,1249],{"class":451},[434,1469,1470],{"class":436,"line":574},[434,1471,1472],{"class":807},"  @override\n",[434,1474,1475,1478,1480,1483,1486,1489,1492,1494],{"class":436,"line":595},[434,1476,1477],{"class":447},"  List",[434,1479,515],{"class":451},[434,1481,1482],{"class":447},"AutoRoute",[434,1484,1485],{"class":451},"> ",[434,1487,1488],{"class":461},"get",[434,1490,1491],{"class":451}," routes ",[434,1493,468],{"class":461},[434,1495,849],{"class":451},[434,1497,1498,1501,1504,1506,1509,1511,1514,1516,1519,1521,1523,1525,1528,1530],{"class":436,"line":601},[434,1499,1500],{"class":447},"        AutoRoute",[434,1502,1503],{"class":451},"(page",[434,1505,462],{"class":461},[434,1507,1508],{"class":447}," UserListRoute",[434,1510,563],{"class":461},[434,1512,1513],{"class":451},"page",[434,1515,539],{"class":461},[434,1517,1518],{"class":451}," path",[434,1520,462],{"class":461},[434,1522,866],{"class":535},[434,1524,539],{"class":461},[434,1526,1527],{"class":451}," children",[434,1529,462],{"class":461},[434,1531,849],{"class":451},[434,1533,1534,1537],{"class":436,"line":617},[434,1535,1536],{"class":447},"          AutoRoute",[434,1538,452],{"class":451},[434,1540,1541,1544,1546,1549,1551,1553],{"class":436,"line":623},[434,1542,1543],{"class":451},"            page",[434,1545,462],{"class":461},[434,1547,1548],{"class":447}," UserDetailRoute",[434,1550,563],{"class":461},[434,1552,1513],{"class":451},[434,1554,492],{"class":461},[434,1556,1557,1560,1562,1564],{"class":436,"line":630},[434,1558,1559],{"class":451},"            path",[434,1561,462],{"class":461},[434,1563,921],{"class":535},[434,1565,492],{"class":461},[434,1567,1568,1571,1573,1575,1578,1581],{"class":436,"line":636},[434,1569,1570],{"class":451},"            guards",[434,1572,462],{"class":461},[434,1574,532],{"class":451},[434,1576,1577],{"class":447},"PrefetchGuard",[434,1579,1580],{"class":451},"()]",[434,1582,492],{"class":461},[434,1584,1585,1588],{"class":436,"line":644},[434,1586,1587],{"class":451},"          )",[434,1589,492],{"class":461},[434,1591,1592,1595],{"class":436,"line":670},[434,1593,1594],{"class":451},"        ])",[434,1596,492],{"class":461},[434,1598,1599,1601],{"class":436,"line":688},[434,1600,1134],{"class":451},[434,1602,789],{"class":461},[434,1604,1605],{"class":436,"line":710},[434,1606,1607],{"class":451},"}\n",[434,1609,1610],{"class":436,"line":718},[434,1611,627],{"emptyLinePlaceholder":626},[434,1613,1614,1616,1619,1621,1624],{"class":436,"line":732},[434,1615,1456],{"class":461},[434,1617,1618],{"class":447}," PrefetchGuard",[434,1620,1462],{"class":461},[434,1622,1623],{"class":447}," AutoRouteGuard",[434,1625,1249],{"class":451},[434,1627,1628],{"class":436,"line":1044},[434,1629,1472],{"class":807},[434,1631,1632,1635,1637,1640,1642,1644],{"class":436,"line":1057},[434,1633,1634],{"class":447},"  Future",[434,1636,515],{"class":451},[434,1638,1639],{"class":807},"void",[434,1641,1485],{"class":451},[434,1643,1398],{"class":471},[434,1645,452],{"class":451},[434,1647,1648,1651,1654],{"class":436,"line":1065},[434,1649,1650],{"class":447},"    NavigationResolver",[434,1652,1653],{"class":451}," resolver",[434,1655,492],{"class":461},[434,1657,1658,1661,1664],{"class":436,"line":1079},[434,1659,1660],{"class":447},"    StackRouter",[434,1662,1663],{"class":451}," router",[434,1665,492],{"class":461},[434,1667,1668,1671,1673],{"class":436,"line":1100},[434,1669,1670],{"class":451},"  ) ",[434,1672,1246],{"class":1047},[434,1674,1249],{"class":451},[434,1676,1677,1680,1682,1684,1686,1688,1691,1693,1696,1698,1701,1703,1705,1707],{"class":436,"line":1116},[434,1678,1679],{"class":807},"    final",[434,1681,951],{"class":451},[434,1683,483],{"class":461},[434,1685,1653],{"class":451},[434,1687,563],{"class":461},[434,1689,1690],{"class":451},"route",[434,1692,563],{"class":461},[434,1694,1695],{"class":451},"pathParams",[434,1697,563],{"class":461},[434,1699,1700],{"class":471},"getString",[434,1702,1298],{"class":451},[434,1704,964],{"class":535},[434,1706,489],{"class":451},[434,1708,789],{"class":461},[434,1710,1711,1714,1717,1720,1723],{"class":436,"line":1123},[434,1712,1713],{"class":1047},"    if",[434,1715,1716],{"class":451}," (userId ",[434,1718,1719],{"class":461},"!=",[434,1721,1722],{"class":461}," null",[434,1724,1725],{"class":451},") {\n",[434,1727,1728],{"class":436,"line":1131},[434,1729,1730],{"class":451},"      _client\n",[434,1732,1733,1736,1738,1740,1742],{"class":436,"line":1139},[434,1734,1735],{"class":461},"          .",[434,1737,661],{"class":471},[434,1739,515],{"class":451},[434,1741,518],{"class":447},[434,1743,521],{"class":451},[434,1745,1746,1749,1751,1753,1755,1757,1759],{"class":436,"line":1147},[434,1747,1748],{"class":451},"            key",[434,1750,462],{"class":461},[434,1752,532],{"class":451},[434,1754,536],{"class":535},[434,1756,539],{"class":461},[434,1758,542],{"class":451},[434,1760,492],{"class":461},[434,1762,1763,1766,1768,1770,1772,1774,1776,1778,1780],{"class":436,"line":1155},[434,1764,1765],{"class":451},"            fetcher",[434,1767,462],{"class":461},[434,1769,555],{"class":451},[434,1771,468],{"class":461},[434,1773,560],{"class":451},[434,1775,563],{"class":461},[434,1777,566],{"class":471},[434,1779,569],{"class":451},[434,1781,492],{"class":461},[434,1783,1785],{"class":436,"line":1784},32,[434,1786,1787],{"class":451},"          )\n",[434,1789,1791,1793,1795,1797],{"class":436,"line":1790},33,[434,1792,1735],{"class":461},[434,1794,1033],{"class":471},[434,1796,819],{"class":451},[434,1798,789],{"class":461},[434,1800,1802],{"class":436,"line":1801},34,[434,1803,1804],{"class":451},"    }\n",[434,1806,1808],{"class":436,"line":1807},35,[434,1809,1810],{"class":440},"    // Ne jamais bloquer : résoudre immédiatement, les données chargent en arrière-plan.\n",[434,1812,1814,1817,1819,1822,1824],{"class":436,"line":1813},36,[434,1815,1816],{"class":451},"    resolver",[434,1818,563],{"class":461},[434,1820,1821],{"class":471},"next",[434,1823,819],{"class":451},[434,1825,789],{"class":461},[434,1827,1829],{"class":436,"line":1828},37,[434,1830,1831],{"class":451},"  }\n",[434,1833,1835],{"class":436,"line":1834},38,[434,1836,1607],{"class":451},[768,1838,1840],{"id":1839},"avec-un-délai-de-grâce","Avec un délai de grâce",[348,1842,1843],{},"Si vous voulez attendre un court délai (ex. 200 ms) pour donner une avance au prefetch avant de résoudre, sans jamais bloquer plus longtemps :",[424,1845,1848],{"className":426,"code":1846,"filename":1847,"language":429,"meta":430,"style":430},"class PrefetchGuard extends AutoRouteGuard {\n  @override\n  Future\u003Cvoid> onNavigation(\n    NavigationResolver resolver,\n    StackRouter router,\n  ) async {\n    final userId = resolver.route.pathParams.getString('id');\n    if (userId != null) {\n      final prefetch = _client.prefetch\u003CUser>(\n        key: ['user', userId],\n        fetcher: () => api.getUser(userId),\n      );\n      // Attendre au maximum 200 ms que le prefetch se termine.\n      try {\n        await prefetch.timeout(const Duration(milliseconds: 200));\n      } catch (_) {\n        // Timeout: le résolveur continue, les données chargent à l'écran.\n      }\n    }\n    resolver.next();\n  }\n}\n","lib/guards/prefetch_guard.dart",[387,1849,1850,1862,1866,1880,1888,1896,1904,1934,1946,1969,1986,2007,2014,2019,2025,2059,2068,2073,2077,2081,2093,2097],{"__ignoreMap":430},[434,1851,1852,1854,1856,1858,1860],{"class":436,"line":437},[434,1853,1456],{"class":461},[434,1855,1618],{"class":447},[434,1857,1462],{"class":461},[434,1859,1623],{"class":447},[434,1861,1249],{"class":451},[434,1863,1864],{"class":436,"line":444},[434,1865,1472],{"class":807},[434,1867,1868,1870,1872,1874,1876,1878],{"class":436,"line":455},[434,1869,1634],{"class":447},[434,1871,515],{"class":451},[434,1873,1639],{"class":807},[434,1875,1485],{"class":451},[434,1877,1398],{"class":471},[434,1879,452],{"class":451},[434,1881,1882,1884,1886],{"class":436,"line":495},[434,1883,1650],{"class":447},[434,1885,1653],{"class":451},[434,1887,492],{"class":461},[434,1889,1890,1892,1894],{"class":436,"line":506},[434,1891,1660],{"class":447},[434,1893,1663],{"class":451},[434,1895,492],{"class":461},[434,1897,1898,1900,1902],{"class":436,"line":524},[434,1899,1670],{"class":451},[434,1901,1246],{"class":1047},[434,1903,1249],{"class":451},[434,1905,1906,1908,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932],{"class":436,"line":547},[434,1907,1679],{"class":807},[434,1909,951],{"class":451},[434,1911,483],{"class":461},[434,1913,1653],{"class":451},[434,1915,563],{"class":461},[434,1917,1690],{"class":451},[434,1919,563],{"class":461},[434,1921,1695],{"class":451},[434,1923,563],{"class":461},[434,1925,1700],{"class":471},[434,1927,1298],{"class":451},[434,1929,964],{"class":535},[434,1931,489],{"class":451},[434,1933,789],{"class":461},[434,1935,1936,1938,1940,1942,1944],{"class":436,"line":574},[434,1937,1713],{"class":1047},[434,1939,1716],{"class":451},[434,1941,1719],{"class":461},[434,1943,1722],{"class":461},[434,1945,1725],{"class":451},[434,1947,1948,1951,1954,1956,1959,1961,1963,1965,1967],{"class":436,"line":595},[434,1949,1950],{"class":807},"      final",[434,1952,1953],{"class":451}," prefetch ",[434,1955,483],{"class":461},[434,1957,1958],{"class":451}," _client",[434,1960,563],{"class":461},[434,1962,661],{"class":471},[434,1964,515],{"class":451},[434,1966,518],{"class":447},[434,1968,521],{"class":451},[434,1970,1971,1974,1976,1978,1980,1982,1984],{"class":436,"line":601},[434,1972,1973],{"class":451},"        key",[434,1975,462],{"class":461},[434,1977,532],{"class":451},[434,1979,536],{"class":535},[434,1981,539],{"class":461},[434,1983,542],{"class":451},[434,1985,492],{"class":461},[434,1987,1988,1991,1993,1995,1997,1999,2001,2003,2005],{"class":436,"line":617},[434,1989,1990],{"class":451},"        fetcher",[434,1992,462],{"class":461},[434,1994,555],{"class":451},[434,1996,468],{"class":461},[434,1998,560],{"class":451},[434,2000,563],{"class":461},[434,2002,566],{"class":471},[434,2004,569],{"class":451},[434,2006,492],{"class":461},[434,2008,2009,2012],{"class":436,"line":623},[434,2010,2011],{"class":451},"      )",[434,2013,789],{"class":461},[434,2015,2016],{"class":436,"line":630},[434,2017,2018],{"class":440},"      // Attendre au maximum 200 ms que le prefetch se termine.\n",[434,2020,2021,2023],{"class":436,"line":636},[434,2022,1254],{"class":1047},[434,2024,1249],{"class":451},[434,2026,2027,2030,2033,2035,2038,2040,2043,2046,2049,2051,2054,2057],{"class":436,"line":644},[434,2028,2029],{"class":1047},"        await",[434,2031,2032],{"class":451}," prefetch",[434,2034,563],{"class":461},[434,2036,2037],{"class":471},"timeout",[434,2039,1298],{"class":451},[434,2041,2042],{"class":807},"const",[434,2044,2045],{"class":447}," Duration",[434,2047,2048],{"class":451},"(milliseconds",[434,2050,462],{"class":461},[434,2052,2053],{"class":782}," 200",[434,2055,2056],{"class":451},"))",[434,2058,789],{"class":461},[434,2060,2061,2063,2065],{"class":436,"line":670},[434,2062,1279],{"class":451},[434,2064,1282],{"class":1047},[434,2066,2067],{"class":451}," (_) {\n",[434,2069,2070],{"class":436,"line":688},[434,2071,2072],{"class":440},"        // Timeout: le résolveur continue, les données chargent à l'écran.\n",[434,2074,2075],{"class":436,"line":710},[434,2076,1348],{"class":451},[434,2078,2079],{"class":436,"line":718},[434,2080,1804],{"class":451},[434,2082,2083,2085,2087,2089,2091],{"class":436,"line":732},[434,2084,1816],{"class":451},[434,2086,563],{"class":461},[434,2088,1821],{"class":471},[434,2090,819],{"class":451},[434,2092,789],{"class":461},[434,2094,2095],{"class":436,"line":1044},[434,2096,1831],{"class":451},[434,2098,2099],{"class":436,"line":1057},[434,2100,1607],{"class":451},[352,2102],{},[355,2104,2106],{"id":2105},"stratégie-cache-first-vs-network-first","Stratégie : Cache-First vs Network-First",[363,2108,2109,2121],{},[366,2110,2111],{},[369,2112,2113,2116,2119],{},[372,2114,2115],{},"Stratégie",[372,2117,2118],{},"Comportement",[372,2120,377],{},[379,2122,2123,2137],{},[369,2124,2125,2131,2134],{},[384,2126,2127,2130],{},[759,2128,2129],{},"Cache-first"," (défaut)",[384,2132,2133],{},"Le prefetch est sans effet si des données fraîches existent. La première navigation après expiration déclenche un fetch.",[384,2135,2136],{},"La fenêtre de fraîcheur des données est connue et acceptable.",[369,2138,2139,2144,2147],{},[384,2140,2141],{},[759,2142,2143],{},"Network-first",[384,2145,2146],{},"Toujours fetcher à la navigation, en ignorant le contrôle de péremption du cache.",[384,2148,2149],{},"Les données doivent être garanties fraîches à chaque visite (ex. tableaux de bord financiers).",[768,2151,2153],{"id":2152},"cache-first-par-défaut","Cache-first (par défaut)",[348,2155,2156,2157,2159],{},"La méthode ",[387,2158,411],{}," implémente déjà le cache-first : elle vérifie le cache et retourne immédiatement si des données fraîches existent. Aucune configuration supplémentaire nécessaire.",[768,2161,2143],{"id":2162},"network-first",[348,2164,2165,2166,2169],{},"Forcer un fetch en appelant ",[387,2167,2168],{},"fetchQuery"," directement ou en invalidant la clé avant le prefetch :",[424,2171,2173],{"className":426,"code":2172,"filename":775,"language":429,"meta":430,"style":430},"redirect: (context, state) {\n  final userId = state.pathParameters['id']!;\n  // Toujours fetcher, même si des données fraîches existent.\n  _client.invalidate(['user', userId]);\n  _client.fetchQuery\u003CUser>(\n    key: ['user', userId],\n    fetcher: () => api.getUser(userId),\n  ).ignore();\n  return null;\n},\n",[387,2174,2175,2187,2207,2212,2233,2247,2263,2283,2295,2301],{"__ignoreMap":430},[434,2176,2177,2179,2181,2183,2185],{"class":436,"line":437},[434,2178,746],{"class":451},[434,2180,462],{"class":461},[434,2182,933],{"class":451},[434,2184,539],{"class":461},[434,2186,938],{"class":451},[434,2188,2189,2191,2193,2195,2197,2199,2201,2203,2205],{"class":436,"line":444},[434,2190,1188],{"class":807},[434,2192,951],{"class":451},[434,2194,483],{"class":461},[434,2196,956],{"class":451},[434,2198,563],{"class":461},[434,2200,961],{"class":451},[434,2202,964],{"class":535},[434,2204,967],{"class":451},[434,2206,970],{"class":461},[434,2208,2209],{"class":436,"line":455},[434,2210,2211],{"class":440},"  // Toujours fetcher, même si des données fraîches existent.\n",[434,2213,2214,2216,2218,2221,2224,2226,2228,2231],{"class":436,"line":495},[434,2215,1209],{"class":451},[434,2217,563],{"class":461},[434,2219,2220],{"class":471},"invalidate",[434,2222,2223],{"class":451},"([",[434,2225,536],{"class":535},[434,2227,539],{"class":461},[434,2229,2230],{"class":451}," userId])",[434,2232,789],{"class":461},[434,2234,2235,2237,2239,2241,2243,2245],{"class":436,"line":506},[434,2236,1209],{"class":451},[434,2238,563],{"class":461},[434,2240,2168],{"class":471},[434,2242,515],{"class":451},[434,2244,518],{"class":447},[434,2246,521],{"class":451},[434,2248,2249,2251,2253,2255,2257,2259,2261],{"class":436,"line":524},[434,2250,673],{"class":451},[434,2252,462],{"class":461},[434,2254,532],{"class":451},[434,2256,536],{"class":535},[434,2258,539],{"class":461},[434,2260,542],{"class":451},[434,2262,492],{"class":461},[434,2264,2265,2267,2269,2271,2273,2275,2277,2279,2281],{"class":436,"line":547},[434,2266,691],{"class":451},[434,2268,462],{"class":461},[434,2270,555],{"class":451},[434,2272,468],{"class":461},[434,2274,560],{"class":451},[434,2276,563],{"class":461},[434,2278,566],{"class":471},[434,2280,569],{"class":451},[434,2282,492],{"class":461},[434,2284,2285,2287,2289,2291,2293],{"class":436,"line":574},[434,2286,713],{"class":451},[434,2288,563],{"class":461},[434,2290,1033],{"class":471},[434,2292,819],{"class":451},[434,2294,789],{"class":461},[434,2296,2297,2299],{"class":436,"line":595},[434,2298,1372],{"class":1047},[434,2300,1375],{"class":461},[434,2302,2303,2305],{"class":436,"line":601},[434,2304,1380],{"class":451},[434,2306,492],{"class":461},[348,2308,2309,2310,2313,2314,2317,2318,2320],{},"Pour un pattern réutilisable, définissez ",[387,2311,2312],{},"staleTime"," à ",[387,2315,2316],{},"Duration.zero"," dans les options de requête pour que chaque montage de ",[387,2319,108],{}," déclenche un fetch frais :",[424,2322,2324],{"className":426,"code":2323,"filename":428,"language":429,"meta":430,"style":430},"QoraBuilder\u003CUser>(\n  queryKey: ['user', userId],\n  fetcher: () => api.getUser(userId),\n  options: const QoraOptions(staleTime: Duration.zero),\n  builder: (context, state, _) { ... },\n)\n",[387,2325,2326,2336,2353,2374,2400,2426],{"__ignoreMap":430},[434,2327,2328,2330,2332,2334],{"class":436,"line":437},[434,2329,108],{"class":447},[434,2331,515],{"class":451},[434,2333,518],{"class":447},[434,2335,521],{"class":451},[434,2337,2338,2341,2343,2345,2347,2349,2351],{"class":436,"line":444},[434,2339,2340],{"class":451},"  queryKey",[434,2342,462],{"class":461},[434,2344,532],{"class":451},[434,2346,536],{"class":535},[434,2348,539],{"class":461},[434,2350,542],{"class":451},[434,2352,492],{"class":461},[434,2354,2355,2358,2360,2362,2364,2366,2368,2370,2372],{"class":436,"line":455},[434,2356,2357],{"class":451},"  fetcher",[434,2359,462],{"class":461},[434,2361,555],{"class":451},[434,2363,468],{"class":461},[434,2365,560],{"class":451},[434,2367,563],{"class":461},[434,2369,566],{"class":471},[434,2371,569],{"class":451},[434,2373,492],{"class":461},[434,2375,2376,2379,2381,2383,2386,2389,2391,2393,2395,2398],{"class":436,"line":495},[434,2377,2378],{"class":451},"  options",[434,2380,462],{"class":461},[434,2382,888],{"class":807},[434,2384,2385],{"class":447}," QoraOptions",[434,2387,2388],{"class":451},"(staleTime",[434,2390,462],{"class":461},[434,2392,2045],{"class":447},[434,2394,563],{"class":461},[434,2396,2397],{"class":451},"zero)",[434,2399,492],{"class":461},[434,2401,2402,2405,2407,2409,2411,2413,2415,2418,2421,2424],{"class":436,"line":506},[434,2403,2404],{"class":451},"  builder",[434,2406,462],{"class":461},[434,2408,933],{"class":451},[434,2410,539],{"class":461},[434,2412,956],{"class":451},[434,2414,539],{"class":461},[434,2416,2417],{"class":451}," _) { ",[434,2419,2420],{"class":461},"...",[434,2422,2423],{"class":451}," }",[434,2425,492],{"class":461},[434,2427,2428],{"class":436,"line":524},[434,2429,620],{"class":451},[352,2431],{},[355,2433,2435,2436,2439],{"id":2434},"utiliser-qoraprefetch-dans-une-route","Utiliser ",[387,2437,2438],{},"QoraPrefetch"," dans une Route",[348,2441,2442,2443,2445],{},"Si vous ne pouvez pas (ou préférez ne pas) modifier votre couche de routage, intégrez ",[387,2444,2438],{}," au niveau du widget. C'est l'approche la plus simple quand l'enfant navigable est déjà dans l'arbre :",[424,2447,2450],{"className":426,"code":2448,"filename":2449,"language":429,"meta":430,"style":430},"ListView.builder(\n  itemCount: users.length,\n  itemBuilder: (context, index) {\n    final user = users[index];\n    return QoraPrefetch\u003CUser>(\n      queryKey: ['user', user.id],\n      fetcher: () => api.getUser(user.id),\n      child: ListTile(\n        title: Text(user.name),\n        onTap: () => context.push('/users/${user.id}'),\n      ),\n    );\n  },\n)\n","lib/features/user_list_screen.dart",[387,2451,2452,2464,2481,2495,2509,2522,2545,2572,2584,2603,2645,2651,2657,2664],{"__ignoreMap":430},[434,2453,2454,2457,2459,2462],{"class":436,"line":437},[434,2455,2456],{"class":447},"ListView",[434,2458,563],{"class":461},[434,2460,2461],{"class":471},"builder",[434,2463,452],{"class":451},[434,2465,2466,2469,2471,2474,2476,2479],{"class":436,"line":444},[434,2467,2468],{"class":451},"  itemCount",[434,2470,462],{"class":461},[434,2472,2473],{"class":451}," users",[434,2475,563],{"class":461},[434,2477,2478],{"class":451},"length",[434,2480,492],{"class":461},[434,2482,2483,2486,2488,2490,2492],{"class":436,"line":455},[434,2484,2485],{"class":451},"  itemBuilder",[434,2487,462],{"class":461},[434,2489,933],{"class":451},[434,2491,539],{"class":461},[434,2493,2494],{"class":451}," index) {\n",[434,2496,2497,2499,2502,2504,2507],{"class":436,"line":495},[434,2498,1679],{"class":807},[434,2500,2501],{"class":451}," user ",[434,2503,483],{"class":461},[434,2505,2506],{"class":451}," users[index]",[434,2508,789],{"class":461},[434,2510,2511,2514,2516,2518,2520],{"class":436,"line":506},[434,2512,2513],{"class":1047},"    return",[434,2515,512],{"class":447},[434,2517,515],{"class":451},[434,2519,518],{"class":447},[434,2521,521],{"class":451},[434,2523,2524,2527,2529,2531,2533,2535,2538,2540,2543],{"class":436,"line":524},[434,2525,2526],{"class":451},"      queryKey",[434,2528,462],{"class":461},[434,2530,532],{"class":451},[434,2532,536],{"class":535},[434,2534,539],{"class":461},[434,2536,2537],{"class":451}," user",[434,2539,563],{"class":461},[434,2541,2542],{"class":451},"id]",[434,2544,492],{"class":461},[434,2546,2547,2550,2552,2554,2556,2558,2560,2562,2565,2567,2570],{"class":436,"line":547},[434,2548,2549],{"class":451},"      fetcher",[434,2551,462],{"class":461},[434,2553,555],{"class":451},[434,2555,468],{"class":461},[434,2557,560],{"class":451},[434,2559,563],{"class":461},[434,2561,566],{"class":471},[434,2563,2564],{"class":451},"(user",[434,2566,563],{"class":461},[434,2568,2569],{"class":451},"id)",[434,2571,492],{"class":461},[434,2573,2574,2577,2579,2582],{"class":436,"line":574},[434,2575,2576],{"class":451},"      child",[434,2578,462],{"class":461},[434,2580,2581],{"class":447}," ListTile",[434,2583,452],{"class":451},[434,2585,2586,2589,2591,2594,2596,2598,2601],{"class":436,"line":595},[434,2587,2588],{"class":451},"        title",[434,2590,462],{"class":461},[434,2592,2593],{"class":447}," Text",[434,2595,2564],{"class":451},[434,2597,563],{"class":461},[434,2599,2600],{"class":451},"name)",[434,2602,492],{"class":461},[434,2604,2605,2608,2610,2612,2614,2616,2618,2621,2623,2626,2629,2632,2634,2637,2639,2641,2643],{"class":436,"line":601},[434,2606,2607],{"class":451},"        onTap",[434,2609,462],{"class":461},[434,2611,555],{"class":451},[434,2613,468],{"class":461},[434,2615,656],{"class":451},[434,2617,563],{"class":461},[434,2619,2620],{"class":471},"push",[434,2622,1298],{"class":451},[434,2624,2625],{"class":535},"'/users/",[434,2627,2628],{"class":451},"${",[434,2630,2631],{"class":1307},"user",[434,2633,563],{"class":451},[434,2635,2636],{"class":1307},"id",[434,2638,1380],{"class":451},[434,2640,1311],{"class":535},[434,2642,489],{"class":451},[434,2644,492],{"class":461},[434,2646,2647,2649],{"class":436,"line":617},[434,2648,2011],{"class":451},[434,2650,492],{"class":461},[434,2652,2653,2655],{"class":436,"line":623},[434,2654,1142],{"class":451},[434,2656,789],{"class":461},[434,2658,2659,2662],{"class":436,"line":630},[434,2660,2661],{"class":451},"  }",[434,2663,492],{"class":461},[434,2665,2666],{"class":436,"line":636},[434,2667,620],{"class":451},[348,2669,2670,2671,2673],{},"Le prefetch se déclenche au montage (quand l'élément de liste apparaît) et se redéclenche si ",[387,2672,421],{}," change. Au moment où l'utilisateur tape, les données sont en cache.",[352,2675],{},[355,2677,2679],{"id":2678},"tester-la-logique-de-prefetch","Tester la Logique de Prefetch",[348,2681,2682,2683,2685],{},"Utilisez ",[387,2684,202],{}," directement dans les tests sans aucun framework de routage :",[424,2687,2690],{"className":426,"code":2688,"filename":2689,"language":429,"meta":430,"style":430},"import 'package:qora/qora.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  test('le prefetch remplit le cache avant le montage de l\\'écran', () async {\n    final client = QoraClient();\n\n    await client.prefetch\u003CUser>(\n      key: ['user', 1],\n      fetcher: () async => User(id: 1, name: 'Alice'),\n    );\n\n    // Le widget d'écran monte maintenant et lit depuis le cache.\n    final state = client.getQueryState\u003CUser>(['user', 1]);\n    expect(state, isA\u003CSuccess\u003CUser>>());\n    expect((state as Success\u003CUser>).data.name, 'Alice');\n  });\n}\n","test/user_prefetch_test.dart",[387,2691,2692,2701,2710,2714,2724,2748,2763,2767,2785,2805,2842,2848,2852,2857,2891,2918,2956,2963],{"__ignoreMap":430},[434,2693,2694,2696,2699],{"class":436,"line":437},[434,2695,783],{"class":782},[434,2697,2698],{"class":535}," 'package:qora/qora.dart'",[434,2700,789],{"class":461},[434,2702,2703,2705,2708],{"class":436,"line":444},[434,2704,783],{"class":782},[434,2706,2707],{"class":535}," 'package:test/test.dart'",[434,2709,789],{"class":461},[434,2711,2712],{"class":436,"line":455},[434,2713,627],{"emptyLinePlaceholder":626},[434,2715,2716,2718,2721],{"class":436,"line":495},[434,2717,1639],{"class":807},[434,2719,2720],{"class":471}," main",[434,2722,2723],{"class":451},"() {\n",[434,2725,2726,2729,2731,2734,2737,2740,2742,2744,2746],{"class":436,"line":506},[434,2727,2728],{"class":471},"  test",[434,2730,1298],{"class":451},[434,2732,2733],{"class":535},"'le prefetch remplit le cache avant le montage de l",[434,2735,2736],{"class":451},"\\'",[434,2738,2739],{"class":535},"écran'",[434,2741,539],{"class":461},[434,2743,555],{"class":451},[434,2745,1246],{"class":1047},[434,2747,1249],{"class":451},[434,2749,2750,2752,2755,2757,2759,2761],{"class":436,"line":524},[434,2751,1679],{"class":807},[434,2753,2754],{"class":451}," client ",[434,2756,483],{"class":461},[434,2758,816],{"class":447},[434,2760,819],{"class":451},[434,2762,789],{"class":461},[434,2764,2765],{"class":436,"line":547},[434,2766,627],{"emptyLinePlaceholder":626},[434,2768,2769,2772,2775,2777,2779,2781,2783],{"class":436,"line":574},[434,2770,2771],{"class":1047},"    await",[434,2773,2774],{"class":451}," client",[434,2776,563],{"class":461},[434,2778,661],{"class":471},[434,2780,515],{"class":451},[434,2782,518],{"class":447},[434,2784,521],{"class":451},[434,2786,2787,2790,2792,2794,2796,2798,2801,2803],{"class":436,"line":595},[434,2788,2789],{"class":451},"      key",[434,2791,462],{"class":461},[434,2793,532],{"class":451},[434,2795,536],{"class":535},[434,2797,539],{"class":461},[434,2799,2800],{"class":782}," 1",[434,2802,967],{"class":451},[434,2804,492],{"class":461},[434,2806,2807,2809,2811,2813,2815,2818,2821,2824,2826,2828,2830,2833,2835,2838,2840],{"class":436,"line":601},[434,2808,2549],{"class":451},[434,2810,462],{"class":461},[434,2812,555],{"class":451},[434,2814,1246],{"class":1047},[434,2816,2817],{"class":461}," =>",[434,2819,2820],{"class":447}," User",[434,2822,2823],{"class":451},"(id",[434,2825,462],{"class":461},[434,2827,2800],{"class":782},[434,2829,539],{"class":461},[434,2831,2832],{"class":451}," name",[434,2834,462],{"class":461},[434,2836,2837],{"class":535}," 'Alice'",[434,2839,489],{"class":451},[434,2841,492],{"class":461},[434,2843,2844,2846],{"class":436,"line":617},[434,2845,1142],{"class":451},[434,2847,789],{"class":461},[434,2849,2850],{"class":436,"line":623},[434,2851,627],{"emptyLinePlaceholder":626},[434,2853,2854],{"class":436,"line":630},[434,2855,2856],{"class":440},"    // Le widget d'écran monte maintenant et lit depuis le cache.\n",[434,2858,2859,2861,2864,2866,2868,2870,2873,2875,2877,2880,2882,2884,2886,2889],{"class":436,"line":636},[434,2860,1679],{"class":807},[434,2862,2863],{"class":451}," state ",[434,2865,483],{"class":461},[434,2867,2774],{"class":451},[434,2869,563],{"class":461},[434,2871,2872],{"class":471},"getQueryState",[434,2874,515],{"class":451},[434,2876,518],{"class":447},[434,2878,2879],{"class":451},">([",[434,2881,536],{"class":535},[434,2883,539],{"class":461},[434,2885,2800],{"class":782},[434,2887,2888],{"class":451},"])",[434,2890,789],{"class":461},[434,2892,2893,2896,2899,2901,2904,2906,2909,2911,2913,2916],{"class":436,"line":644},[434,2894,2895],{"class":471},"    expect",[434,2897,2898],{"class":451},"(state",[434,2900,539],{"class":461},[434,2902,2903],{"class":471}," isA",[434,2905,515],{"class":451},[434,2907,2908],{"class":447},"Success",[434,2910,515],{"class":451},[434,2912,518],{"class":447},[434,2914,2915],{"class":451},">>())",[434,2917,789],{"class":461},[434,2919,2920,2922,2925,2928,2931,2933,2935,2938,2940,2943,2945,2948,2950,2952,2954],{"class":436,"line":670},[434,2921,2895],{"class":471},[434,2923,2924],{"class":451},"((state ",[434,2926,2927],{"class":461},"as",[434,2929,2930],{"class":447}," Success",[434,2932,515],{"class":451},[434,2934,518],{"class":447},[434,2936,2937],{"class":451},">)",[434,2939,563],{"class":461},[434,2941,2942],{"class":451},"data",[434,2944,563],{"class":461},[434,2946,2947],{"class":451},"name",[434,2949,539],{"class":461},[434,2951,2837],{"class":535},[434,2953,489],{"class":451},[434,2955,789],{"class":461},[434,2957,2958,2961],{"class":436,"line":688},[434,2959,2960],{"class":451},"  })",[434,2962,789],{"class":461},[434,2964,2965],{"class":436,"line":710},[434,2966,1607],{"class":451},[352,2968],{},[355,2970,2972],{"id":2971},"étapes-suivantes","Étapes Suivantes",[2974,2975,2976,2985,2992,2999,3005],"ul",{},[2977,2978,2979,2984],"li",{},[2980,2981,2983],"a",{"href":2982},"../api-reference/qora-client","QoraClient.prefetch",": Référence API pour la méthode de prefetch cœur",[2977,2986,2987,2991],{},[2980,2988,2990],{"href":2989},"../flutter-integration/best-practices","Bonnes Pratiques",": Patterns de prefetch supplémentaires (survol, focus, défilement)",[2977,2993,2994,2998],{},[2980,2995,2997],{"href":2996},"./dependent-queries","Requêtes Dépendantes",": Chaîner des requêtes qui dépendent de données prefetchées",[2977,3000,3001,3004],{},[2980,3002,172],{"href":3003},"./cancel-token",": Annuler les prefetchs en vol lors de navigations rapides",[2977,3006,3007,3010],{},[2980,3008,187],{"href":3009},"./testing",": Écrire des tests déterministes pour la logique de prefetch",[3012,3013,3014],"style",{},"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 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 .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}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":430,"searchDepth":444,"depth":444,"links":3016},[3017,3018,3022,3025,3029,3031,3032],{"id":357,"depth":444,"text":358},{"id":739,"depth":444,"text":740,"children":3019},[3020,3021],{"id":770,"depth":455,"text":771},{"id":1162,"depth":455,"text":1163},{"id":1387,"depth":444,"text":1388,"children":3023},[3024],{"id":1839,"depth":455,"text":1840},{"id":2105,"depth":444,"text":2106,"children":3026},[3027,3028],{"id":2152,"depth":455,"text":2153},{"id":2162,"depth":455,"text":2143},{"id":2434,"depth":444,"text":3030},"Utiliser QoraPrefetch dans une Route",{"id":2678,"depth":444,"text":2679},{"id":2971,"depth":444,"text":2972},"[object Object]","md",null,{},{"title":192,"description":3038},{"Précharger les données de requête avant qu'un écran ne monte avec les redirections GoRouter, les résolveurs AutoRoute ou QoraPrefetch":3039,"navigation":3040,"seo":3042},"éliminant les spinners de chargement pendant la navigation.",{"icon":3041},"i-lucide-navigation",{"title":3043,"description":3044},"Prefetch au Niveau des Routes - Qora","Préchargez les données Qora avant qu'un écran ne s'affiche avec GoRouter et AutoRoute. Supprimez les spinners de chargement avec les stratégies cache-first ou network-first.","sYa8yQH9TSyPe4kJgmQeg1eD7VN0bWKkGQZOa-IFcxg",[3047,3049],{"title":187,"path":188,"stem":189,"description":3048,"icon":190,"children":-1},"Tester les requêtes, mutations et widgets Qora avec des helpers déterministes : pas de réseau, pas de Hive, pas de timers.",{"title":202,"path":203,"stem":204,"description":3050,"icon":205,"children":-1},"Le moteur central de Qora : gère les requêtes, le cache, la déduplication, les retries et l'état réactif.",1794040408944]