[{"data":1,"prerenderedAt":3048},["ShallowReactive",2],{"navigation_docs_en":3,"-en-recipes-prefetch":342,"-en-recipes-prefetch-surround":3043},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","/en/getting-started","en/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"What is Qora?","/en/getting-started/what-is-qora","en/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/en/getting-started/installation","en/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick Start","/en/getting-started/quick-start","en/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparison","/en/getting-started/comparison","en/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Coming from TanStack Query","/en/getting-started/coming-from-tanstack-query","en/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrating from Other Libraries","/en/getting-started/migrating-from-other-libraries","en/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"AI Assistants","/en/getting-started/ai-assistants","en/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Core Concepts","i-lucide-book-open","/en/core-concepts","en/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Queries","/en/core-concepts/queries","en/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Query Keys","/en/core-concepts/query-keys","en/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"Query States","/en/core-concepts/query-states","en/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Caching","/en/core-concepts/caching","en/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/en/core-concepts/stale-while-revalidate","en/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Deduplication","/en/core-concepts/deduplication","en/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations & Invalidation","/en/core-concepts/mutations","en/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Offline & Network","/en/core-concepts/offline","en/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Flutter Integration","i-lucide-smartphone","/en/flutter-integration","en/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Setup","/en/flutter-integration/setup","en/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/en/flutter-integration/qora-scope","en/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/en/flutter-integration/qora-builder","en/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/en/flutter-integration/qora-mutation-builder","en/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/en/flutter-integration/infinite-query-builder","en/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/en/flutter-integration/hooks","en/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Network Status Widgets","/en/flutter-integration/network-status","en/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Best Practices","/en/flutter-integration/best-practices","en/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Recipes","i-lucide-chef-hat","/en/recipes","en/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/en/recipes/mutations","en/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Optimistic Updates","/en/recipes/optimistic-updates","en/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistence","/en/recipes/persistence","en/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Network Aware","/en/recipes/network-aware","en/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Infinite Queries","/en/recipes/infinite-queries","en/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Dependent Queries","/en/recipes/dependent-queries","en/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Cancellation","/en/recipes/cancel-token","en/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"SSR Hydration","/en/recipes/ssr-hydration","en/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Error Handling","/en/recipes/error-handling","en/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Testing","/en/recipes/testing","en/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Route-Level Prefetching","/en/recipes/prefetch","en/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"API Reference","i-lucide-file-code","/en/api-reference","en/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/en/api-reference/qora-client","en/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/en/api-reference/qora-key","en/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/en/api-reference/qora-state","en/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/en/api-reference/qora-options","en/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/en/api-reference/qora-client-config","en/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"Mutation API","/en/api-reference/qora-mutation","en/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/en/api-reference/persist-qora-client","en/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Infinite Query","/en/api-reference/infinite-query","en/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"DevTools","i-lucide-bug","/en/devtools","en/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Overview","/en/devtools/overview","en/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"In-App Overlay","/en/devtools/overlay","en/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Data Serialization","/en/devtools/data-display","en/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Third Party","i-lucide-puzzle","/en/third-party","en/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"With Provider","/en/third-party/with-provider","en/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"With BLoC","/en/third-party/with-bloc","en/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"With Riverpod","/en/third-party/with-riverpod","en/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"With RxDart","/en/third-party/with-rxdart","en/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"With Dio","/en/third-party/with-dio","en/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"With GraphQL","/en/third-party/with-graphql","en/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Examples","/en/examples","en/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Case Study: User List & Detail","/en/examples/basic-query","en/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Case Study: Optimistic Mutations & Rollback","/en/examples/mutations-optimistic","en/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Case Study: Infinite Scroll Feed","/en/examples/infinite-scroll","en/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Case Study: Offline-First Todo App","/en/examples/offline-first","en/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Case Study: Network Awareness","/en/examples/network-awareness","en/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Case Study: Hooks Integration","/en/examples/hooks-integration","en/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Case Study: Complete Todo App","/en/examples/complete-todo-app","en/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Help","i-lucide-life-buoy","/en/help","en/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/en/help/faq","en/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Troubleshooting","/en/help/troubleshooting","en/09.help/2.troubleshooting",{"id":343,"title":192,"body":344,"description":3030,"extension":3031,"links":3032,"meta":3033,"navigation":626,"path":193,"seo":3034,"stem":194,"__hash__":3042},"docs_en/en/04.recipes/12.prefetch.md",{"type":345,"value":346,"toc":3012},"minimark",[347,351,354,359,362,416,423,735,737,741,751,767,772,1166,1170,1173,1389,1391,1395,1406,1842,1846,1849,2106,2108,2112,2156,2160,2165,2168,2175,2312,2326,2435,2437,2445,2451,2673,2679,2681,2685,2691,2966,2968,2972,3008],[348,349,350],"p",{},"Route-level prefetching ensures data is already cached by the time a user navigates to a new screen. This guide covers GoRouter redirect-based prefetching, AutoRoute resolver-based prefetching, error handling strategies, and cache-first vs network-first trade-offs.",[352,353],"hr",{},[355,356,358],"h2",{"id":357},"core-api","Core API",[348,360,361],{},"Qora provides three prefetch primitives, listed from most declarative to most imperative:",[363,364,365,378],"table",{},[366,367,368],"thead",{},[369,370,371,375],"tr",{},[372,373,374],"th",{},"Primitive",[372,376,377],{},"When to use",[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],{},"Wrapping a child that is already in the tree (e.g. hover, focus, scroll-into-view).",[369,395,396,402],{},[384,397,398,401],{},[387,399,400],{},"context.prefetch\u003CT>()"," (extension)",[384,403,404],{},"Imperative trigger from a gesture callback or route event.",[369,406,407,413],{},[384,408,409,412],{},[387,410,411],{},"client.prefetch\u003CT>()"," (core)",[384,414,415],{},"Any Dart context without a widget tree (e.g. route guards, resolvers).",[348,417,418,419,422],{},"All three are no-ops when fresh data already exists for the given ",[387,420,421],{},"queryKey",". Prefetch runs once per key; repeat calls are safe and cheap.",[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-based: wrap a child that implies \"likely to navigate\"\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// Imperative: call from any 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-based: wrap a child that implies \"likely to navigate\"\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},"// Imperative: call from any 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-redirect-based-prefetching","GoRouter: Redirect-Based Prefetching",[348,742,743,744,747,748,750],{},"GoRouter supports ",[387,745,746],{},"redirect"," callbacks that run before a route is activated. Use them to prefetch data synchronously (fire-and-forget), then let the route guard proceed immediately. By the time the screen widget mounts, its ",[387,749,108],{}," reads from cache with zero network wait.",[752,753,754,755,757,758,762,763,766],"tip",{},"The ",[387,756,746],{}," callback runs synchronously. Prefetch is fire-and-forget: do ",[759,760,761],"strong",{},"not"," ",[387,764,765],{},"await"," the prefetch, or you will block the navigation transition.",[768,769,771],"h3",{"id":770},"implementation","Implementation",[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            // Prefetch user detail while the list is still visible.\n            // The redirect runs synchronously; navigation proceeds immediately.\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; // proceed to the 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,949,976,991,1008,1029,1048,1061,1069,1083,1104,1120,1127,1135,1143,1151,1159],{"__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},"            // Prefetch user detail while the list is still visible.\n",[434,945,946],{"class":436,"line":670},[434,947,948],{"class":440},"            // The redirect runs synchronously; navigation proceeds immediately.\n",[434,950,951,954,957,959,962,964,967,970,973],{"class":436,"line":688},[434,952,953],{"class":807},"            final",[434,955,956],{"class":451}," userId ",[434,958,483],{"class":461},[434,960,961],{"class":451}," state",[434,963,563],{"class":461},[434,965,966],{"class":451},"pathParameters[",[434,968,969],{"class":535},"'id'",[434,971,972],{"class":451},"]",[434,974,975],{"class":461},"!;\n",[434,977,978,981,983,985,987,989],{"class":436,"line":710},[434,979,980],{"class":451},"            _client",[434,982,563],{"class":461},[434,984,661],{"class":471},[434,986,515],{"class":451},[434,988,518],{"class":447},[434,990,521],{"class":451},[434,992,993,996,998,1000,1002,1004,1006],{"class":436,"line":718},[434,994,995],{"class":451},"              key",[434,997,462],{"class":461},[434,999,532],{"class":451},[434,1001,536],{"class":535},[434,1003,539],{"class":461},[434,1005,542],{"class":451},[434,1007,492],{"class":461},[434,1009,1010,1013,1015,1017,1019,1021,1023,1025,1027],{"class":436,"line":732},[434,1011,1012],{"class":451},"              fetcher",[434,1014,462],{"class":461},[434,1016,555],{"class":451},[434,1018,468],{"class":461},[434,1020,560],{"class":451},[434,1022,563],{"class":461},[434,1024,566],{"class":471},[434,1026,569],{"class":451},[434,1028,492],{"class":461},[434,1030,1032,1035,1037,1040,1042,1045],{"class":436,"line":1031},21,[434,1033,1034],{"class":451},"            )",[434,1036,563],{"class":461},[434,1038,1039],{"class":471},"ignore",[434,1041,819],{"class":451},[434,1043,1044],{"class":461},";",[434,1046,1047],{"class":440}," // fire-and-forget\n",[434,1049,1051,1055,1058],{"class":436,"line":1050},22,[434,1052,1054],{"class":1053},"s7zQu","            return",[434,1056,1057],{"class":461}," null;",[434,1059,1060],{"class":440}," // proceed to the route\n",[434,1062,1064,1067],{"class":436,"line":1063},23,[434,1065,1066],{"class":451},"          }",[434,1068,492],{"class":461},[434,1070,1072,1075,1077,1079,1081],{"class":436,"line":1071},24,[434,1073,1074],{"class":451},"          builder",[434,1076,462],{"class":461},[434,1078,878],{"class":451},[434,1080,539],{"class":461},[434,1082,938],{"class":451},[434,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102],{"class":436,"line":1085},25,[434,1087,953],{"class":807},[434,1089,956],{"class":451},[434,1091,483],{"class":461},[434,1093,961],{"class":451},[434,1095,563],{"class":461},[434,1097,966],{"class":451},[434,1099,969],{"class":535},[434,1101,972],{"class":451},[434,1103,975],{"class":461},[434,1105,1107,1109,1112,1114,1116,1118],{"class":436,"line":1106},26,[434,1108,1054],{"class":1053},[434,1110,1111],{"class":447}," UserDetailScreen",[434,1113,585],{"class":451},[434,1115,462],{"class":461},[434,1117,590],{"class":451},[434,1119,789],{"class":461},[434,1121,1123,1125],{"class":436,"line":1122},27,[434,1124,1066],{"class":451},[434,1126,492],{"class":461},[434,1128,1130,1133],{"class":436,"line":1129},28,[434,1131,1132],{"class":451},"        )",[434,1134,492],{"class":461},[434,1136,1138,1141],{"class":436,"line":1137},29,[434,1139,1140],{"class":451},"      ]",[434,1142,492],{"class":461},[434,1144,1146,1149],{"class":436,"line":1145},30,[434,1147,1148],{"class":451},"    )",[434,1150,492],{"class":461},[434,1152,1154,1157],{"class":436,"line":1153},31,[434,1155,1156],{"class":451},"  ]",[434,1158,492],{"class":461},[434,1160,1162,1164],{"class":436,"line":1161},32,[434,1163,489],{"class":451},[434,1165,789],{"class":461},[768,1167,1169],{"id":1168},"with-error-handling","With error handling",[348,1171,1172],{},"Prefetch failures should never block navigation. Wrap the fetcher in a try/catch and log errors for observability:",[424,1174,1176],{"className":426,"code":1175,"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('Prefetch failed for user $userId', error: e, stackTrace: s);\n        rethrow; // still captured by Qora's Failure state\n      }\n    },\n  ).ignore();\n  return null;\n},\n",[387,1177,1178,1190,1211,1226,1242,1256,1263,1281,1297,1340,1350,1355,1362,1374,1382],{"__ignoreMap":430},[434,1179,1180,1182,1184,1186,1188],{"class":436,"line":437},[434,1181,746],{"class":451},[434,1183,462],{"class":461},[434,1185,933],{"class":451},[434,1187,539],{"class":461},[434,1189,938],{"class":451},[434,1191,1192,1195,1197,1199,1201,1203,1205,1207,1209],{"class":436,"line":444},[434,1193,1194],{"class":807},"  final",[434,1196,956],{"class":451},[434,1198,483],{"class":461},[434,1200,961],{"class":451},[434,1202,563],{"class":461},[434,1204,966],{"class":451},[434,1206,969],{"class":535},[434,1208,972],{"class":451},[434,1210,975],{"class":461},[434,1212,1213,1216,1218,1220,1222,1224],{"class":436,"line":455},[434,1214,1215],{"class":451},"  _client",[434,1217,563],{"class":461},[434,1219,661],{"class":471},[434,1221,515],{"class":451},[434,1223,518],{"class":447},[434,1225,521],{"class":451},[434,1227,1228,1230,1232,1234,1236,1238,1240],{"class":436,"line":495},[434,1229,673],{"class":451},[434,1231,462],{"class":461},[434,1233,532],{"class":451},[434,1235,536],{"class":535},[434,1237,539],{"class":461},[434,1239,542],{"class":451},[434,1241,492],{"class":461},[434,1243,1244,1246,1248,1250,1253],{"class":436,"line":506},[434,1245,691],{"class":451},[434,1247,462],{"class":461},[434,1249,555],{"class":451},[434,1251,1252],{"class":1053},"async",[434,1254,1255],{"class":451}," {\n",[434,1257,1258,1261],{"class":436,"line":524},[434,1259,1260],{"class":1053},"      try",[434,1262,1255],{"class":451},[434,1264,1265,1268,1271,1273,1275,1277,1279],{"class":436,"line":547},[434,1266,1267],{"class":1053},"        return",[434,1269,1270],{"class":1053}," await",[434,1272,560],{"class":451},[434,1274,563],{"class":461},[434,1276,566],{"class":471},[434,1278,569],{"class":451},[434,1280,789],{"class":461},[434,1282,1283,1286,1289,1292,1294],{"class":436,"line":574},[434,1284,1285],{"class":451},"      } ",[434,1287,1288],{"class":1053},"catch",[434,1290,1291],{"class":451}," (e",[434,1293,539],{"class":461},[434,1295,1296],{"class":451}," s) {\n",[434,1298,1299,1302,1305,1308,1311,1315,1318,1320,1323,1325,1328,1330,1333,1335,1338],{"class":436,"line":595},[434,1300,1301],{"class":471},"        log",[434,1303,1304],{"class":451},"(",[434,1306,1307],{"class":535},"'Prefetch failed for user ",[434,1309,1310],{"class":451},"$",[434,1312,1314],{"class":1313},"sHdIc","userId",[434,1316,1317],{"class":535},"'",[434,1319,539],{"class":461},[434,1321,1322],{"class":451}," error",[434,1324,462],{"class":461},[434,1326,1327],{"class":451}," e",[434,1329,539],{"class":461},[434,1331,1332],{"class":451}," stackTrace",[434,1334,462],{"class":461},[434,1336,1337],{"class":451}," s)",[434,1339,789],{"class":461},[434,1341,1342,1345,1347],{"class":436,"line":601},[434,1343,1344],{"class":1053},"        rethrow",[434,1346,1044],{"class":461},[434,1348,1349],{"class":440}," // still captured by Qora's Failure state\n",[434,1351,1352],{"class":436,"line":617},[434,1353,1354],{"class":451},"      }\n",[434,1356,1357,1360],{"class":436,"line":623},[434,1358,1359],{"class":451},"    }",[434,1361,492],{"class":461},[434,1363,1364,1366,1368,1370,1372],{"class":436,"line":630},[434,1365,713],{"class":451},[434,1367,563],{"class":461},[434,1369,1039],{"class":471},[434,1371,819],{"class":451},[434,1373,789],{"class":461},[434,1375,1376,1379],{"class":436,"line":636},[434,1377,1378],{"class":1053},"  return",[434,1380,1381],{"class":461}," null;\n",[434,1383,1384,1387],{"class":436,"line":644},[434,1385,1386],{"class":451},"}",[434,1388,492],{"class":461},[352,1390],{},[355,1392,1394],{"id":1393},"autoroute-resolver-based-prefetching","AutoRoute: Resolver-Based Prefetching",[348,1396,1397,1398,1401,1402,1405],{},"AutoRoute uses ",[387,1399,1400],{},"RouteGuard"," or an ",[387,1403,1404],{},"onNavigation"," callback inside the router delegate. A resolver-based approach fires prefetch before the resolver returns the route. The route renders only after the prefetch is dispatched:",[424,1407,1409],{"className":426,"code":1408,"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    // Never block: resolve immediately, data loads in background.\n    resolver.next();\n  }\n}\n",[387,1410,1411,1420,1428,1432,1446,1450,1458,1474,1479,1502,1538,1545,1561,1572,1589,1596,1603,1609,1614,1618,1632,1636,1652,1662,1672,1681,1715,1732,1737,1750,1767,1788,1793,1804,1810,1816,1831,1837],{"__ignoreMap":430},[434,1412,1413,1415,1418],{"class":436,"line":437},[434,1414,783],{"class":782},[434,1416,1417],{"class":535}," 'package:auto_route/auto_route.dart'",[434,1419,789],{"class":461},[434,1421,1422,1424,1426],{"class":436,"line":444},[434,1423,783],{"class":782},[434,1425,796],{"class":535},[434,1427,789],{"class":461},[434,1429,1430],{"class":436,"line":455},[434,1431,627],{"emptyLinePlaceholder":626},[434,1433,1434,1436,1438,1440,1442,1444],{"class":436,"line":495},[434,1435,808],{"class":807},[434,1437,811],{"class":451},[434,1439,483],{"class":461},[434,1441,816],{"class":447},[434,1443,819],{"class":451},[434,1445,789],{"class":461},[434,1447,1448],{"class":436,"line":506},[434,1449,627],{"emptyLinePlaceholder":626},[434,1451,1452,1455],{"class":436,"line":524},[434,1453,1454],{"class":807},"@AutoRouterConfig",[434,1456,1457],{"class":451},"()\n",[434,1459,1460,1463,1466,1469,1472],{"class":436,"line":547},[434,1461,1462],{"class":461},"class",[434,1464,1465],{"class":447}," AppRouter",[434,1467,1468],{"class":461}," extends",[434,1470,1471],{"class":447}," RootStackRouter",[434,1473,1255],{"class":451},[434,1475,1476],{"class":436,"line":574},[434,1477,1478],{"class":807},"  @override\n",[434,1480,1481,1484,1486,1489,1492,1495,1498,1500],{"class":436,"line":595},[434,1482,1483],{"class":447},"  List",[434,1485,515],{"class":451},[434,1487,1488],{"class":447},"AutoRoute",[434,1490,1491],{"class":451},"> ",[434,1493,1494],{"class":461},"get",[434,1496,1497],{"class":451}," routes ",[434,1499,468],{"class":461},[434,1501,849],{"class":451},[434,1503,1504,1507,1510,1512,1515,1517,1520,1522,1525,1527,1529,1531,1534,1536],{"class":436,"line":601},[434,1505,1506],{"class":447},"        AutoRoute",[434,1508,1509],{"class":451},"(page",[434,1511,462],{"class":461},[434,1513,1514],{"class":447}," UserListRoute",[434,1516,563],{"class":461},[434,1518,1519],{"class":451},"page",[434,1521,539],{"class":461},[434,1523,1524],{"class":451}," path",[434,1526,462],{"class":461},[434,1528,866],{"class":535},[434,1530,539],{"class":461},[434,1532,1533],{"class":451}," children",[434,1535,462],{"class":461},[434,1537,849],{"class":451},[434,1539,1540,1543],{"class":436,"line":617},[434,1541,1542],{"class":447},"          AutoRoute",[434,1544,452],{"class":451},[434,1546,1547,1550,1552,1555,1557,1559],{"class":436,"line":623},[434,1548,1549],{"class":451},"            page",[434,1551,462],{"class":461},[434,1553,1554],{"class":447}," UserDetailRoute",[434,1556,563],{"class":461},[434,1558,1519],{"class":451},[434,1560,492],{"class":461},[434,1562,1563,1566,1568,1570],{"class":436,"line":630},[434,1564,1565],{"class":451},"            path",[434,1567,462],{"class":461},[434,1569,921],{"class":535},[434,1571,492],{"class":461},[434,1573,1574,1577,1579,1581,1584,1587],{"class":436,"line":636},[434,1575,1576],{"class":451},"            guards",[434,1578,462],{"class":461},[434,1580,532],{"class":451},[434,1582,1583],{"class":447},"PrefetchGuard",[434,1585,1586],{"class":451},"()]",[434,1588,492],{"class":461},[434,1590,1591,1594],{"class":436,"line":644},[434,1592,1593],{"class":451},"          )",[434,1595,492],{"class":461},[434,1597,1598,1601],{"class":436,"line":670},[434,1599,1600],{"class":451},"        ])",[434,1602,492],{"class":461},[434,1604,1605,1607],{"class":436,"line":688},[434,1606,1140],{"class":451},[434,1608,789],{"class":461},[434,1610,1611],{"class":436,"line":710},[434,1612,1613],{"class":451},"}\n",[434,1615,1616],{"class":436,"line":718},[434,1617,627],{"emptyLinePlaceholder":626},[434,1619,1620,1622,1625,1627,1630],{"class":436,"line":732},[434,1621,1462],{"class":461},[434,1623,1624],{"class":447}," PrefetchGuard",[434,1626,1468],{"class":461},[434,1628,1629],{"class":447}," AutoRouteGuard",[434,1631,1255],{"class":451},[434,1633,1634],{"class":436,"line":1031},[434,1635,1478],{"class":807},[434,1637,1638,1641,1643,1646,1648,1650],{"class":436,"line":1050},[434,1639,1640],{"class":447},"  Future",[434,1642,515],{"class":451},[434,1644,1645],{"class":807},"void",[434,1647,1491],{"class":451},[434,1649,1404],{"class":471},[434,1651,452],{"class":451},[434,1653,1654,1657,1660],{"class":436,"line":1063},[434,1655,1656],{"class":447},"    NavigationResolver",[434,1658,1659],{"class":451}," resolver",[434,1661,492],{"class":461},[434,1663,1664,1667,1670],{"class":436,"line":1071},[434,1665,1666],{"class":447},"    StackRouter",[434,1668,1669],{"class":451}," router",[434,1671,492],{"class":461},[434,1673,1674,1677,1679],{"class":436,"line":1085},[434,1675,1676],{"class":451},"  ) ",[434,1678,1252],{"class":1053},[434,1680,1255],{"class":451},[434,1682,1683,1686,1688,1690,1692,1694,1697,1699,1702,1704,1707,1709,1711,1713],{"class":436,"line":1106},[434,1684,1685],{"class":807},"    final",[434,1687,956],{"class":451},[434,1689,483],{"class":461},[434,1691,1659],{"class":451},[434,1693,563],{"class":461},[434,1695,1696],{"class":451},"route",[434,1698,563],{"class":461},[434,1700,1701],{"class":451},"pathParams",[434,1703,563],{"class":461},[434,1705,1706],{"class":471},"getString",[434,1708,1304],{"class":451},[434,1710,969],{"class":535},[434,1712,489],{"class":451},[434,1714,789],{"class":461},[434,1716,1717,1720,1723,1726,1729],{"class":436,"line":1122},[434,1718,1719],{"class":1053},"    if",[434,1721,1722],{"class":451}," (userId ",[434,1724,1725],{"class":461},"!=",[434,1727,1728],{"class":461}," null",[434,1730,1731],{"class":451},") {\n",[434,1733,1734],{"class":436,"line":1129},[434,1735,1736],{"class":451},"      _client\n",[434,1738,1739,1742,1744,1746,1748],{"class":436,"line":1137},[434,1740,1741],{"class":461},"          .",[434,1743,661],{"class":471},[434,1745,515],{"class":451},[434,1747,518],{"class":447},[434,1749,521],{"class":451},[434,1751,1752,1755,1757,1759,1761,1763,1765],{"class":436,"line":1145},[434,1753,1754],{"class":451},"            key",[434,1756,462],{"class":461},[434,1758,532],{"class":451},[434,1760,536],{"class":535},[434,1762,539],{"class":461},[434,1764,542],{"class":451},[434,1766,492],{"class":461},[434,1768,1769,1772,1774,1776,1778,1780,1782,1784,1786],{"class":436,"line":1153},[434,1770,1771],{"class":451},"            fetcher",[434,1773,462],{"class":461},[434,1775,555],{"class":451},[434,1777,468],{"class":461},[434,1779,560],{"class":451},[434,1781,563],{"class":461},[434,1783,566],{"class":471},[434,1785,569],{"class":451},[434,1787,492],{"class":461},[434,1789,1790],{"class":436,"line":1161},[434,1791,1792],{"class":451},"          )\n",[434,1794,1796,1798,1800,1802],{"class":436,"line":1795},33,[434,1797,1741],{"class":461},[434,1799,1039],{"class":471},[434,1801,819],{"class":451},[434,1803,789],{"class":461},[434,1805,1807],{"class":436,"line":1806},34,[434,1808,1809],{"class":451},"    }\n",[434,1811,1813],{"class":436,"line":1812},35,[434,1814,1815],{"class":440},"    // Never block: resolve immediately, data loads in background.\n",[434,1817,1819,1822,1824,1827,1829],{"class":436,"line":1818},36,[434,1820,1821],{"class":451},"    resolver",[434,1823,563],{"class":461},[434,1825,1826],{"class":471},"next",[434,1828,819],{"class":451},[434,1830,789],{"class":461},[434,1832,1834],{"class":436,"line":1833},37,[434,1835,1836],{"class":451},"  }\n",[434,1838,1840],{"class":436,"line":1839},38,[434,1841,1613],{"class":451},[768,1843,1845],{"id":1844},"with-a-timeout-fallback","With a timeout fallback",[348,1847,1848],{},"If you want to wait a short grace period (e.g. 200 ms) to give the prefetch a head start before resolving, but never block longer than that:",[424,1850,1853],{"className":426,"code":1851,"filename":1852,"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      // Wait at most 200 ms for the prefetch to settle.\n      try {\n        await prefetch.timeout(const Duration(milliseconds: 200));\n      } catch (_) {\n        // Timeout: resolver still proceeds, data loads on-screen.\n      }\n    }\n    resolver.next();\n  }\n}\n","lib/guards/prefetch_guard.dart",[387,1854,1855,1867,1871,1885,1893,1901,1909,1939,1951,1974,1991,2012,2019,2024,2030,2064,2073,2078,2082,2086,2098,2102],{"__ignoreMap":430},[434,1856,1857,1859,1861,1863,1865],{"class":436,"line":437},[434,1858,1462],{"class":461},[434,1860,1624],{"class":447},[434,1862,1468],{"class":461},[434,1864,1629],{"class":447},[434,1866,1255],{"class":451},[434,1868,1869],{"class":436,"line":444},[434,1870,1478],{"class":807},[434,1872,1873,1875,1877,1879,1881,1883],{"class":436,"line":455},[434,1874,1640],{"class":447},[434,1876,515],{"class":451},[434,1878,1645],{"class":807},[434,1880,1491],{"class":451},[434,1882,1404],{"class":471},[434,1884,452],{"class":451},[434,1886,1887,1889,1891],{"class":436,"line":495},[434,1888,1656],{"class":447},[434,1890,1659],{"class":451},[434,1892,492],{"class":461},[434,1894,1895,1897,1899],{"class":436,"line":506},[434,1896,1666],{"class":447},[434,1898,1669],{"class":451},[434,1900,492],{"class":461},[434,1902,1903,1905,1907],{"class":436,"line":524},[434,1904,1676],{"class":451},[434,1906,1252],{"class":1053},[434,1908,1255],{"class":451},[434,1910,1911,1913,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933,1935,1937],{"class":436,"line":547},[434,1912,1685],{"class":807},[434,1914,956],{"class":451},[434,1916,483],{"class":461},[434,1918,1659],{"class":451},[434,1920,563],{"class":461},[434,1922,1696],{"class":451},[434,1924,563],{"class":461},[434,1926,1701],{"class":451},[434,1928,563],{"class":461},[434,1930,1706],{"class":471},[434,1932,1304],{"class":451},[434,1934,969],{"class":535},[434,1936,489],{"class":451},[434,1938,789],{"class":461},[434,1940,1941,1943,1945,1947,1949],{"class":436,"line":574},[434,1942,1719],{"class":1053},[434,1944,1722],{"class":451},[434,1946,1725],{"class":461},[434,1948,1728],{"class":461},[434,1950,1731],{"class":451},[434,1952,1953,1956,1959,1961,1964,1966,1968,1970,1972],{"class":436,"line":595},[434,1954,1955],{"class":807},"      final",[434,1957,1958],{"class":451}," prefetch ",[434,1960,483],{"class":461},[434,1962,1963],{"class":451}," _client",[434,1965,563],{"class":461},[434,1967,661],{"class":471},[434,1969,515],{"class":451},[434,1971,518],{"class":447},[434,1973,521],{"class":451},[434,1975,1976,1979,1981,1983,1985,1987,1989],{"class":436,"line":601},[434,1977,1978],{"class":451},"        key",[434,1980,462],{"class":461},[434,1982,532],{"class":451},[434,1984,536],{"class":535},[434,1986,539],{"class":461},[434,1988,542],{"class":451},[434,1990,492],{"class":461},[434,1992,1993,1996,1998,2000,2002,2004,2006,2008,2010],{"class":436,"line":617},[434,1994,1995],{"class":451},"        fetcher",[434,1997,462],{"class":461},[434,1999,555],{"class":451},[434,2001,468],{"class":461},[434,2003,560],{"class":451},[434,2005,563],{"class":461},[434,2007,566],{"class":471},[434,2009,569],{"class":451},[434,2011,492],{"class":461},[434,2013,2014,2017],{"class":436,"line":623},[434,2015,2016],{"class":451},"      )",[434,2018,789],{"class":461},[434,2020,2021],{"class":436,"line":630},[434,2022,2023],{"class":440},"      // Wait at most 200 ms for the prefetch to settle.\n",[434,2025,2026,2028],{"class":436,"line":636},[434,2027,1260],{"class":1053},[434,2029,1255],{"class":451},[434,2031,2032,2035,2038,2040,2043,2045,2048,2051,2054,2056,2059,2062],{"class":436,"line":644},[434,2033,2034],{"class":1053},"        await",[434,2036,2037],{"class":451}," prefetch",[434,2039,563],{"class":461},[434,2041,2042],{"class":471},"timeout",[434,2044,1304],{"class":451},[434,2046,2047],{"class":807},"const",[434,2049,2050],{"class":447}," Duration",[434,2052,2053],{"class":451},"(milliseconds",[434,2055,462],{"class":461},[434,2057,2058],{"class":782}," 200",[434,2060,2061],{"class":451},"))",[434,2063,789],{"class":461},[434,2065,2066,2068,2070],{"class":436,"line":670},[434,2067,1285],{"class":451},[434,2069,1288],{"class":1053},[434,2071,2072],{"class":451}," (_) {\n",[434,2074,2075],{"class":436,"line":688},[434,2076,2077],{"class":440},"        // Timeout: resolver still proceeds, data loads on-screen.\n",[434,2079,2080],{"class":436,"line":710},[434,2081,1354],{"class":451},[434,2083,2084],{"class":436,"line":718},[434,2085,1809],{"class":451},[434,2087,2088,2090,2092,2094,2096],{"class":436,"line":732},[434,2089,1821],{"class":451},[434,2091,563],{"class":461},[434,2093,1826],{"class":471},[434,2095,819],{"class":451},[434,2097,789],{"class":461},[434,2099,2100],{"class":436,"line":1031},[434,2101,1836],{"class":451},[434,2103,2104],{"class":436,"line":1050},[434,2105,1613],{"class":451},[352,2107],{},[355,2109,2111],{"id":2110},"strategy-cache-first-vs-network-first","Strategy: Cache-First vs Network-First",[363,2113,2114,2127],{},[366,2115,2116],{},[369,2117,2118,2121,2124],{},[372,2119,2120],{},"Strategy",[372,2122,2123],{},"Behaviour",[372,2125,2126],{},"Use when",[379,2128,2129,2143],{},[369,2130,2131,2137,2140],{},[384,2132,2133,2136],{},[759,2134,2135],{},"Cache-first"," (default)",[384,2138,2139],{},"Prefetch is a no-op if fresh data exists. First navigation after stale expiry triggers a fetch.",[384,2141,2142],{},"Data freshness window is known and acceptable.",[369,2144,2145,2150,2153],{},[384,2146,2147],{},[759,2148,2149],{},"Network-first",[384,2151,2152],{},"Always fetch on navigation, bypassing the cache staleness check.",[384,2154,2155],{},"Data must be guaranteed fresh on every visit (e.g. financial dashboards).",[768,2157,2159],{"id":2158},"cache-first-default","Cache-first (default)",[348,2161,754,2162,2164],{},[387,2163,411],{}," method already implements cache-first: it checks the cache and returns immediately if fresh data exists. No additional configuration needed.",[768,2166,2149],{"id":2167},"network-first",[348,2169,2170,2171,2174],{},"Force a fetch by calling ",[387,2172,2173],{},"fetchQuery"," directly or by invalidating the key before prefetching:",[424,2176,2178],{"className":426,"code":2177,"filename":775,"language":429,"meta":430,"style":430},"redirect: (context, state) {\n  final userId = state.pathParameters['id']!;\n  // Always fetch, even if fresh data exists.\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,2179,2180,2192,2212,2217,2238,2252,2268,2288,2300,2306],{"__ignoreMap":430},[434,2181,2182,2184,2186,2188,2190],{"class":436,"line":437},[434,2183,746],{"class":451},[434,2185,462],{"class":461},[434,2187,933],{"class":451},[434,2189,539],{"class":461},[434,2191,938],{"class":451},[434,2193,2194,2196,2198,2200,2202,2204,2206,2208,2210],{"class":436,"line":444},[434,2195,1194],{"class":807},[434,2197,956],{"class":451},[434,2199,483],{"class":461},[434,2201,961],{"class":451},[434,2203,563],{"class":461},[434,2205,966],{"class":451},[434,2207,969],{"class":535},[434,2209,972],{"class":451},[434,2211,975],{"class":461},[434,2213,2214],{"class":436,"line":455},[434,2215,2216],{"class":440},"  // Always fetch, even if fresh data exists.\n",[434,2218,2219,2221,2223,2226,2229,2231,2233,2236],{"class":436,"line":495},[434,2220,1215],{"class":451},[434,2222,563],{"class":461},[434,2224,2225],{"class":471},"invalidate",[434,2227,2228],{"class":451},"([",[434,2230,536],{"class":535},[434,2232,539],{"class":461},[434,2234,2235],{"class":451}," userId])",[434,2237,789],{"class":461},[434,2239,2240,2242,2244,2246,2248,2250],{"class":436,"line":506},[434,2241,1215],{"class":451},[434,2243,563],{"class":461},[434,2245,2173],{"class":471},[434,2247,515],{"class":451},[434,2249,518],{"class":447},[434,2251,521],{"class":451},[434,2253,2254,2256,2258,2260,2262,2264,2266],{"class":436,"line":524},[434,2255,673],{"class":451},[434,2257,462],{"class":461},[434,2259,532],{"class":451},[434,2261,536],{"class":535},[434,2263,539],{"class":461},[434,2265,542],{"class":451},[434,2267,492],{"class":461},[434,2269,2270,2272,2274,2276,2278,2280,2282,2284,2286],{"class":436,"line":547},[434,2271,691],{"class":451},[434,2273,462],{"class":461},[434,2275,555],{"class":451},[434,2277,468],{"class":461},[434,2279,560],{"class":451},[434,2281,563],{"class":461},[434,2283,566],{"class":471},[434,2285,569],{"class":451},[434,2287,492],{"class":461},[434,2289,2290,2292,2294,2296,2298],{"class":436,"line":574},[434,2291,713],{"class":451},[434,2293,563],{"class":461},[434,2295,1039],{"class":471},[434,2297,819],{"class":451},[434,2299,789],{"class":461},[434,2301,2302,2304],{"class":436,"line":595},[434,2303,1378],{"class":1053},[434,2305,1381],{"class":461},[434,2307,2308,2310],{"class":436,"line":601},[434,2309,1386],{"class":451},[434,2311,492],{"class":461},[348,2313,2314,2315,2318,2319,2322,2323,2325],{},"For a reusable pattern, set ",[387,2316,2317],{},"staleTime"," to ",[387,2320,2321],{},"Duration.zero"," in the query options so every ",[387,2324,108],{}," mount triggers a fresh fetch:",[424,2327,2329],{"className":426,"code":2328,"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,2330,2331,2341,2358,2379,2405,2431],{"__ignoreMap":430},[434,2332,2333,2335,2337,2339],{"class":436,"line":437},[434,2334,108],{"class":447},[434,2336,515],{"class":451},[434,2338,518],{"class":447},[434,2340,521],{"class":451},[434,2342,2343,2346,2348,2350,2352,2354,2356],{"class":436,"line":444},[434,2344,2345],{"class":451},"  queryKey",[434,2347,462],{"class":461},[434,2349,532],{"class":451},[434,2351,536],{"class":535},[434,2353,539],{"class":461},[434,2355,542],{"class":451},[434,2357,492],{"class":461},[434,2359,2360,2363,2365,2367,2369,2371,2373,2375,2377],{"class":436,"line":455},[434,2361,2362],{"class":451},"  fetcher",[434,2364,462],{"class":461},[434,2366,555],{"class":451},[434,2368,468],{"class":461},[434,2370,560],{"class":451},[434,2372,563],{"class":461},[434,2374,566],{"class":471},[434,2376,569],{"class":451},[434,2378,492],{"class":461},[434,2380,2381,2384,2386,2388,2391,2394,2396,2398,2400,2403],{"class":436,"line":495},[434,2382,2383],{"class":451},"  options",[434,2385,462],{"class":461},[434,2387,888],{"class":807},[434,2389,2390],{"class":447}," QoraOptions",[434,2392,2393],{"class":451},"(staleTime",[434,2395,462],{"class":461},[434,2397,2050],{"class":447},[434,2399,563],{"class":461},[434,2401,2402],{"class":451},"zero)",[434,2404,492],{"class":461},[434,2406,2407,2410,2412,2414,2416,2418,2420,2423,2426,2429],{"class":436,"line":506},[434,2408,2409],{"class":451},"  builder",[434,2411,462],{"class":461},[434,2413,933],{"class":451},[434,2415,539],{"class":461},[434,2417,961],{"class":451},[434,2419,539],{"class":461},[434,2421,2422],{"class":451}," _) { ",[434,2424,2425],{"class":461},"...",[434,2427,2428],{"class":451}," }",[434,2430,492],{"class":461},[434,2432,2433],{"class":436,"line":524},[434,2434,620],{"class":451},[352,2436],{},[355,2438,2440,2441,2444],{"id":2439},"using-qoraprefetch-inside-a-route","Using ",[387,2442,2443],{},"QoraPrefetch"," Inside a Route",[348,2446,2447,2448,2450],{},"If you cannot (or prefer not to) modify your routing layer, embed ",[387,2449,2443],{}," at the widget level. This is the simplest approach when the navigable child is already in the tree:",[424,2452,2455],{"className":426,"code":2453,"filename":2454,"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,2456,2457,2469,2486,2500,2514,2527,2550,2577,2589,2608,2650,2656,2662,2669],{"__ignoreMap":430},[434,2458,2459,2462,2464,2467],{"class":436,"line":437},[434,2460,2461],{"class":447},"ListView",[434,2463,563],{"class":461},[434,2465,2466],{"class":471},"builder",[434,2468,452],{"class":451},[434,2470,2471,2474,2476,2479,2481,2484],{"class":436,"line":444},[434,2472,2473],{"class":451},"  itemCount",[434,2475,462],{"class":461},[434,2477,2478],{"class":451}," users",[434,2480,563],{"class":461},[434,2482,2483],{"class":451},"length",[434,2485,492],{"class":461},[434,2487,2488,2491,2493,2495,2497],{"class":436,"line":455},[434,2489,2490],{"class":451},"  itemBuilder",[434,2492,462],{"class":461},[434,2494,933],{"class":451},[434,2496,539],{"class":461},[434,2498,2499],{"class":451}," index) {\n",[434,2501,2502,2504,2507,2509,2512],{"class":436,"line":495},[434,2503,1685],{"class":807},[434,2505,2506],{"class":451}," user ",[434,2508,483],{"class":461},[434,2510,2511],{"class":451}," users[index]",[434,2513,789],{"class":461},[434,2515,2516,2519,2521,2523,2525],{"class":436,"line":506},[434,2517,2518],{"class":1053},"    return",[434,2520,512],{"class":447},[434,2522,515],{"class":451},[434,2524,518],{"class":447},[434,2526,521],{"class":451},[434,2528,2529,2532,2534,2536,2538,2540,2543,2545,2548],{"class":436,"line":524},[434,2530,2531],{"class":451},"      queryKey",[434,2533,462],{"class":461},[434,2535,532],{"class":451},[434,2537,536],{"class":535},[434,2539,539],{"class":461},[434,2541,2542],{"class":451}," user",[434,2544,563],{"class":461},[434,2546,2547],{"class":451},"id]",[434,2549,492],{"class":461},[434,2551,2552,2555,2557,2559,2561,2563,2565,2567,2570,2572,2575],{"class":436,"line":547},[434,2553,2554],{"class":451},"      fetcher",[434,2556,462],{"class":461},[434,2558,555],{"class":451},[434,2560,468],{"class":461},[434,2562,560],{"class":451},[434,2564,563],{"class":461},[434,2566,566],{"class":471},[434,2568,2569],{"class":451},"(user",[434,2571,563],{"class":461},[434,2573,2574],{"class":451},"id)",[434,2576,492],{"class":461},[434,2578,2579,2582,2584,2587],{"class":436,"line":574},[434,2580,2581],{"class":451},"      child",[434,2583,462],{"class":461},[434,2585,2586],{"class":447}," ListTile",[434,2588,452],{"class":451},[434,2590,2591,2594,2596,2599,2601,2603,2606],{"class":436,"line":595},[434,2592,2593],{"class":451},"        title",[434,2595,462],{"class":461},[434,2597,2598],{"class":447}," Text",[434,2600,2569],{"class":451},[434,2602,563],{"class":461},[434,2604,2605],{"class":451},"name)",[434,2607,492],{"class":461},[434,2609,2610,2613,2615,2617,2619,2621,2623,2626,2628,2631,2634,2637,2639,2642,2644,2646,2648],{"class":436,"line":601},[434,2611,2612],{"class":451},"        onTap",[434,2614,462],{"class":461},[434,2616,555],{"class":451},[434,2618,468],{"class":461},[434,2620,656],{"class":451},[434,2622,563],{"class":461},[434,2624,2625],{"class":471},"push",[434,2627,1304],{"class":451},[434,2629,2630],{"class":535},"'/users/",[434,2632,2633],{"class":451},"${",[434,2635,2636],{"class":1313},"user",[434,2638,563],{"class":451},[434,2640,2641],{"class":1313},"id",[434,2643,1386],{"class":451},[434,2645,1317],{"class":535},[434,2647,489],{"class":451},[434,2649,492],{"class":461},[434,2651,2652,2654],{"class":436,"line":617},[434,2653,2016],{"class":451},[434,2655,492],{"class":461},[434,2657,2658,2660],{"class":436,"line":623},[434,2659,1148],{"class":451},[434,2661,789],{"class":461},[434,2663,2664,2667],{"class":436,"line":630},[434,2665,2666],{"class":451},"  }",[434,2668,492],{"class":461},[434,2670,2671],{"class":436,"line":636},[434,2672,620],{"class":451},[348,2674,2675,2676,2678],{},"Prefetch fires on mount (when the list item appears) and re-fires if ",[387,2677,421],{}," changes. By the time the user taps, data is cached.",[352,2680],{},[355,2682,2684],{"id":2683},"testing-prefetch-logic","Testing Prefetch Logic",[348,2686,2687,2688,2690],{},"Use ",[387,2689,202],{}," directly in tests without any routing framework:",[424,2692,2695],{"className":426,"code":2693,"filename":2694,"language":429,"meta":430,"style":430},"import 'package:qora/qora.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  test('prefetch populates cache before screen mounts', () 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    // Screen widget now mounts and reads from 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,2696,2697,2706,2715,2719,2729,2747,2762,2766,2784,2804,2841,2847,2851,2856,2890,2917,2955,2962],{"__ignoreMap":430},[434,2698,2699,2701,2704],{"class":436,"line":437},[434,2700,783],{"class":782},[434,2702,2703],{"class":535}," 'package:qora/qora.dart'",[434,2705,789],{"class":461},[434,2707,2708,2710,2713],{"class":436,"line":444},[434,2709,783],{"class":782},[434,2711,2712],{"class":535}," 'package:test/test.dart'",[434,2714,789],{"class":461},[434,2716,2717],{"class":436,"line":455},[434,2718,627],{"emptyLinePlaceholder":626},[434,2720,2721,2723,2726],{"class":436,"line":495},[434,2722,1645],{"class":807},[434,2724,2725],{"class":471}," main",[434,2727,2728],{"class":451},"() {\n",[434,2730,2731,2734,2736,2739,2741,2743,2745],{"class":436,"line":506},[434,2732,2733],{"class":471},"  test",[434,2735,1304],{"class":451},[434,2737,2738],{"class":535},"'prefetch populates cache before screen mounts'",[434,2740,539],{"class":461},[434,2742,555],{"class":451},[434,2744,1252],{"class":1053},[434,2746,1255],{"class":451},[434,2748,2749,2751,2754,2756,2758,2760],{"class":436,"line":524},[434,2750,1685],{"class":807},[434,2752,2753],{"class":451}," client ",[434,2755,483],{"class":461},[434,2757,816],{"class":447},[434,2759,819],{"class":451},[434,2761,789],{"class":461},[434,2763,2764],{"class":436,"line":547},[434,2765,627],{"emptyLinePlaceholder":626},[434,2767,2768,2771,2774,2776,2778,2780,2782],{"class":436,"line":574},[434,2769,2770],{"class":1053},"    await",[434,2772,2773],{"class":451}," client",[434,2775,563],{"class":461},[434,2777,661],{"class":471},[434,2779,515],{"class":451},[434,2781,518],{"class":447},[434,2783,521],{"class":451},[434,2785,2786,2789,2791,2793,2795,2797,2800,2802],{"class":436,"line":595},[434,2787,2788],{"class":451},"      key",[434,2790,462],{"class":461},[434,2792,532],{"class":451},[434,2794,536],{"class":535},[434,2796,539],{"class":461},[434,2798,2799],{"class":782}," 1",[434,2801,972],{"class":451},[434,2803,492],{"class":461},[434,2805,2806,2808,2810,2812,2814,2817,2820,2823,2825,2827,2829,2832,2834,2837,2839],{"class":436,"line":601},[434,2807,2554],{"class":451},[434,2809,462],{"class":461},[434,2811,555],{"class":451},[434,2813,1252],{"class":1053},[434,2815,2816],{"class":461}," =>",[434,2818,2819],{"class":447}," User",[434,2821,2822],{"class":451},"(id",[434,2824,462],{"class":461},[434,2826,2799],{"class":782},[434,2828,539],{"class":461},[434,2830,2831],{"class":451}," name",[434,2833,462],{"class":461},[434,2835,2836],{"class":535}," 'Alice'",[434,2838,489],{"class":451},[434,2840,492],{"class":461},[434,2842,2843,2845],{"class":436,"line":617},[434,2844,1148],{"class":451},[434,2846,789],{"class":461},[434,2848,2849],{"class":436,"line":623},[434,2850,627],{"emptyLinePlaceholder":626},[434,2852,2853],{"class":436,"line":630},[434,2854,2855],{"class":440},"    // Screen widget now mounts and reads from cache.\n",[434,2857,2858,2860,2863,2865,2867,2869,2872,2874,2876,2879,2881,2883,2885,2888],{"class":436,"line":636},[434,2859,1685],{"class":807},[434,2861,2862],{"class":451}," state ",[434,2864,483],{"class":461},[434,2866,2773],{"class":451},[434,2868,563],{"class":461},[434,2870,2871],{"class":471},"getQueryState",[434,2873,515],{"class":451},[434,2875,518],{"class":447},[434,2877,2878],{"class":451},">([",[434,2880,536],{"class":535},[434,2882,539],{"class":461},[434,2884,2799],{"class":782},[434,2886,2887],{"class":451},"])",[434,2889,789],{"class":461},[434,2891,2892,2895,2898,2900,2903,2905,2908,2910,2912,2915],{"class":436,"line":644},[434,2893,2894],{"class":471},"    expect",[434,2896,2897],{"class":451},"(state",[434,2899,539],{"class":461},[434,2901,2902],{"class":471}," isA",[434,2904,515],{"class":451},[434,2906,2907],{"class":447},"Success",[434,2909,515],{"class":451},[434,2911,518],{"class":447},[434,2913,2914],{"class":451},">>())",[434,2916,789],{"class":461},[434,2918,2919,2921,2924,2927,2930,2932,2934,2937,2939,2942,2944,2947,2949,2951,2953],{"class":436,"line":670},[434,2920,2894],{"class":471},[434,2922,2923],{"class":451},"((state ",[434,2925,2926],{"class":461},"as",[434,2928,2929],{"class":447}," Success",[434,2931,515],{"class":451},[434,2933,518],{"class":447},[434,2935,2936],{"class":451},">)",[434,2938,563],{"class":461},[434,2940,2941],{"class":451},"data",[434,2943,563],{"class":461},[434,2945,2946],{"class":451},"name",[434,2948,539],{"class":461},[434,2950,2836],{"class":535},[434,2952,489],{"class":451},[434,2954,789],{"class":461},[434,2956,2957,2960],{"class":436,"line":688},[434,2958,2959],{"class":451},"  })",[434,2961,789],{"class":461},[434,2963,2964],{"class":436,"line":710},[434,2965,1613],{"class":451},[352,2967],{},[355,2969,2971],{"id":2970},"next-steps","Next Steps",[2973,2974,2975,2984,2990,2996,3002],"ul",{},[2976,2977,2978,2983],"li",{},[2979,2980,2982],"a",{"href":2981},"../api-reference/qora-client","QoraClient.prefetch",": API reference for the core prefetch method",[2976,2985,2986,2989],{},[2979,2987,133],{"href":2988},"../flutter-integration/best-practices",": Additional prefetch patterns (hover, focus, scroll-into-view)",[2976,2991,2992,2995],{},[2979,2993,167],{"href":2994},"./dependent-queries",": Chain queries that depend on prefetched data",[2976,2997,2998,3001],{},[2979,2999,172],{"href":3000},"./cancel-token",": Cancel in-flight prefetches on rapid navigation",[2976,3003,3004,3007],{},[2979,3005,187],{"href":3006},"./testing",": Write deterministic tests for prefetch logic",[3009,3010,3011],"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":3013},[3014,3015,3019,3022,3026,3028,3029],{"id":357,"depth":444,"text":358},{"id":739,"depth":444,"text":740,"children":3016},[3017,3018],{"id":770,"depth":455,"text":771},{"id":1168,"depth":455,"text":1169},{"id":1393,"depth":444,"text":1394,"children":3020},[3021],{"id":1844,"depth":455,"text":1845},{"id":2110,"depth":444,"text":2111,"children":3023},[3024,3025],{"id":2158,"depth":455,"text":2159},{"id":2167,"depth":455,"text":2149},{"id":2439,"depth":444,"text":3027},"Using QoraPrefetch Inside a Route",{"id":2683,"depth":444,"text":2684},{"id":2970,"depth":444,"text":2971},"[object Object]","md",null,{},{"title":192,"description":3035},{"Preload query data before a screen mounts using GoRouter redirects, AutoRoute resolvers, or QoraPrefetch":3036,"navigation":3037,"seo":3039},"eliminating loading spinners during navigation.",{"icon":3038},"i-lucide-navigation",{"title":3040,"description":3041},"Route-Level Prefetching - Qora","Prefetch Qora query data before a screen mounts with GoRouter and AutoRoute patterns. Eliminate loading spinners during navigation with cache-first or network-first strategies.","PmDGcndk6QlEbb2Pw1WQJ7bB5DBxBg-ZBo4_AG9IXZ4",[3044,3046],{"title":187,"path":188,"stem":189,"description":3045,"icon":190,"children":-1},"Test Qora queries, mutations, and widgets with deterministic helpers: no network, no Hive, no timers.",{"title":202,"path":203,"stem":204,"description":3047,"icon":205,"children":-1},"The central engine of Qora: manages queries, cache, deduplication, retries, and reactive state",1794040400927]