[{"data":1,"prerenderedAt":1656},["ShallowReactive",2],{"navigation_docs_en":3,"-en-recipes-ssr-hydration":342,"-en-recipes-ssr-hydration-surround":1651},[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":177,"body":344,"description":1644,"extension":1645,"links":1646,"meta":1647,"navigation":1648,"path":178,"seo":1649,"stem":179,"__hash__":1650},"docs_en/en/04.recipes/09.ssr-hydration.md",{"type":345,"value":346,"toc":1629},"minimark",[347,362,376,379,384,442,444,448,461,771,782,787,789,793,802,1066,1093,1095,1099,1104,1139,1149,1151,1155,1168,1301,1303,1309,1314,1334,1338,1379,1385,1426,1428,1434,1446,1589,1591,1595,1625],[348,349,350,354,355,358,359,361],"p",{},[351,352,353],"code",{},"SsrHydrator"," reads the server-rendered cache snapshot from ",[351,356,357],{},"window.__QORA_STATE__"," and injects it into ",[351,360,202],{}," before the first frame renders.",[348,363,364,366,367,371,372,375],{},[351,365,353],{}," is only available on ",[368,369,370],"strong",{},"Flutter Web",". On native and server targets the import resolves to a no-op stub, so the same code compiles everywhere without ",[351,373,374],{},"#if"," guards.",[377,378],"hr",{},[380,381,383],"h2",{"id":382},"how-it-works","How It Works",[385,386,387,399,412,431],"ol",{},[388,389,390,391,394,395,398],"li",{},"Your server prefetches data and embeds it as a JSON object in a ",[351,392,393],{},"\u003Cscript>"," tag before ",[351,396,397],{},"main.dart.js"," loads.",[388,400,401,404,405,407,408,411],{},[351,402,403],{},"SsrHydrator.hydrate()"," reads ",[351,406,357],{},", validates the payload, and calls ",[351,409,410],{},"client.queueHydration()"," for each entry.",[388,413,414,415,418,419,422,423,426,427,430],{},"On the first ",[351,416,417],{},"fetchQuery\u003CT>"," or ",[351,420,421],{},"watchQuery\u003CT>"," call for a key, the queued value is cast to ",[351,424,425],{},"T"," and injected as a ",[351,428,429],{},"Success"," state.",[388,432,433,434,437,438,441],{},"If ",[351,435,436],{},"updatedAtMs"," is omitted or the data is older than ",[351,439,440],{},"staleTime",", Qora automatically triggers a background revalidation (SWR).",[377,443],{},[380,445,447],{"id":446},"server-setup","Server Setup",[348,449,450,451,453,454,457,458,460],{},"Embed the prefetched data in a ",[351,452,393],{}," tag ",[368,455,456],{},"before"," ",[351,459,397],{},":",[462,463,469],"pre",{"className":464,"code":465,"filename":466,"language":467,"meta":468,"style":468},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript>\n  window.__QORA_STATE__ = {\n    '[\"users\",1]': {\n      \"data\": { \"id\": 1, \"name\": \"Ada\", \"email\": \"ada@example.com\" },\n      \"updatedAtMs\": 1700000000000\n    },\n    '[\"posts\"]': {\n      \"data\": [\n        { \"id\": 10, \"title\": \"Hello World\" },\n        { \"id\": 11, \"title\": \"Flutter Web\" }\n      ]\n    }\n  };\n\u003C/script>\n\u003Cscript src=\"main.dart.js\" defer>\u003C/script>\n","index.html","html","",[351,470,471,487,506,522,594,608,614,628,642,679,714,720,726,732,742],{"__ignoreMap":468},[472,473,476,480,484],"span",{"class":474,"line":475},"line",1,[472,477,479],{"class":478},"sMK4o","\u003C",[472,481,483],{"class":482},"swJcz","script",[472,485,486],{"class":478},">\n",[472,488,490,494,497,500,503],{"class":474,"line":489},2,[472,491,493],{"class":492},"sTEyZ","  window",[472,495,496],{"class":478},".",[472,498,499],{"class":492},"__QORA_STATE__ ",[472,501,502],{"class":478},"=",[472,504,505],{"class":478}," {\n",[472,507,509,512,515,518,520],{"class":474,"line":508},3,[472,510,511],{"class":478},"    '",[472,513,514],{"class":482},"[\"users\",1]",[472,516,517],{"class":478},"'",[472,519,460],{"class":478},[472,521,505],{"class":478},[472,523,525,528,531,534,536,539,542,545,547,549,553,556,558,561,563,565,567,571,573,575,577,580,582,584,586,589,591],{"class":474,"line":524},4,[472,526,527],{"class":478},"      \"",[472,529,530],{"class":482},"data",[472,532,533],{"class":478},"\"",[472,535,460],{"class":478},[472,537,538],{"class":478}," {",[472,540,541],{"class":478}," \"",[472,543,544],{"class":482},"id",[472,546,533],{"class":478},[472,548,460],{"class":478},[472,550,552],{"class":551},"sbssI"," 1",[472,554,555],{"class":478},",",[472,557,541],{"class":478},[472,559,560],{"class":482},"name",[472,562,533],{"class":478},[472,564,460],{"class":478},[472,566,541],{"class":478},[472,568,570],{"class":569},"sfazB","Ada",[472,572,533],{"class":478},[472,574,555],{"class":478},[472,576,541],{"class":478},[472,578,579],{"class":482},"email",[472,581,533],{"class":478},[472,583,460],{"class":478},[472,585,541],{"class":478},[472,587,588],{"class":569},"ada@example.com",[472,590,533],{"class":478},[472,592,593],{"class":478}," },\n",[472,595,597,599,601,603,605],{"class":474,"line":596},5,[472,598,527],{"class":478},[472,600,436],{"class":482},[472,602,533],{"class":478},[472,604,460],{"class":478},[472,606,607],{"class":551}," 1700000000000\n",[472,609,611],{"class":474,"line":610},6,[472,612,613],{"class":478},"    },\n",[472,615,617,619,622,624,626],{"class":474,"line":616},7,[472,618,511],{"class":478},[472,620,621],{"class":482},"[\"posts\"]",[472,623,517],{"class":478},[472,625,460],{"class":478},[472,627,505],{"class":478},[472,629,631,633,635,637,639],{"class":474,"line":630},8,[472,632,527],{"class":478},[472,634,530],{"class":482},[472,636,533],{"class":478},[472,638,460],{"class":478},[472,640,641],{"class":492}," [\n",[472,643,645,648,650,652,654,656,659,661,663,666,668,670,672,675,677],{"class":474,"line":644},9,[472,646,647],{"class":478},"        {",[472,649,541],{"class":478},[472,651,544],{"class":482},[472,653,533],{"class":478},[472,655,460],{"class":478},[472,657,658],{"class":551}," 10",[472,660,555],{"class":478},[472,662,541],{"class":478},[472,664,665],{"class":482},"title",[472,667,533],{"class":478},[472,669,460],{"class":478},[472,671,541],{"class":478},[472,673,674],{"class":569},"Hello World",[472,676,533],{"class":478},[472,678,593],{"class":478},[472,680,682,684,686,688,690,692,695,697,699,701,703,705,707,709,711],{"class":474,"line":681},10,[472,683,647],{"class":478},[472,685,541],{"class":478},[472,687,544],{"class":482},[472,689,533],{"class":478},[472,691,460],{"class":478},[472,693,694],{"class":551}," 11",[472,696,555],{"class":478},[472,698,541],{"class":478},[472,700,665],{"class":482},[472,702,533],{"class":478},[472,704,460],{"class":478},[472,706,541],{"class":478},[472,708,370],{"class":569},[472,710,533],{"class":478},[472,712,713],{"class":478}," }\n",[472,715,717],{"class":474,"line":716},11,[472,718,719],{"class":492},"      ]\n",[472,721,723],{"class":474,"line":722},12,[472,724,725],{"class":478},"    }\n",[472,727,729],{"class":474,"line":728},13,[472,730,731],{"class":478},"  };\n",[472,733,735,738,740],{"class":474,"line":734},14,[472,736,737],{"class":478},"\u003C/",[472,739,483],{"class":482},[472,741,486],{"class":478},[472,743,745,747,749,753,755,757,759,761,764,767,769],{"class":474,"line":744},15,[472,746,479],{"class":478},[472,748,483],{"class":482},[472,750,752],{"class":751},"spNyl"," src",[472,754,502],{"class":478},[472,756,533],{"class":478},[472,758,397],{"class":569},[472,760,533],{"class":478},[472,762,763],{"class":751}," defer",[472,765,766],{"class":478},">\u003C/",[472,768,483],{"class":482},[472,770,486],{"class":478},[348,772,773,774,777,778,781],{},"Keys are JSON-encoded normalised query keys: the same format Qora uses internally (e.g. ",[351,775,776],{},"'[\"users\",1]'"," for key ",[351,779,780],{},"['users', 1]",").",[348,783,784,786],{},[351,785,436],{}," is optional. When omitted, Qora treats the data as epoch-time-old (always stale): it is served immediately but a background revalidation fires at the first mount.",[377,788],{},[380,790,792],{"id":791},"flutter-setup","Flutter Setup",[348,794,795,796,798,799,460],{},"Call ",[351,797,403],{}," before ",[351,800,801],{},"runApp",[462,803,808],{"className":804,"code":805,"filename":806,"language":807,"meta":468,"style":468},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:flutter/material.dart';\nimport 'package:qora/qora.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nvoid main() {\n  final client = QoraClient();\n\n  // Hydrate from window.__QORA_STATE__ (no-op on non-web)\n  SsrHydrator(client).hydrate(\n    deserializers: {\n      '[\"users\",1]': (json) => User.fromJson(json as Map\u003CString, dynamic>),\n      '[\"posts\"]':   (json) => (json as List).map(Post.fromJson).toList(),\n    },\n  );\n\n  runApp(QoraScope(client: client, child: const MyApp()));\n}\n","main.dart","dart",[351,809,810,821,830,839,845,857,876,880,886,902,911,958,1006,1013,1020,1024,1060],{"__ignoreMap":468},[472,811,812,815,818],{"class":474,"line":475},[472,813,814],{"class":551},"import",[472,816,817],{"class":569}," 'package:flutter/material.dart'",[472,819,820],{"class":478},";\n",[472,822,823,825,828],{"class":474,"line":489},[472,824,814],{"class":551},[472,826,827],{"class":569}," 'package:qora/qora.dart'",[472,829,820],{"class":478},[472,831,832,834,837],{"class":474,"line":508},[472,833,814],{"class":551},[472,835,836],{"class":569}," 'package:qora_flutter/qora_flutter.dart'",[472,838,820],{"class":478},[472,840,841],{"class":474,"line":524},[472,842,844],{"emptyLinePlaceholder":843},true,"\n",[472,846,847,850,854],{"class":474,"line":596},[472,848,849],{"class":751},"void",[472,851,853],{"class":852},"s2Zo4"," main",[472,855,856],{"class":492},"() {\n",[472,858,859,862,865,867,871,874],{"class":474,"line":610},[472,860,861],{"class":751},"  final",[472,863,864],{"class":492}," client ",[472,866,502],{"class":478},[472,868,870],{"class":869},"sBMFI"," QoraClient",[472,872,873],{"class":492},"()",[472,875,820],{"class":478},[472,877,878],{"class":474,"line":616},[472,879,844],{"emptyLinePlaceholder":843},[472,881,882],{"class":474,"line":630},[472,883,885],{"class":884},"sHwdD","  // Hydrate from window.__QORA_STATE__ (no-op on non-web)\n",[472,887,888,891,894,896,899],{"class":474,"line":644},[472,889,890],{"class":869},"  SsrHydrator",[472,892,893],{"class":492},"(client)",[472,895,496],{"class":478},[472,897,898],{"class":852},"hydrate",[472,900,901],{"class":492},"(\n",[472,903,904,907,909],{"class":474,"line":681},[472,905,906],{"class":492},"    deserializers",[472,908,460],{"class":478},[472,910,505],{"class":492},[472,912,913,916,918,921,924,927,929,932,935,938,941,943,946,949,952,955],{"class":474,"line":716},[472,914,915],{"class":569},"      '[\"users\",1]'",[472,917,460],{"class":478},[472,919,920],{"class":492}," (json) ",[472,922,923],{"class":478},"=>",[472,925,926],{"class":869}," User",[472,928,496],{"class":478},[472,930,931],{"class":852},"fromJson",[472,933,934],{"class":492},"(json ",[472,936,937],{"class":478},"as",[472,939,940],{"class":869}," Map",[472,942,479],{"class":492},[472,944,945],{"class":869},"String",[472,947,948],{"class":492},", ",[472,950,951],{"class":869},"dynamic",[472,953,954],{"class":492},">)",[472,956,957],{"class":478},",\n",[472,959,960,963,965,968,970,973,975,978,981,983,986,989,992,994,997,999,1002,1004],{"class":474,"line":722},[472,961,962],{"class":569},"      '[\"posts\"]'",[472,964,460],{"class":478},[472,966,967],{"class":492},"   (json) ",[472,969,923],{"class":478},[472,971,972],{"class":492}," (json ",[472,974,937],{"class":478},[472,976,977],{"class":869}," List",[472,979,980],{"class":492},")",[472,982,496],{"class":478},[472,984,985],{"class":852},"map",[472,987,988],{"class":492},"(",[472,990,991],{"class":869},"Post",[472,993,496],{"class":478},[472,995,996],{"class":492},"fromJson)",[472,998,496],{"class":478},[472,1000,1001],{"class":852},"toList",[472,1003,873],{"class":492},[472,1005,957],{"class":478},[472,1007,1008,1011],{"class":474,"line":728},[472,1009,1010],{"class":492},"    }",[472,1012,957],{"class":478},[472,1014,1015,1018],{"class":474,"line":734},[472,1016,1017],{"class":492},"  )",[472,1019,820],{"class":478},[472,1021,1022],{"class":474,"line":744},[472,1023,844],{"emptyLinePlaceholder":843},[472,1025,1027,1030,1032,1034,1037,1039,1042,1044,1047,1049,1052,1055,1058],{"class":474,"line":1026},16,[472,1028,1029],{"class":852},"  runApp",[472,1031,988],{"class":492},[472,1033,103],{"class":869},[472,1035,1036],{"class":492},"(client",[472,1038,460],{"class":478},[472,1040,1041],{"class":492}," client",[472,1043,555],{"class":478},[472,1045,1046],{"class":492}," child",[472,1048,460],{"class":478},[472,1050,1051],{"class":751}," const",[472,1053,1054],{"class":869}," MyApp",[472,1056,1057],{"class":492},"()))",[472,1059,820],{"class":478},[472,1061,1063],{"class":474,"line":1062},17,[472,1064,1065],{"class":492},"}\n",[348,1067,1068,1069,1071,1072,1075,1076,1078,1079,1081,1082,1085,1086,1089,1090,496],{},"Keys in ",[351,1070,357],{}," that are absent from ",[351,1073,1074],{},"deserializers"," are silently skipped. If ",[351,1077,1074],{}," is omitted entirely, raw ",[351,1080,951],{}," values from ",[351,1083,1084],{},"dartify()"," are queued directly: suitable when your data is already a plain ",[351,1087,1088],{},"Map","/",[351,1091,1092],{},"List",[377,1094],{},[380,1096,1098],{"id":1097},"security","Security",[348,1100,1101,1103],{},[351,1102,353],{}," is XSS-safe by design:",[1105,1106,1107,1119,1132],"ul",{},[388,1108,1109,1110,1112,1113,418,1116,496],{},"Uses ",[351,1111,1084],{}," for JS → Dart conversion: produces plain maps/lists/strings, never HTML. No ",[351,1114,1115],{},"innerHTML",[351,1117,1118],{},"eval",[388,1120,1121,1122,1124,1125,1127,1128,1131],{},"Validates the top-level type (",[351,1123,1088],{},") and each entry (",[351,1126,1088],{}," with a ",[351,1129,1130],{},"'data'"," key) before processing.",[388,1133,1134,1135,1138],{},"Wraps every deserializer call in ",[351,1136,1137],{},"try/catch",": a corrupt entry cannot crash the app.",[348,1140,1141,1144,1145,1148],{},[368,1142,1143],{},"Your responsibility:"," JSON-encode user-controlled data on the server before embedding it in ",[351,1146,1147],{},"__QORA_STATE__",". Raw HTML interpolation bypasses Qora's protections and enables XSS.",[377,1150],{},[380,1152,1154],{"id":1153},"freshness-and-swr","Freshness and SWR",[348,1156,1157,1158,1160,1161,1164,1165,1167],{},"The ",[351,1159,436],{}," timestamp is stored as the ",[351,1162,1163],{},"updatedAt"," on the injected ",[351,1166,429],{}," state. Qora's stale-while-revalidate logic uses it to decide whether to trigger a background fetch:",[462,1169,1171],{"className":804,"code":1170,"filename":806,"language":807,"meta":468,"style":468},"// staleTime: 5 minutes\n// updatedAtMs: 4 minutes ago → fresh, no background fetch\n// updatedAtMs: 6 minutes ago → stale, SWR fires immediately on mount\n// updatedAtMs: absent        → always stale\nclient.watchQuery\u003CUser>(\n  key: ['users', 1],\n  fetcher: () => api.getUser(1),\n  options: const QoraOptions(staleTime: Duration(minutes: 5)),\n);\n",[351,1172,1173,1178,1183,1188,1193,1211,1233,1262,1295],{"__ignoreMap":468},[472,1174,1175],{"class":474,"line":475},[472,1176,1177],{"class":884},"// staleTime: 5 minutes\n",[472,1179,1180],{"class":474,"line":489},[472,1181,1182],{"class":884},"// updatedAtMs: 4 minutes ago → fresh, no background fetch\n",[472,1184,1185],{"class":474,"line":508},[472,1186,1187],{"class":884},"// updatedAtMs: 6 minutes ago → stale, SWR fires immediately on mount\n",[472,1189,1190],{"class":474,"line":524},[472,1191,1192],{"class":884},"// updatedAtMs: absent        → always stale\n",[472,1194,1195,1198,1200,1203,1205,1208],{"class":474,"line":596},[472,1196,1197],{"class":492},"client",[472,1199,496],{"class":478},[472,1201,1202],{"class":852},"watchQuery",[472,1204,479],{"class":492},[472,1206,1207],{"class":869},"User",[472,1209,1210],{"class":492},">(\n",[472,1212,1213,1216,1218,1221,1224,1226,1228,1231],{"class":474,"line":610},[472,1214,1215],{"class":492},"  key",[472,1217,460],{"class":478},[472,1219,1220],{"class":492}," [",[472,1222,1223],{"class":569},"'users'",[472,1225,555],{"class":478},[472,1227,552],{"class":551},[472,1229,1230],{"class":492},"]",[472,1232,957],{"class":478},[472,1234,1235,1238,1240,1243,1245,1248,1250,1253,1255,1258,1260],{"class":474,"line":616},[472,1236,1237],{"class":492},"  fetcher",[472,1239,460],{"class":478},[472,1241,1242],{"class":492}," () ",[472,1244,923],{"class":478},[472,1246,1247],{"class":492}," api",[472,1249,496],{"class":478},[472,1251,1252],{"class":852},"getUser",[472,1254,988],{"class":492},[472,1256,1257],{"class":551},"1",[472,1259,980],{"class":492},[472,1261,957],{"class":478},[472,1263,1264,1267,1269,1271,1274,1277,1279,1282,1285,1287,1290,1293],{"class":474,"line":630},[472,1265,1266],{"class":492},"  options",[472,1268,460],{"class":478},[472,1270,1051],{"class":751},[472,1272,1273],{"class":869}," QoraOptions",[472,1275,1276],{"class":492},"(staleTime",[472,1278,460],{"class":478},[472,1280,1281],{"class":869}," Duration",[472,1283,1284],{"class":492},"(minutes",[472,1286,460],{"class":478},[472,1288,1289],{"class":551}," 5",[472,1291,1292],{"class":492},"))",[472,1294,957],{"class":478},[472,1296,1297,1299],{"class":474,"line":644},[472,1298,980],{"class":492},[472,1300,820],{"class":478},[377,1302],{},[380,1304,1306,1308],{"id":1305},"ssrhydrator-api",[351,1307,353],{}," API",[1310,1311,1313],"h3",{"id":1312},"constructor","Constructor",[462,1315,1317],{"className":804,"code":1316,"language":807,"meta":468,"style":468},"const SsrHydrator(QoraClient client)\n",[351,1318,1319],{"__ignoreMap":468},[472,1320,1321,1324,1327,1329,1331],{"class":474,"line":475},[472,1322,1323],{"class":751},"const",[472,1325,1326],{"class":869}," SsrHydrator",[472,1328,988],{"class":492},[472,1330,202],{"class":869},[472,1332,1333],{"class":492}," client)\n",[1310,1335,1336],{"id":898},[351,1337,898],{},[462,1339,1341],{"className":804,"code":1340,"language":807,"meta":468,"style":468},"void hydrate({Map\u003CString, dynamic Function(dynamic)>? deserializers})\n",[351,1342,1343],{"__ignoreMap":468},[472,1344,1345,1347,1350,1353,1355,1357,1359,1361,1363,1366,1368,1370,1373,1376],{"class":474,"line":475},[472,1346,849],{"class":751},[472,1348,1349],{"class":852}," hydrate",[472,1351,1352],{"class":492},"({",[472,1354,1088],{"class":869},[472,1356,479],{"class":492},[472,1358,945],{"class":869},[472,1360,948],{"class":492},[472,1362,951],{"class":869},[472,1364,1365],{"class":869}," Function",[472,1367,988],{"class":492},[472,1369,951],{"class":869},[472,1371,1372],{"class":492},")>",[472,1374,1375],{"class":478},"?",[472,1377,1378],{"class":492}," deserializers})\n",[348,1380,1381,1382,1384],{},"Read ",[351,1383,357],{}," and enqueue hydration entries.",[1386,1387,1388,1404],"table",{},[1389,1390,1391],"thead",{},[1392,1393,1394,1398,1401],"tr",{},[1395,1396,1397],"th",{},"Parameter",[1395,1399,1400],{},"Type",[1395,1402,1403],{},"Description",[1405,1406,1407],"tbody",{},[1392,1408,1409,1414,1419],{},[1410,1411,1412],"td",{},[351,1413,1074],{},[1410,1415,1416],{},[351,1417,1418],{},"Map\u003CString, dynamic Function(dynamic)>?",[1410,1420,1421,1422,1425],{},"Map from string-encoded key to a function converting raw JSON to typed Dart. Keys absent from this map are skipped. Pass ",[351,1423,1424],{},"null"," to queue raw values.",[377,1427],{},[380,1429,1431,1432],{"id":1430},"with-persistqoraclient","With ",[351,1433,229],{},[348,1435,1436,1438,1439,1441,1442,1445],{},[351,1437,353],{}," and ",[351,1440,229],{}," both use ",[351,1443,1444],{},"queueHydration()"," under the hood. They compose without conflict: the last write for a given key wins (first typed access picks it up):",[462,1447,1449],{"className":804,"code":1448,"filename":806,"language":807,"meta":468,"style":468},"final client = PersistQoraClient(storage: storage);\nclient.registerSerializer\u003CUser>(...);\n\nawait storage.init();\nawait client.hydrate();           // from disk\nSsrHydrator(client).hydrate(...); // from server (overwrites disk entry if key matches)\n\nrunApp(QoraScope(client: client, child: const MyApp()));\n",[351,1450,1451,1473,1496,1500,1518,1536,1557,1561],{"__ignoreMap":468},[472,1452,1453,1456,1458,1460,1463,1466,1468,1471],{"class":474,"line":475},[472,1454,1455],{"class":751},"final",[472,1457,864],{"class":492},[472,1459,502],{"class":478},[472,1461,1462],{"class":869}," PersistQoraClient",[472,1464,1465],{"class":492},"(storage",[472,1467,460],{"class":478},[472,1469,1470],{"class":492}," storage)",[472,1472,820],{"class":478},[472,1474,1475,1477,1479,1482,1484,1486,1489,1492,1494],{"class":474,"line":489},[472,1476,1197],{"class":492},[472,1478,496],{"class":478},[472,1480,1481],{"class":852},"registerSerializer",[472,1483,479],{"class":492},[472,1485,1207],{"class":869},[472,1487,1488],{"class":492},">(",[472,1490,1491],{"class":478},"...",[472,1493,980],{"class":492},[472,1495,820],{"class":478},[472,1497,1498],{"class":474,"line":508},[472,1499,844],{"emptyLinePlaceholder":843},[472,1501,1502,1506,1509,1511,1514,1516],{"class":474,"line":524},[472,1503,1505],{"class":1504},"s7zQu","await",[472,1507,1508],{"class":492}," storage",[472,1510,496],{"class":478},[472,1512,1513],{"class":852},"init",[472,1515,873],{"class":492},[472,1517,820],{"class":478},[472,1519,1520,1522,1524,1526,1528,1530,1533],{"class":474,"line":596},[472,1521,1505],{"class":1504},[472,1523,1041],{"class":492},[472,1525,496],{"class":478},[472,1527,898],{"class":852},[472,1529,873],{"class":492},[472,1531,1532],{"class":478},";",[472,1534,1535],{"class":884},"           // from disk\n",[472,1537,1538,1540,1542,1544,1546,1548,1550,1552,1554],{"class":474,"line":610},[472,1539,353],{"class":869},[472,1541,893],{"class":492},[472,1543,496],{"class":478},[472,1545,898],{"class":852},[472,1547,988],{"class":492},[472,1549,1491],{"class":478},[472,1551,980],{"class":492},[472,1553,1532],{"class":478},[472,1555,1556],{"class":884}," // from server (overwrites disk entry if key matches)\n",[472,1558,1559],{"class":474,"line":616},[472,1560,844],{"emptyLinePlaceholder":843},[472,1562,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587],{"class":474,"line":630},[472,1564,801],{"class":852},[472,1566,988],{"class":492},[472,1568,103],{"class":869},[472,1570,1036],{"class":492},[472,1572,460],{"class":478},[472,1574,1041],{"class":492},[472,1576,555],{"class":478},[472,1578,1046],{"class":492},[472,1580,460],{"class":478},[472,1582,1051],{"class":751},[472,1584,1054],{"class":869},[472,1586,1057],{"class":492},[472,1588,820],{"class":478},[377,1590],{},[380,1592,1594],{"id":1593},"related","Related",[1105,1596,1597,1607,1620],{},[388,1598,1599,1604,1605],{},[1600,1601,1603],"a",{"href":1602},"./persistence","Persistence Guide",": Disk-based cache with ",[351,1606,229],{},[388,1608,1609,1613,1614,948,1617],{},[1600,1610,1612],{"href":1611},"../api-reference/qora-client","QoraClient API",": ",[351,1615,1616],{},"queueHydration",[351,1618,1619],{},"hydrateQuery",[388,1621,1622],{},[1600,1623,21],{"href":1624},"../getting-started/quick-start",[1626,1627,1628],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":468,"searchDepth":489,"depth":489,"links":1630},[1631,1632,1633,1634,1635,1636,1641,1643],{"id":382,"depth":489,"text":383},{"id":446,"depth":489,"text":447},{"id":791,"depth":489,"text":792},{"id":1097,"depth":489,"text":1098},{"id":1153,"depth":489,"text":1154},{"id":1305,"depth":489,"text":1637,"children":1638},"SsrHydrator API",[1639,1640],{"id":1312,"depth":508,"text":1313},{"id":898,"depth":508,"text":898},{"id":1430,"depth":489,"text":1642},"With PersistQoraClient",{"id":1593,"depth":489,"text":1594},"Eliminate the loading flash on server-rendered Flutter Web pages by injecting the server cache into QoraClient via SsrHydrator.","md",null,{},{"icon":180},{"title":177,"description":1644},"fHStdZZD8Nk8-bJDkDzY-ReEtEhS5w23A2E3yQMpf5I",[1652,1654],{"title":172,"path":173,"stem":174,"description":1653,"icon":175,"children":-1},"Use CancelToken to abort in-flight fetches cooperatively: on navigation, timeout, or user action.",{"title":182,"path":183,"stem":184,"description":1655,"icon":185,"children":-1},"Understand how Qora surfaces errors, configures retry behaviour, and enables graceful degradation with previousData.",1794040399470]