[{"data":1,"prerenderedAt":2753},["ShallowReactive",2],{"navigation_docs_en":3,"-en-core-concepts-queries":342,"-en-core-concepts-queries-surround":2748},[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":52,"body":344,"description":2741,"extension":2742,"links":2743,"meta":2744,"navigation":2745,"path":53,"seo":2746,"stem":54,"__hash__":2747},"docs_en/en/02.core-concepts/1.queries.md",{"type":345,"value":346,"toc":2717},"minimark",[347,352,356,549,552,557,565,578,712,727,735,737,741,751,865,877,879,883,888,1064,1069,1071,1075,1081,1088,1159,1162,1206,1208,1215,1221,1496,1499,1530,1532,1539,1542,1619,1622,1624,1628,1636,1642,1644,1648,1658,1756,1758,1762,1765,1933,1935,1939,2379,2381,2384,2388,2536,2540,2683,2685,2689,2713],[348,349,351],"h2",{"id":350},"anatomy-of-a-query","Anatomy of a Query",[353,354,355],"p",{},"Every Qora query is composed of three elements:",[357,358,364],"pre",{"className":359,"code":360,"filename":361,"language":362,"meta":363,"style":363},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","await client.fetchQuery\u003CUser>(\n  // 1. Query Key: unique identifier for this data\n  key: ['users', userId],\n\n  // 2. Fetcher: async function that returns the data\n  fetcher: () => api.getUser(userId),\n\n  // 3. Options (optional): per-query configuration\n  options: QoraOptions(\n    staleTime: Duration(minutes: 5),\n    retryCount: 3,\n  ),\n);\n","user_repository.dart","dart","",[365,366,367,398,405,430,437,443,470,475,481,495,520,533,541],"code",{"__ignoreMap":363},[368,369,372,376,380,384,388,391,395],"span",{"class":370,"line":371},"line",1,[368,373,375],{"class":374},"s7zQu","await",[368,377,379],{"class":378},"sTEyZ"," client",[368,381,383],{"class":382},"sMK4o",".",[368,385,387],{"class":386},"s2Zo4","fetchQuery",[368,389,390],{"class":378},"\u003C",[368,392,394],{"class":393},"sBMFI","User",[368,396,397],{"class":378},">(\n",[368,399,401],{"class":370,"line":400},2,[368,402,404],{"class":403},"sHwdD","  // 1. Query Key: unique identifier for this data\n",[368,406,408,411,414,417,421,424,427],{"class":370,"line":407},3,[368,409,410],{"class":378},"  key",[368,412,413],{"class":382},":",[368,415,416],{"class":378}," [",[368,418,420],{"class":419},"sfazB","'users'",[368,422,423],{"class":382},",",[368,425,426],{"class":378}," userId]",[368,428,429],{"class":382},",\n",[368,431,433],{"class":370,"line":432},4,[368,434,436],{"emptyLinePlaceholder":435},true,"\n",[368,438,440],{"class":370,"line":439},5,[368,441,442],{"class":403},"  // 2. Fetcher: async function that returns the data\n",[368,444,446,449,451,454,457,460,462,465,468],{"class":370,"line":445},6,[368,447,448],{"class":378},"  fetcher",[368,450,413],{"class":382},[368,452,453],{"class":378}," () ",[368,455,456],{"class":382},"=>",[368,458,459],{"class":378}," api",[368,461,383],{"class":382},[368,463,464],{"class":386},"getUser",[368,466,467],{"class":378},"(userId)",[368,469,429],{"class":382},[368,471,473],{"class":370,"line":472},7,[368,474,436],{"emptyLinePlaceholder":435},[368,476,478],{"class":370,"line":477},8,[368,479,480],{"class":403},"  // 3. Options (optional): per-query configuration\n",[368,482,484,487,489,492],{"class":370,"line":483},9,[368,485,486],{"class":378},"  options",[368,488,413],{"class":382},[368,490,491],{"class":393}," QoraOptions",[368,493,494],{"class":378},"(\n",[368,496,498,501,503,506,509,511,515,518],{"class":370,"line":497},10,[368,499,500],{"class":378},"    staleTime",[368,502,413],{"class":382},[368,504,505],{"class":393}," Duration",[368,507,508],{"class":378},"(minutes",[368,510,413],{"class":382},[368,512,514],{"class":513},"sbssI"," 5",[368,516,517],{"class":378},")",[368,519,429],{"class":382},[368,521,523,526,528,531],{"class":370,"line":522},11,[368,524,525],{"class":378},"    retryCount",[368,527,413],{"class":382},[368,529,530],{"class":513}," 3",[368,532,429],{"class":382},[368,534,536,539],{"class":370,"line":535},12,[368,537,538],{"class":378},"  )",[368,540,429],{"class":382},[368,542,544,546],{"class":370,"line":543},13,[368,545,517],{"class":378},[368,547,548],{"class":382},";\n",[550,551],"hr",{},[553,554,556],"h3",{"id":555},"_1-query-key","1. Query Key",[353,558,559,560,564],{},"The ",[561,562,563],"strong",{},"query key"," uniquely identifies data in the cache. It drives:",[566,567,568,572,575],"ul",{},[569,570,571],"li",{},"Cache lookups (hit / miss)",[569,573,574],{},"Background revalidation",[569,576,577],{},"Targeted invalidation after mutations",[357,579,582],{"className":359,"code":580,"filename":581,"language":362,"meta":363,"style":363},"// Single segment\n['users']\n\n// Entity + ID\n['users', userId]\n\n// Entity + filters (nested map)\n['posts', {'status': 'published', 'page': page}]\n\n// Typed wrapper (identical semantics)\nQoraKey.withId('users', userId)\nQoraKey.withFilter('posts', {'status': 'published'})\n","keys.dart",[365,583,584,589,599,603,608,619,623,628,658,662,667,686],{"__ignoreMap":363},[368,585,586],{"class":370,"line":371},[368,587,588],{"class":403},"// Single segment\n",[368,590,591,594,596],{"class":370,"line":400},[368,592,593],{"class":378},"[",[368,595,420],{"class":419},[368,597,598],{"class":378},"]\n",[368,600,601],{"class":370,"line":407},[368,602,436],{"emptyLinePlaceholder":435},[368,604,605],{"class":370,"line":432},[368,606,607],{"class":403},"// Entity + ID\n",[368,609,610,612,614,616],{"class":370,"line":439},[368,611,593],{"class":378},[368,613,420],{"class":419},[368,615,423],{"class":382},[368,617,618],{"class":378}," userId]\n",[368,620,621],{"class":370,"line":445},[368,622,436],{"emptyLinePlaceholder":435},[368,624,625],{"class":370,"line":472},[368,626,627],{"class":403},"// Entity + filters (nested map)\n",[368,629,630,632,635,637,640,643,645,648,650,653,655],{"class":370,"line":477},[368,631,593],{"class":378},[368,633,634],{"class":419},"'posts'",[368,636,423],{"class":382},[368,638,639],{"class":378}," {",[368,641,642],{"class":419},"'status'",[368,644,413],{"class":382},[368,646,647],{"class":419}," 'published'",[368,649,423],{"class":382},[368,651,652],{"class":419}," 'page'",[368,654,413],{"class":382},[368,656,657],{"class":378}," page}]\n",[368,659,660],{"class":370,"line":483},[368,661,436],{"emptyLinePlaceholder":435},[368,663,664],{"class":370,"line":497},[368,665,666],{"class":403},"// Typed wrapper (identical semantics)\n",[368,668,669,671,673,676,679,681,683],{"class":370,"line":522},[368,670,207],{"class":393},[368,672,383],{"class":382},[368,674,675],{"class":386},"withId",[368,677,678],{"class":378},"(",[368,680,420],{"class":419},[368,682,423],{"class":382},[368,684,685],{"class":378}," userId)\n",[368,687,688,690,692,695,697,699,701,703,705,707,709],{"class":370,"line":535},[368,689,207],{"class":393},[368,691,383],{"class":382},[368,693,694],{"class":386},"withFilter",[368,696,678],{"class":378},[368,698,634],{"class":419},[368,700,423],{"class":382},[368,702,639],{"class":378},[368,704,642],{"class":419},[368,706,413],{"class":382},[368,708,647],{"class":419},[368,710,711],{"class":378},"})\n",[713,714,715,716,719,720,723,724,726],"tip",{},"Keys use ",[561,717,718],{},"deep structural equality",". ",[365,721,722],{},"['users', 1]"," and ",[365,725,722],{}," are identical even when created independently.",[353,728,729,730,734],{},"See ",[731,732,57],"a",{"href":733},"./query-keys"," for a complete guide.",[550,736],{},[553,738,740],{"id":739},"_2-fetcher","2. Fetcher",[353,742,559,743,746,747,750],{},[561,744,745],{},"fetcher"," is any ",[365,748,749],{},"Future\u003CT> Function()"," that returns your data:",[357,752,754],{"className":359,"code":753,"filename":361,"language":362,"meta":363,"style":363},"// Inline: simple case\nfetcher: () => api.getUser(userId),\n\n// Async closure with dependencies\nfetcher: () async {\n  final token = await authService.getToken();\n  return api.getUser(userId, token: token);\n},\n",[365,755,756,761,781,785,790,804,832,858],{"__ignoreMap":363},[368,757,758],{"class":370,"line":371},[368,759,760],{"class":403},"// Inline: simple case\n",[368,762,763,765,767,769,771,773,775,777,779],{"class":370,"line":400},[368,764,745],{"class":378},[368,766,413],{"class":382},[368,768,453],{"class":378},[368,770,456],{"class":382},[368,772,459],{"class":378},[368,774,383],{"class":382},[368,776,464],{"class":386},[368,778,467],{"class":378},[368,780,429],{"class":382},[368,782,783],{"class":370,"line":407},[368,784,436],{"emptyLinePlaceholder":435},[368,786,787],{"class":370,"line":432},[368,788,789],{"class":403},"// Async closure with dependencies\n",[368,791,792,794,796,798,801],{"class":370,"line":439},[368,793,745],{"class":378},[368,795,413],{"class":382},[368,797,453],{"class":378},[368,799,800],{"class":374},"async",[368,802,803],{"class":378}," {\n",[368,805,806,810,813,816,819,822,824,827,830],{"class":370,"line":445},[368,807,809],{"class":808},"spNyl","  final",[368,811,812],{"class":378}," token ",[368,814,815],{"class":382},"=",[368,817,818],{"class":374}," await",[368,820,821],{"class":378}," authService",[368,823,383],{"class":382},[368,825,826],{"class":386},"getToken",[368,828,829],{"class":378},"()",[368,831,548],{"class":382},[368,833,834,837,839,841,843,846,848,851,853,856],{"class":370,"line":472},[368,835,836],{"class":374},"  return",[368,838,459],{"class":378},[368,840,383],{"class":382},[368,842,464],{"class":386},[368,844,845],{"class":378},"(userId",[368,847,423],{"class":382},[368,849,850],{"class":378}," token",[368,852,413],{"class":382},[368,854,855],{"class":378}," token)",[368,857,548],{"class":382},[368,859,860,863],{"class":370,"line":477},[368,861,862],{"class":378},"}",[368,864,429],{"class":382},[866,867,868,869,872,873,876],"warning",{},"The fetcher must throw on failure. Returning ",[365,870,871],{},"null"," or swallowing errors prevents Qora from transitioning to ",[365,874,875],{},"Failure"," state and triggering retries.",[550,878],{},[553,880,882],{"id":881},"_3-options","3. Options",[353,884,885,887],{},[365,886,215],{}," configures caching, retries, and polling per query:",[357,889,891],{"className":359,"code":890,"filename":361,"language":362,"meta":363,"style":363},"options: QoraOptions(\n  // Data freshness window (0 = always stale)\n  staleTime: Duration(minutes: 5),\n\n  // How long unused data stays in cache\n  gcTime: Duration(minutes: 10),\n\n  // Automatic retry on failure\n  retryCount: 3,\n  retryDelay: Duration(seconds: 1), // base delay for exponential backoff\n\n  // Disable the query conditionally\n  enabled: userId != null,\n\n  // Polling interval (watchQuery only)\n  refetchInterval: Duration(seconds: 30),\n)\n",[365,892,893,904,909,928,932,937,957,961,966,977,1001,1005,1010,1026,1031,1037,1058],{"__ignoreMap":363},[368,894,895,898,900,902],{"class":370,"line":371},[368,896,897],{"class":378},"options",[368,899,413],{"class":382},[368,901,491],{"class":393},[368,903,494],{"class":378},[368,905,906],{"class":370,"line":400},[368,907,908],{"class":403},"  // Data freshness window (0 = always stale)\n",[368,910,911,914,916,918,920,922,924,926],{"class":370,"line":407},[368,912,913],{"class":378},"  staleTime",[368,915,413],{"class":382},[368,917,505],{"class":393},[368,919,508],{"class":378},[368,921,413],{"class":382},[368,923,514],{"class":513},[368,925,517],{"class":378},[368,927,429],{"class":382},[368,929,930],{"class":370,"line":432},[368,931,436],{"emptyLinePlaceholder":435},[368,933,934],{"class":370,"line":439},[368,935,936],{"class":403},"  // How long unused data stays in cache\n",[368,938,939,942,944,946,948,950,953,955],{"class":370,"line":445},[368,940,941],{"class":378},"  gcTime",[368,943,413],{"class":382},[368,945,505],{"class":393},[368,947,508],{"class":378},[368,949,413],{"class":382},[368,951,952],{"class":513}," 10",[368,954,517],{"class":378},[368,956,429],{"class":382},[368,958,959],{"class":370,"line":472},[368,960,436],{"emptyLinePlaceholder":435},[368,962,963],{"class":370,"line":477},[368,964,965],{"class":403},"  // Automatic retry on failure\n",[368,967,968,971,973,975],{"class":370,"line":483},[368,969,970],{"class":378},"  retryCount",[368,972,413],{"class":382},[368,974,530],{"class":513},[368,976,429],{"class":382},[368,978,979,982,984,986,989,991,994,996,998],{"class":370,"line":497},[368,980,981],{"class":378},"  retryDelay",[368,983,413],{"class":382},[368,985,505],{"class":393},[368,987,988],{"class":378},"(seconds",[368,990,413],{"class":382},[368,992,993],{"class":513}," 1",[368,995,517],{"class":378},[368,997,423],{"class":382},[368,999,1000],{"class":403}," // base delay for exponential backoff\n",[368,1002,1003],{"class":370,"line":522},[368,1004,436],{"emptyLinePlaceholder":435},[368,1006,1007],{"class":370,"line":535},[368,1008,1009],{"class":403},"  // Disable the query conditionally\n",[368,1011,1012,1015,1017,1020,1023],{"class":370,"line":543},[368,1013,1014],{"class":378},"  enabled",[368,1016,413],{"class":382},[368,1018,1019],{"class":378}," userId ",[368,1021,1022],{"class":382},"!=",[368,1024,1025],{"class":382}," null,\n",[368,1027,1029],{"class":370,"line":1028},14,[368,1030,436],{"emptyLinePlaceholder":435},[368,1032,1034],{"class":370,"line":1033},15,[368,1035,1036],{"class":403},"  // Polling interval (watchQuery only)\n",[368,1038,1040,1043,1045,1047,1049,1051,1054,1056],{"class":370,"line":1039},16,[368,1041,1042],{"class":378},"  refetchInterval",[368,1044,413],{"class":382},[368,1046,505],{"class":393},[368,1048,988],{"class":378},[368,1050,413],{"class":382},[368,1052,1053],{"class":513}," 30",[368,1055,517],{"class":378},[368,1057,429],{"class":382},[368,1059,1061],{"class":370,"line":1060},17,[368,1062,1063],{"class":378},")\n",[353,1065,729,1066,1068],{},[731,1067,215],{"href":216}," for all fields.",[550,1070],{},[348,1072,1074],{"id":1073},"two-ways-to-fetch","Two Ways to Fetch",[553,1076,1078,1080],{"id":1077},"fetchquery-one-shot",[365,1079,387],{},": One-shot",[353,1082,1083,1084,1087],{},"Returns a ",[365,1085,1086],{},"Future\u003CT>",". Suitable for imperative calls (button tap, page load):",[357,1089,1091],{"className":359,"code":1090,"filename":361,"language":362,"meta":363,"style":363},"final user = await client.fetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n);\n",[365,1092,1093,1117,1133,1153],{"__ignoreMap":363},[368,1094,1095,1098,1101,1103,1105,1107,1109,1111,1113,1115],{"class":370,"line":371},[368,1096,1097],{"class":808},"final",[368,1099,1100],{"class":378}," user ",[368,1102,815],{"class":382},[368,1104,818],{"class":374},[368,1106,379],{"class":378},[368,1108,383],{"class":382},[368,1110,387],{"class":386},[368,1112,390],{"class":378},[368,1114,394],{"class":393},[368,1116,397],{"class":378},[368,1118,1119,1121,1123,1125,1127,1129,1131],{"class":370,"line":400},[368,1120,410],{"class":378},[368,1122,413],{"class":382},[368,1124,416],{"class":378},[368,1126,420],{"class":419},[368,1128,423],{"class":382},[368,1130,426],{"class":378},[368,1132,429],{"class":382},[368,1134,1135,1137,1139,1141,1143,1145,1147,1149,1151],{"class":370,"line":407},[368,1136,448],{"class":378},[368,1138,413],{"class":382},[368,1140,453],{"class":378},[368,1142,456],{"class":382},[368,1144,459],{"class":378},[368,1146,383],{"class":382},[368,1148,464],{"class":386},[368,1150,467],{"class":378},[368,1152,429],{"class":382},[368,1154,1155,1157],{"class":370,"line":432},[368,1156,517],{"class":378},[368,1158,548],{"class":382},[353,1160,1161],{},"Cache behaviour:",[1163,1164,1165,1178],"table",{},[1166,1167,1168],"thead",{},[1169,1170,1171,1175],"tr",{},[1172,1173,1174],"th",{},"State",[1172,1176,1177],{},"Action",[1179,1180,1181,1190,1198],"tbody",{},[1169,1182,1183,1187],{},[1184,1185,1186],"td",{},"Fresh (not stale)",[1184,1188,1189],{},"Return cached data, no network call",[1169,1191,1192,1195],{},[1184,1193,1194],{},"Stale",[1184,1196,1197],{},"Return stale data immediately, refetch in background",[1169,1199,1200,1203],{},[1184,1201,1202],{},"Missing",[1184,1204,1205],{},"Fetch, await, and return result",[550,1207],{},[553,1209,1211,1214],{"id":1210},"watchquery-reactive-stream",[365,1212,1213],{},"watchQuery",": Reactive stream",[353,1216,1083,1217,1220],{},[365,1218,1219],{},"Stream\u003CQoraState\u003CT>>",". Suitable for UI bindings:",[357,1222,1225],{"className":359,"code":1223,"filename":1224,"language":362,"meta":363,"style":363},"StreamBuilder\u003CQoraState\u003CUser>>(\n  stream: client.watchQuery\u003CUser>(\n    key: ['users', userId],\n    fetcher: () => api.getUser(userId),\n  ),\n  builder: (context, snapshot) {\n    return switch (snapshot.data) {\n      null || Initial()            => const SizedBox.shrink(),\n      Loading(:final previousData) => previousData != null\n          ? UserCard(previousData)\n          : const CircularProgressIndicator(),\n      Success(:final data)         => UserCard(data),\n      Failure(:final error)        => Text('Error: $error'),\n    };\n  },\n)\n","user_page.dart",[365,1226,1227,1243,1262,1279,1300,1306,1321,1337,1368,1392,1403,1417,1440,1478,1485,1492],{"__ignoreMap":363},[368,1228,1229,1232,1234,1236,1238,1240],{"class":370,"line":371},[368,1230,1231],{"class":393},"StreamBuilder",[368,1233,390],{"class":378},[368,1235,211],{"class":393},[368,1237,390],{"class":378},[368,1239,394],{"class":393},[368,1241,1242],{"class":378},">>(\n",[368,1244,1245,1248,1250,1252,1254,1256,1258,1260],{"class":370,"line":400},[368,1246,1247],{"class":378},"  stream",[368,1249,413],{"class":382},[368,1251,379],{"class":378},[368,1253,383],{"class":382},[368,1255,1213],{"class":386},[368,1257,390],{"class":378},[368,1259,394],{"class":393},[368,1261,397],{"class":378},[368,1263,1264,1267,1269,1271,1273,1275,1277],{"class":370,"line":407},[368,1265,1266],{"class":378},"    key",[368,1268,413],{"class":382},[368,1270,416],{"class":378},[368,1272,420],{"class":419},[368,1274,423],{"class":382},[368,1276,426],{"class":378},[368,1278,429],{"class":382},[368,1280,1281,1284,1286,1288,1290,1292,1294,1296,1298],{"class":370,"line":432},[368,1282,1283],{"class":378},"    fetcher",[368,1285,413],{"class":382},[368,1287,453],{"class":378},[368,1289,456],{"class":382},[368,1291,459],{"class":378},[368,1293,383],{"class":382},[368,1295,464],{"class":386},[368,1297,467],{"class":378},[368,1299,429],{"class":382},[368,1301,1302,1304],{"class":370,"line":439},[368,1303,538],{"class":378},[368,1305,429],{"class":382},[368,1307,1308,1311,1313,1316,1318],{"class":370,"line":445},[368,1309,1310],{"class":378},"  builder",[368,1312,413],{"class":382},[368,1314,1315],{"class":378}," (context",[368,1317,423],{"class":382},[368,1319,1320],{"class":378}," snapshot) {\n",[368,1322,1323,1326,1329,1332,1334],{"class":370,"line":472},[368,1324,1325],{"class":374},"    return",[368,1327,1328],{"class":374}," switch",[368,1330,1331],{"class":378}," (snapshot",[368,1333,383],{"class":382},[368,1335,1336],{"class":378},"data) {\n",[368,1338,1339,1342,1345,1348,1351,1353,1356,1359,1361,1364,1366],{"class":370,"line":477},[368,1340,1341],{"class":382},"      null",[368,1343,1344],{"class":382}," ||",[368,1346,1347],{"class":393}," Initial",[368,1349,1350],{"class":378},"()            ",[368,1352,456],{"class":382},[368,1354,1355],{"class":808}," const",[368,1357,1358],{"class":393}," SizedBox",[368,1360,383],{"class":382},[368,1362,1363],{"class":386},"shrink",[368,1365,829],{"class":378},[368,1367,429],{"class":382},[368,1369,1370,1373,1375,1377,1379,1382,1384,1387,1389],{"class":370,"line":483},[368,1371,1372],{"class":393},"      Loading",[368,1374,678],{"class":378},[368,1376,413],{"class":382},[368,1378,1097],{"class":808},[368,1380,1381],{"class":378}," previousData) ",[368,1383,456],{"class":382},[368,1385,1386],{"class":378}," previousData ",[368,1388,1022],{"class":382},[368,1390,1391],{"class":382}," null\n",[368,1393,1394,1397,1400],{"class":370,"line":497},[368,1395,1396],{"class":382},"          ?",[368,1398,1399],{"class":393}," UserCard",[368,1401,1402],{"class":378},"(previousData)\n",[368,1404,1405,1408,1410,1413,1415],{"class":370,"line":522},[368,1406,1407],{"class":382},"          :",[368,1409,1355],{"class":808},[368,1411,1412],{"class":393}," CircularProgressIndicator",[368,1414,829],{"class":378},[368,1416,429],{"class":382},[368,1418,1419,1422,1424,1426,1428,1431,1433,1435,1438],{"class":370,"line":535},[368,1420,1421],{"class":393},"      Success",[368,1423,678],{"class":378},[368,1425,413],{"class":382},[368,1427,1097],{"class":808},[368,1429,1430],{"class":378}," data)         ",[368,1432,456],{"class":382},[368,1434,1399],{"class":393},[368,1436,1437],{"class":378},"(data)",[368,1439,429],{"class":382},[368,1441,1442,1445,1447,1449,1451,1454,1456,1459,1461,1464,1467,1471,1474,1476],{"class":370,"line":543},[368,1443,1444],{"class":393},"      Failure",[368,1446,678],{"class":378},[368,1448,413],{"class":382},[368,1450,1097],{"class":808},[368,1452,1453],{"class":378}," error)        ",[368,1455,456],{"class":382},[368,1457,1458],{"class":393}," Text",[368,1460,678],{"class":378},[368,1462,1463],{"class":419},"'Error: ",[368,1465,1466],{"class":378},"$",[368,1468,1470],{"class":1469},"sHdIc","error",[368,1472,1473],{"class":419},"'",[368,1475,517],{"class":378},[368,1477,429],{"class":382},[368,1479,1480,1483],{"class":370,"line":1028},[368,1481,1482],{"class":378},"    }",[368,1484,548],{"class":382},[368,1486,1487,1490],{"class":370,"line":1033},[368,1488,1489],{"class":378},"  }",[368,1491,429],{"class":382},[368,1493,1494],{"class":370,"line":1039},[368,1495,1063],{"class":378},[353,1497,1498],{},"The stream:",[566,1500,1501,1504,1510,1520,1527],{},[569,1502,1503],{},"Emits immediately with the current cached state on subscription",[569,1505,1506,1507,517],{},"Auto-fetches if data is missing or stale (controlled by ",[365,1508,1509],{},"refetchOnMount",[569,1511,1512,1513,1516,1517],{},"Pushes updates from any source: fetch, ",[365,1514,1515],{},"setQueryData",", ",[365,1518,1519],{},"invalidate",[569,1521,1522,1523,1526],{},"Polls when ",[365,1524,1525],{},"refetchInterval"," is set and the stream is active",[569,1528,1529],{},"Schedules GC when the last subscriber cancels",[550,1531],{},[553,1533,1535,1538],{"id":1534},"prefetch-background-preloading",[365,1536,1537],{},"prefetch",": Background preloading",[353,1540,1541],{},"Populate the cache before the user navigates to a screen:",[357,1543,1546],{"className":359,"code":1544,"filename":1545,"language":362,"meta":363,"style":363},"// On hover / likely tap\nonEnter: (_) => client.prefetch\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n),\n","user_list_page.dart",[365,1547,1548,1553,1577,1593,1613],{"__ignoreMap":363},[368,1549,1550],{"class":370,"line":371},[368,1551,1552],{"class":403},"// On hover / likely tap\n",[368,1554,1555,1558,1560,1563,1565,1567,1569,1571,1573,1575],{"class":370,"line":400},[368,1556,1557],{"class":378},"onEnter",[368,1559,413],{"class":382},[368,1561,1562],{"class":378}," (_) ",[368,1564,456],{"class":382},[368,1566,379],{"class":378},[368,1568,383],{"class":382},[368,1570,1537],{"class":386},[368,1572,390],{"class":378},[368,1574,394],{"class":393},[368,1576,397],{"class":378},[368,1578,1579,1581,1583,1585,1587,1589,1591],{"class":370,"line":407},[368,1580,410],{"class":378},[368,1582,413],{"class":382},[368,1584,416],{"class":378},[368,1586,420],{"class":419},[368,1588,423],{"class":382},[368,1590,426],{"class":378},[368,1592,429],{"class":382},[368,1594,1595,1597,1599,1601,1603,1605,1607,1609,1611],{"class":370,"line":432},[368,1596,448],{"class":378},[368,1598,413],{"class":382},[368,1600,453],{"class":378},[368,1602,456],{"class":382},[368,1604,459],{"class":378},[368,1606,383],{"class":382},[368,1608,464],{"class":386},[368,1610,467],{"class":378},[368,1612,429],{"class":382},[368,1614,1615,1617],{"class":370,"line":439},[368,1616,517],{"class":378},[368,1618,429],{"class":382},[353,1620,1621],{},"No-op if the data is already fresh. Does not create a stream.",[550,1623],{},[348,1625,1627],{"id":1626},"query-lifecycle","Query Lifecycle",[357,1629,1634],{"className":1630,"code":1632,"language":1633,"meta":363},[1631],"language-text","[Initial]\n    │  first watchQuery / fetchQuery\n    ▼\n[Loading(previousData: null)]\n    │  fetcher succeeds\n    ▼\n[Success(data, updatedAt)]\n    │  staleTime elapsed → background refetch\n    ▼\n[Loading(previousData: data)]   ← stale data visible during refetch\n    │  fetcher succeeds\n    ▼\n[Success(newData, updatedAt)]\n    │  staleTime elapsed → fetcher fails after all retries\n    ▼\n[Failure(error, previousData: data)]  ← previous data still accessible\n","text",[365,1635,1632],{"__ignoreMap":363},[353,1637,729,1638,1641],{},[731,1639,62],{"href":1640},"./query-states"," for full documentation.",[550,1643],{},[348,1645,1647],{"id":1646},"invalidation","Invalidation",[353,1649,1650,1651,1653,1654,1657],{},"Mark queries as stale after a mutation. Active ",[365,1652,1213],{}," streams transition to ",[365,1655,1656],{},"Loading"," immediately:",[357,1659,1662],{"className":359,"code":1660,"filename":1661,"language":362,"meta":363,"style":363},"// After creating a post\nawait api.createPost(payload);\n\n// Invalidate exact key\nclient.invalidate(['posts', postId]);\n\n// Invalidate all posts queries\nclient.invalidateWhere((key) => key.firstOrNull == 'posts');\n","post_repository.dart",[365,1663,1664,1669,1685,1689,1694,1715,1719,1724],{"__ignoreMap":363},[368,1665,1666],{"class":370,"line":371},[368,1667,1668],{"class":403},"// After creating a post\n",[368,1670,1671,1673,1675,1677,1680,1683],{"class":370,"line":400},[368,1672,375],{"class":374},[368,1674,459],{"class":378},[368,1676,383],{"class":382},[368,1678,1679],{"class":386},"createPost",[368,1681,1682],{"class":378},"(payload)",[368,1684,548],{"class":382},[368,1686,1687],{"class":370,"line":407},[368,1688,436],{"emptyLinePlaceholder":435},[368,1690,1691],{"class":370,"line":432},[368,1692,1693],{"class":403},"// Invalidate exact key\n",[368,1695,1696,1699,1701,1703,1706,1708,1710,1713],{"class":370,"line":439},[368,1697,1698],{"class":378},"client",[368,1700,383],{"class":382},[368,1702,1519],{"class":386},[368,1704,1705],{"class":378},"([",[368,1707,634],{"class":419},[368,1709,423],{"class":382},[368,1711,1712],{"class":378}," postId])",[368,1714,548],{"class":382},[368,1716,1717],{"class":370,"line":445},[368,1718,436],{"emptyLinePlaceholder":435},[368,1720,1721],{"class":370,"line":472},[368,1722,1723],{"class":403},"// Invalidate all posts queries\n",[368,1725,1726,1728,1730,1733,1736,1738,1741,1743,1746,1749,1752,1754],{"class":370,"line":477},[368,1727,1698],{"class":378},[368,1729,383],{"class":382},[368,1731,1732],{"class":386},"invalidateWhere",[368,1734,1735],{"class":378},"((key) ",[368,1737,456],{"class":382},[368,1739,1740],{"class":378}," key",[368,1742,383],{"class":382},[368,1744,1745],{"class":378},"firstOrNull ",[368,1747,1748],{"class":382},"==",[368,1750,1751],{"class":419}," 'posts'",[368,1753,517],{"class":378},[368,1755,548],{"class":382},[550,1757],{},[348,1759,1761],{"id":1760},"manual-cache-updates","Manual Cache Updates",[353,1763,1764],{},"Push data directly into the cache. All active streams receive the update instantly:",[357,1766,1768],{"className":359,"code":1767,"filename":361,"language":362,"meta":363,"style":363},"// Snapshot before update (for rollback)\nfinal snapshot = client.getQueryData\u003CUser>(['users', userId]);\n\n// Optimistic update: UI reflects change immediately\nclient.setQueryData(['users', userId], user.copyWith(name: 'Alice'));\n\ntry {\n  await api.updateUser(userId, payload);\n} catch (_) {\n  // Roll back on failure\n  client.restoreQueryData(['users', userId], snapshot);\n}\n",[365,1769,1770,1775,1807,1811,1816,1855,1859,1866,1887,1898,1903,1928],{"__ignoreMap":363},[368,1771,1772],{"class":370,"line":371},[368,1773,1774],{"class":403},"// Snapshot before update (for rollback)\n",[368,1776,1777,1779,1782,1784,1786,1788,1791,1793,1795,1798,1800,1802,1805],{"class":370,"line":400},[368,1778,1097],{"class":808},[368,1780,1781],{"class":378}," snapshot ",[368,1783,815],{"class":382},[368,1785,379],{"class":378},[368,1787,383],{"class":382},[368,1789,1790],{"class":386},"getQueryData",[368,1792,390],{"class":378},[368,1794,394],{"class":393},[368,1796,1797],{"class":378},">([",[368,1799,420],{"class":419},[368,1801,423],{"class":382},[368,1803,1804],{"class":378}," userId])",[368,1806,548],{"class":382},[368,1808,1809],{"class":370,"line":407},[368,1810,436],{"emptyLinePlaceholder":435},[368,1812,1813],{"class":370,"line":432},[368,1814,1815],{"class":403},"// Optimistic update: UI reflects change immediately\n",[368,1817,1818,1820,1822,1824,1826,1828,1830,1832,1834,1837,1839,1842,1845,1847,1850,1853],{"class":370,"line":439},[368,1819,1698],{"class":378},[368,1821,383],{"class":382},[368,1823,1515],{"class":386},[368,1825,1705],{"class":378},[368,1827,420],{"class":419},[368,1829,423],{"class":382},[368,1831,426],{"class":378},[368,1833,423],{"class":382},[368,1835,1836],{"class":378}," user",[368,1838,383],{"class":382},[368,1840,1841],{"class":386},"copyWith",[368,1843,1844],{"class":378},"(name",[368,1846,413],{"class":382},[368,1848,1849],{"class":419}," 'Alice'",[368,1851,1852],{"class":378},"))",[368,1854,548],{"class":382},[368,1856,1857],{"class":370,"line":445},[368,1858,436],{"emptyLinePlaceholder":435},[368,1860,1861,1864],{"class":370,"line":472},[368,1862,1863],{"class":374},"try",[368,1865,803],{"class":378},[368,1867,1868,1871,1873,1875,1878,1880,1882,1885],{"class":370,"line":477},[368,1869,1870],{"class":374},"  await",[368,1872,459],{"class":378},[368,1874,383],{"class":382},[368,1876,1877],{"class":386},"updateUser",[368,1879,845],{"class":378},[368,1881,423],{"class":382},[368,1883,1884],{"class":378}," payload)",[368,1886,548],{"class":382},[368,1888,1889,1892,1895],{"class":370,"line":483},[368,1890,1891],{"class":378},"} ",[368,1893,1894],{"class":374},"catch",[368,1896,1897],{"class":378}," (_) {\n",[368,1899,1900],{"class":370,"line":497},[368,1901,1902],{"class":403},"  // Roll back on failure\n",[368,1904,1905,1908,1910,1913,1915,1917,1919,1921,1923,1926],{"class":370,"line":522},[368,1906,1907],{"class":378},"  client",[368,1909,383],{"class":382},[368,1911,1912],{"class":386},"restoreQueryData",[368,1914,1705],{"class":378},[368,1916,420],{"class":419},[368,1918,423],{"class":382},[368,1920,426],{"class":378},[368,1922,423],{"class":382},[368,1924,1925],{"class":378}," snapshot)",[368,1927,548],{"class":382},[368,1929,1930],{"class":370,"line":535},[368,1931,1932],{"class":378},"}\n",[550,1934],{},[348,1936,1938],{"id":1937},"complete-example","Complete Example",[357,1940,1943],{"className":359,"code":1941,"filename":1942,"language":362,"meta":363,"style":363},"import 'package:qora/qora.dart';\n\nclass UserRepository {\n  final QoraClient _client;\n  final UserApi _api;\n\n  UserRepository(this._client, this._api);\n\n  Future\u003CUser> getUser(int userId) => _client.fetchQuery\u003CUser>(\n        key: ['users', userId],\n        fetcher: () => _api.getUser(userId),\n        options: const QoraOptions(staleTime: Duration(minutes: 5)),\n      );\n\n  Stream\u003CQoraState\u003CUser>> watchUser(int userId) => _client.watchQuery\u003CUser>(\n        key: ['users', userId],\n        fetcher: () => _api.getUser(userId),\n        options: const QoraOptions(\n          staleTime: Duration(minutes: 5),\n          refetchInterval: Duration(minutes: 1),\n        ),\n      );\n\n  void invalidateUser(int userId) => _client.invalidate(['users', userId]);\n\n  void patchLocally(User updated) =>\n      _client.setQueryData(['users', updated.id], updated);\n}\n","repositories/user_repository.dart",[365,1944,1945,1955,1959,1969,1981,1993,1997,2022,2026,2062,2079,2100,2128,2135,2139,2178,2194,2214,2227,2247,2267,2275,2282,2287,2320,2325,2343,2374],{"__ignoreMap":363},[368,1946,1947,1950,1953],{"class":370,"line":371},[368,1948,1949],{"class":513},"import",[368,1951,1952],{"class":419}," 'package:qora/qora.dart'",[368,1954,548],{"class":382},[368,1956,1957],{"class":370,"line":400},[368,1958,436],{"emptyLinePlaceholder":435},[368,1960,1961,1964,1967],{"class":370,"line":407},[368,1962,1963],{"class":382},"class",[368,1965,1966],{"class":393}," UserRepository",[368,1968,803],{"class":378},[368,1970,1971,1973,1976,1979],{"class":370,"line":432},[368,1972,809],{"class":808},[368,1974,1975],{"class":393}," QoraClient",[368,1977,1978],{"class":378}," _client",[368,1980,548],{"class":382},[368,1982,1983,1985,1988,1991],{"class":370,"line":439},[368,1984,809],{"class":808},[368,1986,1987],{"class":393}," UserApi",[368,1989,1990],{"class":378}," _api",[368,1992,548],{"class":382},[368,1994,1995],{"class":370,"line":445},[368,1996,436],{"emptyLinePlaceholder":435},[368,1998,1999,2002,2005,2007,2010,2012,2015,2017,2020],{"class":370,"line":472},[368,2000,2001],{"class":393},"  UserRepository",[368,2003,2004],{"class":378},"(this",[368,2006,383],{"class":382},[368,2008,2009],{"class":378},"_client",[368,2011,423],{"class":382},[368,2013,2014],{"class":378}," this",[368,2016,383],{"class":382},[368,2018,2019],{"class":378},"_api)",[368,2021,548],{"class":382},[368,2023,2024],{"class":370,"line":477},[368,2025,436],{"emptyLinePlaceholder":435},[368,2027,2028,2031,2033,2035,2038,2040,2042,2045,2048,2050,2052,2054,2056,2058,2060],{"class":370,"line":483},[368,2029,2030],{"class":393},"  Future",[368,2032,390],{"class":378},[368,2034,394],{"class":393},[368,2036,2037],{"class":378},"> ",[368,2039,464],{"class":386},[368,2041,678],{"class":378},[368,2043,2044],{"class":393},"int",[368,2046,2047],{"class":378}," userId) ",[368,2049,456],{"class":382},[368,2051,1978],{"class":378},[368,2053,383],{"class":382},[368,2055,387],{"class":386},[368,2057,390],{"class":378},[368,2059,394],{"class":393},[368,2061,397],{"class":378},[368,2063,2064,2067,2069,2071,2073,2075,2077],{"class":370,"line":497},[368,2065,2066],{"class":378},"        key",[368,2068,413],{"class":382},[368,2070,416],{"class":378},[368,2072,420],{"class":419},[368,2074,423],{"class":382},[368,2076,426],{"class":378},[368,2078,429],{"class":382},[368,2080,2081,2084,2086,2088,2090,2092,2094,2096,2098],{"class":370,"line":522},[368,2082,2083],{"class":378},"        fetcher",[368,2085,413],{"class":382},[368,2087,453],{"class":378},[368,2089,456],{"class":382},[368,2091,1990],{"class":378},[368,2093,383],{"class":382},[368,2095,464],{"class":386},[368,2097,467],{"class":378},[368,2099,429],{"class":382},[368,2101,2102,2105,2107,2109,2111,2114,2116,2118,2120,2122,2124,2126],{"class":370,"line":535},[368,2103,2104],{"class":378},"        options",[368,2106,413],{"class":382},[368,2108,1355],{"class":808},[368,2110,491],{"class":393},[368,2112,2113],{"class":378},"(staleTime",[368,2115,413],{"class":382},[368,2117,505],{"class":393},[368,2119,508],{"class":378},[368,2121,413],{"class":382},[368,2123,514],{"class":513},[368,2125,1852],{"class":378},[368,2127,429],{"class":382},[368,2129,2130,2133],{"class":370,"line":543},[368,2131,2132],{"class":378},"      )",[368,2134,548],{"class":382},[368,2136,2137],{"class":370,"line":1028},[368,2138,436],{"emptyLinePlaceholder":435},[368,2140,2141,2144,2146,2148,2150,2152,2155,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176],{"class":370,"line":1033},[368,2142,2143],{"class":393},"  Stream",[368,2145,390],{"class":378},[368,2147,211],{"class":393},[368,2149,390],{"class":378},[368,2151,394],{"class":393},[368,2153,2154],{"class":378},">> ",[368,2156,2157],{"class":386},"watchUser",[368,2159,678],{"class":378},[368,2161,2044],{"class":393},[368,2163,2047],{"class":378},[368,2165,456],{"class":382},[368,2167,1978],{"class":378},[368,2169,383],{"class":382},[368,2171,1213],{"class":386},[368,2173,390],{"class":378},[368,2175,394],{"class":393},[368,2177,397],{"class":378},[368,2179,2180,2182,2184,2186,2188,2190,2192],{"class":370,"line":1039},[368,2181,2066],{"class":378},[368,2183,413],{"class":382},[368,2185,416],{"class":378},[368,2187,420],{"class":419},[368,2189,423],{"class":382},[368,2191,426],{"class":378},[368,2193,429],{"class":382},[368,2195,2196,2198,2200,2202,2204,2206,2208,2210,2212],{"class":370,"line":1060},[368,2197,2083],{"class":378},[368,2199,413],{"class":382},[368,2201,453],{"class":378},[368,2203,456],{"class":382},[368,2205,1990],{"class":378},[368,2207,383],{"class":382},[368,2209,464],{"class":386},[368,2211,467],{"class":378},[368,2213,429],{"class":382},[368,2215,2217,2219,2221,2223,2225],{"class":370,"line":2216},18,[368,2218,2104],{"class":378},[368,2220,413],{"class":382},[368,2222,1355],{"class":808},[368,2224,491],{"class":393},[368,2226,494],{"class":378},[368,2228,2230,2233,2235,2237,2239,2241,2243,2245],{"class":370,"line":2229},19,[368,2231,2232],{"class":378},"          staleTime",[368,2234,413],{"class":382},[368,2236,505],{"class":393},[368,2238,508],{"class":378},[368,2240,413],{"class":382},[368,2242,514],{"class":513},[368,2244,517],{"class":378},[368,2246,429],{"class":382},[368,2248,2250,2253,2255,2257,2259,2261,2263,2265],{"class":370,"line":2249},20,[368,2251,2252],{"class":378},"          refetchInterval",[368,2254,413],{"class":382},[368,2256,505],{"class":393},[368,2258,508],{"class":378},[368,2260,413],{"class":382},[368,2262,993],{"class":513},[368,2264,517],{"class":378},[368,2266,429],{"class":382},[368,2268,2270,2273],{"class":370,"line":2269},21,[368,2271,2272],{"class":378},"        )",[368,2274,429],{"class":382},[368,2276,2278,2280],{"class":370,"line":2277},22,[368,2279,2132],{"class":378},[368,2281,548],{"class":382},[368,2283,2285],{"class":370,"line":2284},23,[368,2286,436],{"emptyLinePlaceholder":435},[368,2288,2290,2293,2296,2298,2300,2302,2304,2306,2308,2310,2312,2314,2316,2318],{"class":370,"line":2289},24,[368,2291,2292],{"class":808},"  void",[368,2294,2295],{"class":386}," invalidateUser",[368,2297,678],{"class":378},[368,2299,2044],{"class":393},[368,2301,2047],{"class":378},[368,2303,456],{"class":382},[368,2305,1978],{"class":378},[368,2307,383],{"class":382},[368,2309,1519],{"class":386},[368,2311,1705],{"class":378},[368,2313,420],{"class":419},[368,2315,423],{"class":382},[368,2317,1804],{"class":378},[368,2319,548],{"class":382},[368,2321,2323],{"class":370,"line":2322},25,[368,2324,436],{"emptyLinePlaceholder":435},[368,2326,2328,2330,2333,2335,2337,2340],{"class":370,"line":2327},26,[368,2329,2292],{"class":808},[368,2331,2332],{"class":386}," patchLocally",[368,2334,678],{"class":378},[368,2336,394],{"class":393},[368,2338,2339],{"class":378}," updated) ",[368,2341,2342],{"class":382},"=>\n",[368,2344,2346,2349,2351,2353,2355,2357,2359,2362,2364,2367,2369,2372],{"class":370,"line":2345},27,[368,2347,2348],{"class":378},"      _client",[368,2350,383],{"class":382},[368,2352,1515],{"class":386},[368,2354,1705],{"class":378},[368,2356,420],{"class":419},[368,2358,423],{"class":382},[368,2360,2361],{"class":378}," updated",[368,2363,383],{"class":382},[368,2365,2366],{"class":378},"id]",[368,2368,423],{"class":382},[368,2370,2371],{"class":378}," updated)",[368,2373,548],{"class":382},[368,2375,2377],{"class":370,"line":2376},28,[368,2378,1932],{"class":378},[550,2380],{},[348,2382,133],{"id":2383},"best-practices",[553,2385,2387],{"id":2386},"do","Do",[357,2389,2392],{"className":359,"code":2390,"filename":2391,"language":362,"meta":363,"style":363},"// Consistent key structure: entity first, then ID/filters\n['users', userId]\n['posts', {'status': 'published', 'page': page}]\n\n// Always throw on error: never return null\nfetcher: () => api.getUser(userId),\n\n// Handle all four states exhaustively\nswitch (state) {\n  case Initial():  ...\n  case Loading():  ...\n  case Success():  ...\n  case Failure():  ...\n}\n","main.dart",[365,2393,2394,2399,2409,2433,2437,2442,2462,2466,2471,2479,2493,2506,2519,2532],{"__ignoreMap":363},[368,2395,2396],{"class":370,"line":371},[368,2397,2398],{"class":403},"// Consistent key structure: entity first, then ID/filters\n",[368,2400,2401,2403,2405,2407],{"class":370,"line":400},[368,2402,593],{"class":378},[368,2404,420],{"class":419},[368,2406,423],{"class":382},[368,2408,618],{"class":378},[368,2410,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431],{"class":370,"line":407},[368,2412,593],{"class":378},[368,2414,634],{"class":419},[368,2416,423],{"class":382},[368,2418,639],{"class":378},[368,2420,642],{"class":419},[368,2422,413],{"class":382},[368,2424,647],{"class":419},[368,2426,423],{"class":382},[368,2428,652],{"class":419},[368,2430,413],{"class":382},[368,2432,657],{"class":378},[368,2434,2435],{"class":370,"line":432},[368,2436,436],{"emptyLinePlaceholder":435},[368,2438,2439],{"class":370,"line":439},[368,2440,2441],{"class":403},"// Always throw on error: never return null\n",[368,2443,2444,2446,2448,2450,2452,2454,2456,2458,2460],{"class":370,"line":445},[368,2445,745],{"class":378},[368,2447,413],{"class":382},[368,2449,453],{"class":378},[368,2451,456],{"class":382},[368,2453,459],{"class":378},[368,2455,383],{"class":382},[368,2457,464],{"class":386},[368,2459,467],{"class":378},[368,2461,429],{"class":382},[368,2463,2464],{"class":370,"line":472},[368,2465,436],{"emptyLinePlaceholder":435},[368,2467,2468],{"class":370,"line":477},[368,2469,2470],{"class":403},"// Handle all four states exhaustively\n",[368,2472,2473,2476],{"class":370,"line":483},[368,2474,2475],{"class":374},"switch",[368,2477,2478],{"class":378}," (state) {\n",[368,2480,2481,2484,2486,2488,2490],{"class":370,"line":497},[368,2482,2483],{"class":374},"  case",[368,2485,1347],{"class":393},[368,2487,829],{"class":378},[368,2489,413],{"class":382},[368,2491,2492],{"class":382},"  ...\n",[368,2494,2495,2497,2500,2502,2504],{"class":370,"line":522},[368,2496,2483],{"class":374},[368,2498,2499],{"class":393}," Loading",[368,2501,829],{"class":378},[368,2503,413],{"class":382},[368,2505,2492],{"class":382},[368,2507,2508,2510,2513,2515,2517],{"class":370,"line":535},[368,2509,2483],{"class":374},[368,2511,2512],{"class":393}," Success",[368,2514,829],{"class":378},[368,2516,413],{"class":382},[368,2518,2492],{"class":382},[368,2520,2521,2523,2526,2528,2530],{"class":370,"line":543},[368,2522,2483],{"class":374},[368,2524,2525],{"class":393}," Failure",[368,2527,829],{"class":378},[368,2529,413],{"class":382},[368,2531,2492],{"class":382},[368,2533,2534],{"class":370,"line":1028},[368,2535,1932],{"class":378},[553,2537,2539],{"id":2538},"avoid","Avoid",[357,2541,2543],{"className":359,"code":2542,"filename":2391,"language":362,"meta":363,"style":363},"// Inconsistent key order\n['users', userId]\n[userId, 'users']  // Different cache entry\n\n// Swallowing errors\nfetcher: () async {\n  try { return await api.getUser(userId); }\n  catch (_) { return null; }  // Qora never sees the failure\n},\n\n// Objects without == override in keys\n['users', UserFilter(status: 'active')]  // Always a cache miss\n",[365,2544,2545,2550,2560,2576,2580,2585,2597,2624,2643,2649,2653,2658],{"__ignoreMap":363},[368,2546,2547],{"class":370,"line":371},[368,2548,2549],{"class":403},"// Inconsistent key order\n",[368,2551,2552,2554,2556,2558],{"class":370,"line":400},[368,2553,593],{"class":378},[368,2555,420],{"class":419},[368,2557,423],{"class":382},[368,2559,618],{"class":378},[368,2561,2562,2565,2567,2570,2573],{"class":370,"line":407},[368,2563,2564],{"class":378},"[userId",[368,2566,423],{"class":382},[368,2568,2569],{"class":419}," 'users'",[368,2571,2572],{"class":378},"]  ",[368,2574,2575],{"class":403},"// Different cache entry\n",[368,2577,2578],{"class":370,"line":432},[368,2579,436],{"emptyLinePlaceholder":435},[368,2581,2582],{"class":370,"line":439},[368,2583,2584],{"class":403},"// Swallowing errors\n",[368,2586,2587,2589,2591,2593,2595],{"class":370,"line":445},[368,2588,745],{"class":378},[368,2590,413],{"class":382},[368,2592,453],{"class":378},[368,2594,800],{"class":374},[368,2596,803],{"class":378},[368,2598,2599,2602,2605,2608,2610,2612,2614,2616,2618,2621],{"class":370,"line":472},[368,2600,2601],{"class":374},"  try",[368,2603,2604],{"class":378}," { ",[368,2606,2607],{"class":374},"return",[368,2609,818],{"class":374},[368,2611,459],{"class":378},[368,2613,383],{"class":382},[368,2615,464],{"class":386},[368,2617,467],{"class":378},[368,2619,2620],{"class":382},";",[368,2622,2623],{"class":378}," }\n",[368,2625,2626,2629,2632,2634,2637,2640],{"class":370,"line":477},[368,2627,2628],{"class":374},"  catch",[368,2630,2631],{"class":378}," (_) { ",[368,2633,2607],{"class":374},[368,2635,2636],{"class":382}," null;",[368,2638,2639],{"class":378}," }  ",[368,2641,2642],{"class":403},"// Qora never sees the failure\n",[368,2644,2645,2647],{"class":370,"line":483},[368,2646,862],{"class":378},[368,2648,429],{"class":382},[368,2650,2651],{"class":370,"line":497},[368,2652,436],{"emptyLinePlaceholder":435},[368,2654,2655],{"class":370,"line":522},[368,2656,2657],{"class":403},"// Objects without == override in keys\n",[368,2659,2660,2662,2664,2666,2669,2672,2674,2677,2680],{"class":370,"line":535},[368,2661,593],{"class":378},[368,2663,420],{"class":419},[368,2665,423],{"class":382},[368,2667,2668],{"class":393}," UserFilter",[368,2670,2671],{"class":378},"(status",[368,2673,413],{"class":382},[368,2675,2676],{"class":419}," 'active'",[368,2678,2679],{"class":378},")]  ",[368,2681,2682],{"class":403},"// Always a cache miss\n",[550,2684],{},[348,2686,2688],{"id":2687},"next-steps","Next Steps",[566,2690,2691,2696,2701,2707],{},[569,2692,2693,2695],{},[731,2694,57],{"href":733},": Key structure, equality, and invalidation patterns",[569,2697,2698,2700],{},[731,2699,62],{"href":1640},": Deep dive into the sealed class state machine",[569,2702,2703,2706],{},[731,2704,67],{"href":2705},"./caching",": LRU, stale time, GC, and cache management",[569,2708,2709,2712],{},[731,2710,72],{"href":2711},"./stale-while-revalidate",": How background revalidation works",[2714,2715,2716],"style",{},"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 .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 .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 pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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":363,"searchDepth":400,"depth":400,"links":2718},[2719,2724,2732,2733,2734,2735,2736,2740],{"id":350,"depth":400,"text":351,"children":2720},[2721,2722,2723],{"id":555,"depth":407,"text":556},{"id":739,"depth":407,"text":740},{"id":881,"depth":407,"text":882},{"id":1073,"depth":400,"text":1074,"children":2725},[2726,2728,2730],{"id":1077,"depth":407,"text":2727},"fetchQuery: One-shot",{"id":1210,"depth":407,"text":2729},"watchQuery: Reactive stream",{"id":1534,"depth":407,"text":2731},"prefetch: Background preloading",{"id":1626,"depth":400,"text":1627},{"id":1646,"depth":400,"text":1647},{"id":1760,"depth":400,"text":1761},{"id":1937,"depth":400,"text":1938},{"id":2383,"depth":400,"text":133,"children":2737},[2738,2739],{"id":2386,"depth":407,"text":2387},{"id":2538,"depth":407,"text":2539},{"id":2687,"depth":400,"text":2688},"Queries are the foundation of Qora. A query is an async request bound to a key, with automatic caching, deduplication, retries, and reactive state.","md",null,{},{"icon":55},{"title":52,"description":2741},"PGWgBNEIW8wQSKbtdcj53UKxHerbowOvLXcWm_U5bvU",[2749,2751],{"title":40,"path":41,"stem":42,"description":2750,"icon":43,"children":-1},"Give Claude, Cursor, Copilot or any coding assistant the context it needs to write correct Qora code.",{"title":57,"path":58,"stem":59,"description":2752,"icon":60,"children":-1},"Query keys are the foundation of Qora's caching system. They uniquely identify queries and enable automatic cache management, invalidation, and refetching.",1794040396725]