[{"data":1,"prerenderedAt":1642},["ShallowReactive",2],{"navigation_docs_en":3,"-en-core-concepts-stale-while-revalidate":342,"-en-core-concepts-stale-while-revalidate-surround":1637},[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":72,"body":344,"description":1630,"extension":1631,"links":1632,"meta":1633,"navigation":1634,"path":73,"seo":1635,"stem":74,"__hash__":1636},"docs_en/en/02.core-concepts/5.stale-while-revalidate.md",{"type":345,"value":346,"toc":1612},"minimark",[347,352,356,373,376,379,383,395,407,417,419,423,558,567,639,641,647,652,802,804,809,814,1191,1195,1201,1203,1207,1216,1307,1309,1313,1320,1440,1446,1448,1452,1455,1575,1577,1581,1608],[348,349,351],"h2",{"id":350},"the-problem-swr-solves","The Problem SWR Solves",[353,354,355],"p",{},"Traditional data fetching presents a tradeoff:",[357,358,359,367],"ul",{},[360,361,362,366],"li",{},[363,364,365],"strong",{},"No cache",": data is always current, but every navigation triggers a network request and shows a spinner.",[360,368,369,372],{},[363,370,371],{},"Permanent cache",": responses are instant, but data goes stale and the UI reflects outdated information.",[353,374,375],{},"SWR (Stale-While-Revalidate) resolves this tradeoff.",[377,378],"hr",{},[348,380,382],{"id":381},"how-it-works","How It Works",[353,384,385,386,390,391,394],{},"When ",[387,388,389],"code",{},"fetchQuery"," or ",[387,392,393],{},"watchQuery"," is called with stale data in cache:",[396,397,398,401,404],"ol",{},[360,399,400],{},"Return the stale data immediately. The UI renders without a spinner.",[360,402,403],{},"Dispatch a background revalidation. The fetcher runs silently.",[360,405,406],{},"Update the cache and all active streams when fresh data arrives.",[408,409,415],"pre",{"className":410,"code":412,"language":413,"meta":414},[411],"language-text","t=0:00  Success(user: Alice, updatedAt: 10:00)   ← staleTime: 5 min\nt=5:01  fetchQuery called\n         ├── returns Alice immediately (stale data)\n         └── fires background fetch\nt=5:02  Success(user: Alice McBride, updatedAt: 10:05)   ← updated\n         └── watchQuery streams emit new state\n","text","",[387,416,412],{"__ignoreMap":414},[377,418],{},[348,420,422],{"id":421},"configuring-stale-time","Configuring Stale Time",[408,424,429],{"className":425,"code":426,"filename":427,"language":428,"meta":414,"style":414},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Default: Duration.zero: always stale, always revalidates\n// (still serves cached data instantly on every call)\noptions: QoraOptions(staleTime: Duration.zero),\n\n// Fresh for 5 minutes: no network call within the window\noptions: QoraOptions(staleTime: Duration(minutes: 5)),\n\n// Configuration data: only revalidates once per hour\noptions: QoraOptions(staleTime: Duration(hours: 1)),\n","user_repository.dart","dart",[387,430,431,440,446,478,485,491,520,525,531],{"__ignoreMap":414},[432,433,436],"span",{"class":434,"line":435},"line",1,[432,437,439],{"class":438},"sHwdD","// Default: Duration.zero: always stale, always revalidates\n",[432,441,443],{"class":434,"line":442},2,[432,444,445],{"class":438},"// (still serves cached data instantly on every call)\n",[432,447,449,453,457,461,464,466,469,472,475],{"class":434,"line":448},3,[432,450,452],{"class":451},"sTEyZ","options",[432,454,456],{"class":455},"sMK4o",":",[432,458,460],{"class":459},"sBMFI"," QoraOptions",[432,462,463],{"class":451},"(staleTime",[432,465,456],{"class":455},[432,467,468],{"class":459}," Duration",[432,470,471],{"class":455},".",[432,473,474],{"class":451},"zero)",[432,476,477],{"class":455},",\n",[432,479,481],{"class":434,"line":480},4,[432,482,484],{"emptyLinePlaceholder":483},true,"\n",[432,486,488],{"class":434,"line":487},5,[432,489,490],{"class":438},"// Fresh for 5 minutes: no network call within the window\n",[432,492,494,496,498,500,502,504,506,509,511,515,518],{"class":434,"line":493},6,[432,495,452],{"class":451},[432,497,456],{"class":455},[432,499,460],{"class":459},[432,501,463],{"class":451},[432,503,456],{"class":455},[432,505,468],{"class":459},[432,507,508],{"class":451},"(minutes",[432,510,456],{"class":455},[432,512,514],{"class":513},"sbssI"," 5",[432,516,517],{"class":451},"))",[432,519,477],{"class":455},[432,521,523],{"class":434,"line":522},7,[432,524,484],{"emptyLinePlaceholder":483},[432,526,528],{"class":434,"line":527},8,[432,529,530],{"class":438},"// Configuration data: only revalidates once per hour\n",[432,532,534,536,538,540,542,544,546,549,551,554,556],{"class":434,"line":533},9,[432,535,452],{"class":451},[432,537,456],{"class":455},[432,539,460],{"class":459},[432,541,463],{"class":451},[432,543,456],{"class":455},[432,545,468],{"class":459},[432,547,548],{"class":451},"(hours",[432,550,456],{"class":455},[432,552,553],{"class":513}," 1",[432,555,517],{"class":451},[432,557,477],{"class":455},[559,560,562,563,566],"h3",{"id":561},"choosing-staletime-by-data-type","Choosing ",[387,564,565],{},"staleTime"," by data type",[568,569,570,585],"table",{},[571,572,573],"thead",{},[574,575,576,580],"tr",{},[577,578,579],"th",{},"Data type",[577,581,582,583],{},"Recommended ",[387,584,565],{},[586,587,588,599,609,619,629],"tbody",{},[574,589,590,594],{},[591,592,593],"td",{},"Live prices, notifications",[591,595,596],{},[387,597,598],{},"Duration.zero",[574,600,601,604],{},[591,602,603],{},"User profile, settings",[591,605,606],{},[387,607,608],{},"Duration(minutes: 5)",[574,610,611,614],{},[591,612,613],{},"Post / article content",[591,615,616],{},[387,617,618],{},"Duration(minutes: 10)",[574,620,621,624],{},[591,622,623],{},"Rarely-changing config",[591,625,626],{},[387,627,628],{},"Duration(hours: 1)",[574,630,631,634],{},[591,632,633],{},"Static reference data",[591,635,636],{},[387,637,638],{},"Duration(days: 1)",[377,640],{},[348,642,644,645],{"id":643},"swr-with-fetchquery","SWR with ",[387,646,389],{},[353,648,385,649,651],{},[387,650,389],{}," hits a stale cache entry, it returns the stale data synchronously and fires a revalidation in the background. The call resolves immediately:",[408,653,655],{"className":425,"code":654,"filename":427,"language":428,"meta":414,"style":414},"// This returns immediately with cached data if available\nfinal user = await client.fetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: QoraOptions(staleTime: Duration(minutes: 5)),\n);\n\n// If data was stale:\n// - `user` is the stale value (returned instantly)\n// - A background fetch is already in progress\n// - Active watchQuery streams will receive the updated user when the fetch completes\n",[387,656,657,662,695,717,743,768,776,780,785,790,796],{"__ignoreMap":414},[432,658,659],{"class":434,"line":435},[432,660,661],{"class":438},"// This returns immediately with cached data if available\n",[432,663,664,668,671,674,678,681,683,686,689,692],{"class":434,"line":442},[432,665,667],{"class":666},"spNyl","final",[432,669,670],{"class":451}," user ",[432,672,673],{"class":455},"=",[432,675,677],{"class":676},"s7zQu"," await",[432,679,680],{"class":451}," client",[432,682,471],{"class":455},[432,684,389],{"class":685},"s2Zo4",[432,687,688],{"class":451},"\u003C",[432,690,691],{"class":459},"User",[432,693,694],{"class":451},">(\n",[432,696,697,700,702,705,709,712,715],{"class":434,"line":448},[432,698,699],{"class":451},"  key",[432,701,456],{"class":455},[432,703,704],{"class":451}," [",[432,706,708],{"class":707},"sfazB","'users'",[432,710,711],{"class":455},",",[432,713,714],{"class":451}," userId]",[432,716,477],{"class":455},[432,718,719,722,724,727,730,733,735,738,741],{"class":434,"line":480},[432,720,721],{"class":451},"  fetcher",[432,723,456],{"class":455},[432,725,726],{"class":451}," () ",[432,728,729],{"class":455},"=>",[432,731,732],{"class":451}," api",[432,734,471],{"class":455},[432,736,737],{"class":685},"getUser",[432,739,740],{"class":451},"(userId)",[432,742,477],{"class":455},[432,744,745,748,750,752,754,756,758,760,762,764,766],{"class":434,"line":487},[432,746,747],{"class":451},"  options",[432,749,456],{"class":455},[432,751,460],{"class":459},[432,753,463],{"class":451},[432,755,456],{"class":455},[432,757,468],{"class":459},[432,759,508],{"class":451},[432,761,456],{"class":455},[432,763,514],{"class":513},[432,765,517],{"class":451},[432,767,477],{"class":455},[432,769,770,773],{"class":434,"line":493},[432,771,772],{"class":451},")",[432,774,775],{"class":455},";\n",[432,777,778],{"class":434,"line":522},[432,779,484],{"emptyLinePlaceholder":483},[432,781,782],{"class":434,"line":527},[432,783,784],{"class":438},"// If data was stale:\n",[432,786,787],{"class":434,"line":533},[432,788,789],{"class":438},"// - `user` is the stale value (returned instantly)\n",[432,791,793],{"class":434,"line":792},10,[432,794,795],{"class":438},"// - A background fetch is already in progress\n",[432,797,799],{"class":434,"line":798},11,[432,800,801],{"class":438},"// - Active watchQuery streams will receive the updated user when the fetch completes\n",[377,803],{},[348,805,644,807],{"id":806},"swr-with-watchquery",[387,808,393],{},[353,810,811,813],{},[387,812,393],{}," streams are the primary interface for SWR. Subscribers receive the latest state, including the result of background revalidation:",[408,815,818],{"className":425,"code":816,"filename":817,"language":428,"meta":414,"style":414},"StreamBuilder\u003CQoraState\u003CUser>>(\n  stream: client.watchQuery\u003CUser>(\n    key: ['users', userId],\n    fetcher: () => api.getUser(userId),\n    options: QoraOptions(staleTime: Duration(minutes: 5)),\n  ),\n  builder: (context, snapshot) {\n    return switch (snapshot.data) {\n      // Shows stale data instantly while Loading(previousData: user) is emitted\n      Loading(:final previousData) when previousData != null =>\n        Stack(children: [\n          UserCard(previousData),\n          const LinearProgressIndicator(),\n        ]),\n      Success(:final data) => UserCard(data),\n      Failure(:final error, :final previousData) => Column(children: [\n          if (previousData != null) UserCard(previousData),\n          ErrorBanner('$error'),\n        ]),\n      _ => const CircularProgressIndicator(),\n    };\n  },\n)\n","user_page.dart",[387,819,820,836,855,872,893,918,925,940,956,961,991,1004,1015,1029,1037,1062,1097,1120,1144,1151,1169,1177,1185],{"__ignoreMap":414},[432,821,822,825,827,829,831,833],{"class":434,"line":435},[432,823,824],{"class":459},"StreamBuilder",[432,826,688],{"class":451},[432,828,211],{"class":459},[432,830,688],{"class":451},[432,832,691],{"class":459},[432,834,835],{"class":451},">>(\n",[432,837,838,841,843,845,847,849,851,853],{"class":434,"line":442},[432,839,840],{"class":451},"  stream",[432,842,456],{"class":455},[432,844,680],{"class":451},[432,846,471],{"class":455},[432,848,393],{"class":685},[432,850,688],{"class":451},[432,852,691],{"class":459},[432,854,694],{"class":451},[432,856,857,860,862,864,866,868,870],{"class":434,"line":448},[432,858,859],{"class":451},"    key",[432,861,456],{"class":455},[432,863,704],{"class":451},[432,865,708],{"class":707},[432,867,711],{"class":455},[432,869,714],{"class":451},[432,871,477],{"class":455},[432,873,874,877,879,881,883,885,887,889,891],{"class":434,"line":480},[432,875,876],{"class":451},"    fetcher",[432,878,456],{"class":455},[432,880,726],{"class":451},[432,882,729],{"class":455},[432,884,732],{"class":451},[432,886,471],{"class":455},[432,888,737],{"class":685},[432,890,740],{"class":451},[432,892,477],{"class":455},[432,894,895,898,900,902,904,906,908,910,912,914,916],{"class":434,"line":487},[432,896,897],{"class":451},"    options",[432,899,456],{"class":455},[432,901,460],{"class":459},[432,903,463],{"class":451},[432,905,456],{"class":455},[432,907,468],{"class":459},[432,909,508],{"class":451},[432,911,456],{"class":455},[432,913,514],{"class":513},[432,915,517],{"class":451},[432,917,477],{"class":455},[432,919,920,923],{"class":434,"line":493},[432,921,922],{"class":451},"  )",[432,924,477],{"class":455},[432,926,927,930,932,935,937],{"class":434,"line":522},[432,928,929],{"class":451},"  builder",[432,931,456],{"class":455},[432,933,934],{"class":451}," (context",[432,936,711],{"class":455},[432,938,939],{"class":451}," snapshot) {\n",[432,941,942,945,948,951,953],{"class":434,"line":527},[432,943,944],{"class":676},"    return",[432,946,947],{"class":676}," switch",[432,949,950],{"class":451}," (snapshot",[432,952,471],{"class":455},[432,954,955],{"class":451},"data) {\n",[432,957,958],{"class":434,"line":533},[432,959,960],{"class":438},"      // Shows stale data instantly while Loading(previousData: user) is emitted\n",[432,962,963,966,969,971,973,976,979,982,985,988],{"class":434,"line":792},[432,964,965],{"class":459},"      Loading",[432,967,968],{"class":451},"(",[432,970,456],{"class":455},[432,972,667],{"class":666},[432,974,975],{"class":451}," previousData) ",[432,977,978],{"class":676},"when",[432,980,981],{"class":451}," previousData ",[432,983,984],{"class":455},"!=",[432,986,987],{"class":455}," null",[432,989,990],{"class":455}," =>\n",[432,992,993,996,999,1001],{"class":434,"line":798},[432,994,995],{"class":459},"        Stack",[432,997,998],{"class":451},"(children",[432,1000,456],{"class":455},[432,1002,1003],{"class":451}," [\n",[432,1005,1007,1010,1013],{"class":434,"line":1006},12,[432,1008,1009],{"class":459},"          UserCard",[432,1011,1012],{"class":451},"(previousData)",[432,1014,477],{"class":455},[432,1016,1018,1021,1024,1027],{"class":434,"line":1017},13,[432,1019,1020],{"class":666},"          const",[432,1022,1023],{"class":459}," LinearProgressIndicator",[432,1025,1026],{"class":451},"()",[432,1028,477],{"class":455},[432,1030,1032,1035],{"class":434,"line":1031},14,[432,1033,1034],{"class":451},"        ])",[432,1036,477],{"class":455},[432,1038,1040,1043,1045,1047,1049,1052,1054,1057,1060],{"class":434,"line":1039},15,[432,1041,1042],{"class":459},"      Success",[432,1044,968],{"class":451},[432,1046,456],{"class":455},[432,1048,667],{"class":666},[432,1050,1051],{"class":451}," data) ",[432,1053,729],{"class":455},[432,1055,1056],{"class":459}," UserCard",[432,1058,1059],{"class":451},"(data)",[432,1061,477],{"class":455},[432,1063,1065,1068,1070,1072,1074,1077,1079,1082,1084,1086,1088,1091,1093,1095],{"class":434,"line":1064},16,[432,1066,1067],{"class":459},"      Failure",[432,1069,968],{"class":451},[432,1071,456],{"class":455},[432,1073,667],{"class":666},[432,1075,1076],{"class":451}," error",[432,1078,711],{"class":455},[432,1080,1081],{"class":455}," :",[432,1083,667],{"class":666},[432,1085,975],{"class":451},[432,1087,729],{"class":455},[432,1089,1090],{"class":459}," Column",[432,1092,998],{"class":451},[432,1094,456],{"class":455},[432,1096,1003],{"class":451},[432,1098,1100,1103,1106,1108,1110,1113,1116,1118],{"class":434,"line":1099},17,[432,1101,1102],{"class":676},"          if",[432,1104,1105],{"class":451}," (previousData ",[432,1107,984],{"class":455},[432,1109,987],{"class":455},[432,1111,1112],{"class":451},") ",[432,1114,1115],{"class":459},"UserCard",[432,1117,1012],{"class":451},[432,1119,477],{"class":455},[432,1121,1123,1126,1128,1131,1134,1138,1140,1142],{"class":434,"line":1122},18,[432,1124,1125],{"class":459},"          ErrorBanner",[432,1127,968],{"class":451},[432,1129,1130],{"class":707},"'",[432,1132,1133],{"class":451},"$",[432,1135,1137],{"class":1136},"sHdIc","error",[432,1139,1130],{"class":707},[432,1141,772],{"class":451},[432,1143,477],{"class":455},[432,1145,1147,1149],{"class":434,"line":1146},19,[432,1148,1034],{"class":451},[432,1150,477],{"class":455},[432,1152,1154,1157,1159,1162,1165,1167],{"class":434,"line":1153},20,[432,1155,1156],{"class":451},"      _ ",[432,1158,729],{"class":455},[432,1160,1161],{"class":666}," const",[432,1163,1164],{"class":459}," CircularProgressIndicator",[432,1166,1026],{"class":451},[432,1168,477],{"class":455},[432,1170,1172,1175],{"class":434,"line":1171},21,[432,1173,1174],{"class":451},"    }",[432,1176,775],{"class":455},[432,1178,1180,1183],{"class":434,"line":1179},22,[432,1181,1182],{"class":451},"  }",[432,1184,477],{"class":455},[432,1186,1188],{"class":434,"line":1187},23,[432,1189,1190],{"class":451},")\n",[559,1192,1194],{"id":1193},"state-sequence-on-mount-with-stale-cache","State sequence on mount with stale cache",[408,1196,1199],{"className":1197,"code":1198,"language":413,"meta":414},[411],"Subscription starts\n  ↓ emits immediately\nLoading(previousData: Alice)    ← stale data visible, subtle loading indicator\n  ↓ fetch completes\nSuccess(data: Alice McBride)    ← fresh data, UI updates seamlessly\n",[387,1200,1198],{"__ignoreMap":414},[377,1202],{},[348,1204,1206],{"id":1205},"refetch-on-mount","Refetch on Mount",[353,1208,1209,1210,1212,1213,456],{},"By default, ",[387,1211,393],{}," triggers a fetch on the first subscription when data is stale. This behavior is controlled by ",[387,1214,1215],{},"refetchOnMount",[408,1217,1220],{"className":425,"code":1218,"filename":1219,"language":428,"meta":414,"style":414},"// Always refetch on mount, even if cached data is still fresh (default when\n// QoraClientConfig.refetchOnMount is true)\noptions: QoraOptions(refetchOnMount: true),\n\n// Only fetch if data is missing or stale; skip refetch when data is fresh\noptions: QoraOptions(refetchOnMount: false),\n\n// Inherit the global QoraClientConfig.refetchOnMount setting (default)\noptions: QoraOptions(refetchOnMount: null),\n","main.dart",[387,1221,1222,1227,1232,1252,1256,1261,1280,1284,1289],{"__ignoreMap":414},[432,1223,1224],{"class":434,"line":435},[432,1225,1226],{"class":438},"// Always refetch on mount, even if cached data is still fresh (default when\n",[432,1228,1229],{"class":434,"line":442},[432,1230,1231],{"class":438},"// QoraClientConfig.refetchOnMount is true)\n",[432,1233,1234,1236,1238,1240,1243,1245,1248,1250],{"class":434,"line":448},[432,1235,452],{"class":451},[432,1237,456],{"class":455},[432,1239,460],{"class":459},[432,1241,1242],{"class":451},"(refetchOnMount",[432,1244,456],{"class":455},[432,1246,1247],{"class":455}," true",[432,1249,772],{"class":451},[432,1251,477],{"class":455},[432,1253,1254],{"class":434,"line":480},[432,1255,484],{"emptyLinePlaceholder":483},[432,1257,1258],{"class":434,"line":487},[432,1259,1260],{"class":438},"// Only fetch if data is missing or stale; skip refetch when data is fresh\n",[432,1262,1263,1265,1267,1269,1271,1273,1276,1278],{"class":434,"line":493},[432,1264,452],{"class":451},[432,1266,456],{"class":455},[432,1268,460],{"class":459},[432,1270,1242],{"class":451},[432,1272,456],{"class":455},[432,1274,1275],{"class":455}," false",[432,1277,772],{"class":451},[432,1279,477],{"class":455},[432,1281,1282],{"class":434,"line":522},[432,1283,484],{"emptyLinePlaceholder":483},[432,1285,1286],{"class":434,"line":527},[432,1287,1288],{"class":438},"// Inherit the global QoraClientConfig.refetchOnMount setting (default)\n",[432,1290,1291,1293,1295,1297,1299,1301,1303,1305],{"class":434,"line":533},[432,1292,452],{"class":451},[432,1294,456],{"class":455},[432,1296,460],{"class":459},[432,1298,1242],{"class":451},[432,1300,456],{"class":455},[432,1302,987],{"class":455},[432,1304,772],{"class":451},[432,1306,477],{"class":455},[377,1308],{},[348,1310,1312],{"id":1311},"polling-active-revalidation","Polling (Active Revalidation)",[353,1314,1315,1316,1319],{},"For live data, combine SWR with ",[387,1317,1318],{},"refetchInterval"," to continuously refresh the cache:",[408,1321,1324],{"className":425,"code":1322,"filename":1323,"language":428,"meta":414,"style":414},"client.watchQuery\u003CStats>(\n  key: ['dashboard', 'stats'],\n  fetcher: api.getDashboardStats,\n  options: QoraOptions(\n    staleTime: Duration(seconds: 10),\n    refetchInterval: Duration(seconds: 30),\n  ),\n)\n","dashboard_page.dart",[387,1325,1326,1342,1363,1378,1389,1410,1430,1436],{"__ignoreMap":414},[432,1327,1328,1331,1333,1335,1337,1340],{"class":434,"line":435},[432,1329,1330],{"class":451},"client",[432,1332,471],{"class":455},[432,1334,393],{"class":685},[432,1336,688],{"class":451},[432,1338,1339],{"class":459},"Stats",[432,1341,694],{"class":451},[432,1343,1344,1346,1348,1350,1353,1355,1358,1361],{"class":434,"line":442},[432,1345,699],{"class":451},[432,1347,456],{"class":455},[432,1349,704],{"class":451},[432,1351,1352],{"class":707},"'dashboard'",[432,1354,711],{"class":455},[432,1356,1357],{"class":707}," 'stats'",[432,1359,1360],{"class":451},"]",[432,1362,477],{"class":455},[432,1364,1365,1367,1369,1371,1373,1376],{"class":434,"line":448},[432,1366,721],{"class":451},[432,1368,456],{"class":455},[432,1370,732],{"class":451},[432,1372,471],{"class":455},[432,1374,1375],{"class":451},"getDashboardStats",[432,1377,477],{"class":455},[432,1379,1380,1382,1384,1386],{"class":434,"line":480},[432,1381,747],{"class":451},[432,1383,456],{"class":455},[432,1385,460],{"class":459},[432,1387,1388],{"class":451},"(\n",[432,1390,1391,1394,1396,1398,1401,1403,1406,1408],{"class":434,"line":487},[432,1392,1393],{"class":451},"    staleTime",[432,1395,456],{"class":455},[432,1397,468],{"class":459},[432,1399,1400],{"class":451},"(seconds",[432,1402,456],{"class":455},[432,1404,1405],{"class":513}," 10",[432,1407,772],{"class":451},[432,1409,477],{"class":455},[432,1411,1412,1415,1417,1419,1421,1423,1426,1428],{"class":434,"line":493},[432,1413,1414],{"class":451},"    refetchInterval",[432,1416,456],{"class":455},[432,1418,468],{"class":459},[432,1420,1400],{"class":451},[432,1422,456],{"class":455},[432,1424,1425],{"class":513}," 30",[432,1427,772],{"class":451},[432,1429,477],{"class":455},[432,1431,1432,1434],{"class":434,"line":522},[432,1433,922],{"class":451},[432,1435,477],{"class":455},[432,1437,1438],{"class":434,"line":527},[432,1439,1190],{"class":451},[353,1441,1442,1443,1445],{},"The interval timer starts when the first subscriber attaches, fires every ",[387,1444,1318],{},", and stops when the last subscriber cancels. Polling does not occur for off-screen queries.",[377,1447],{},[348,1449,1451],{"id":1450},"force-refresh","Force Refresh",[353,1453,1454],{},"To bypass the stale check and force an immediate network request, invalidate the key first:",[408,1456,1458],{"className":425,"code":1457,"filename":1219,"language":428,"meta":414,"style":414},"// Force a fresh fetch on next access\nclient.invalidate(['users', userId]);\n\n// Or immediately prefetch fresh data\nawait client.prefetch\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: QoraOptions(staleTime: Duration.zero),\n);\n",[387,1459,1460,1465,1486,1490,1495,1513,1529,1549,1569],{"__ignoreMap":414},[432,1461,1462],{"class":434,"line":435},[432,1463,1464],{"class":438},"// Force a fresh fetch on next access\n",[432,1466,1467,1469,1471,1474,1477,1479,1481,1484],{"class":434,"line":442},[432,1468,1330],{"class":451},[432,1470,471],{"class":455},[432,1472,1473],{"class":685},"invalidate",[432,1475,1476],{"class":451},"([",[432,1478,708],{"class":707},[432,1480,711],{"class":455},[432,1482,1483],{"class":451}," userId])",[432,1485,775],{"class":455},[432,1487,1488],{"class":434,"line":448},[432,1489,484],{"emptyLinePlaceholder":483},[432,1491,1492],{"class":434,"line":480},[432,1493,1494],{"class":438},"// Or immediately prefetch fresh data\n",[432,1496,1497,1500,1502,1504,1507,1509,1511],{"class":434,"line":487},[432,1498,1499],{"class":676},"await",[432,1501,680],{"class":451},[432,1503,471],{"class":455},[432,1505,1506],{"class":685},"prefetch",[432,1508,688],{"class":451},[432,1510,691],{"class":459},[432,1512,694],{"class":451},[432,1514,1515,1517,1519,1521,1523,1525,1527],{"class":434,"line":493},[432,1516,699],{"class":451},[432,1518,456],{"class":455},[432,1520,704],{"class":451},[432,1522,708],{"class":707},[432,1524,711],{"class":455},[432,1526,714],{"class":451},[432,1528,477],{"class":455},[432,1530,1531,1533,1535,1537,1539,1541,1543,1545,1547],{"class":434,"line":522},[432,1532,721],{"class":451},[432,1534,456],{"class":455},[432,1536,726],{"class":451},[432,1538,729],{"class":455},[432,1540,732],{"class":451},[432,1542,471],{"class":455},[432,1544,737],{"class":685},[432,1546,740],{"class":451},[432,1548,477],{"class":455},[432,1550,1551,1553,1555,1557,1559,1561,1563,1565,1567],{"class":434,"line":527},[432,1552,747],{"class":451},[432,1554,456],{"class":455},[432,1556,460],{"class":459},[432,1558,463],{"class":451},[432,1560,456],{"class":455},[432,1562,468],{"class":459},[432,1564,471],{"class":455},[432,1566,474],{"class":451},[432,1568,477],{"class":455},[432,1570,1571,1573],{"class":434,"line":533},[432,1572,772],{"class":451},[432,1574,775],{"class":455},[377,1576],{},[348,1578,1580],{"id":1579},"next-steps","Next Steps",[357,1582,1583,1590,1602],{},[360,1584,1585,1589],{},[1586,1587,77],"a",{"href":1588},"./deduplication",": How concurrent callers share a single request",[360,1591,1592,1595,1596,1599,1600],{},[1586,1593,67],{"href":1594},"./caching",": LRU, GC, and ",[387,1597,1598],{},"gcTime"," vs ",[387,1601,565],{},[360,1603,1604,1607],{},[1586,1605,1606],{"href":216},"QoraOptions API",": Full options reference",[1609,1610,1611],"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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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":414,"searchDepth":442,"depth":442,"links":1613},[1614,1615,1616,1620,1622,1626,1627,1628,1629],{"id":350,"depth":442,"text":351},{"id":381,"depth":442,"text":382},{"id":421,"depth":442,"text":422,"children":1617},[1618],{"id":561,"depth":448,"text":1619},"Choosing staleTime by data type",{"id":643,"depth":442,"text":1621},"SWR with fetchQuery",{"id":806,"depth":442,"text":1623,"children":1624},"SWR with watchQuery",[1625],{"id":1193,"depth":448,"text":1194},{"id":1205,"depth":442,"text":1206},{"id":1311,"depth":442,"text":1312},{"id":1450,"depth":442,"text":1451},{"id":1579,"depth":442,"text":1580},"Qora SWR returns cached data immediately and revalidates in the background to keep UIs responsive and data current.","md",null,{},{"icon":75},{"title":72,"description":1630},"UBYamWfb4mcROKy9cuI21M5bx5mQKU_Our-R_MTUqL4",[1638,1640],{"title":67,"path":68,"stem":69,"description":1639,"icon":70,"children":-1},"Qora's cache enables instant data access. Learn how cache entries are created, aged, and garbage collected, how structural sharing prevents unnecessary rebuilds, and how to control each behavior.",{"title":77,"path":78,"stem":79,"description":1641,"icon":80,"children":-1},"Qora merges concurrent requests for the same key into a single network call, regardless of the number of callers.",1794040398963]