[{"data":1,"prerenderedAt":3870},["ShallowReactive",2],{"navigation_docs_en":3,"-en-api-reference-qora-options":342,"-en-api-reference-qora-options-surround":3865},[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":215,"body":344,"description":3858,"extension":3859,"links":3860,"meta":3861,"navigation":3862,"path":216,"seo":3863,"stem":217,"__hash__":3864},"docs_en/en/05.api-reference/4.qora-options.md",{"type":345,"value":346,"toc":3830},"minimark",[347,351,362,523,526,530,808,810,814,821,836,846,860,870,954,1023,1025,1031,1045,1051,1064,1116,1128,1130,1135,1150,1157,1163,1181,1188,1225,1227,1233,1250,1257,1264,1308,1471,1480,1482,1488,1502,1509,1516,1548,1550,1556,1570,1577,1583,1609,1611,1617,1641,1648,1651,1777,1779,1785,1815,1824,1830,1833,1936,1944,1946,1952,1966,1972,1979,1981,1987,2001,2007,2013,2015,2021,2037,2044,2050,2087,2089,2095,2111,2121,2127,2173,2175,2181,2195,2202,2205,2258,2357,2363,2365,2371,2385,2391,2394,2404,2425,2428,2478,2480,2486,2500,2506,2518,2524,2658,2661,2663,2668,2694,2700,2710,2713,2838,2841,2843,2849,2874,2880,2883,2893,3054,3056,3062,3087,3093,3100,3103,3242,3247,3265,3332,3334,3340,3368,3374,3377,3380,3423,3432,3539,3546,3548,3554,3574,3583,3585,3591,3612,3641,3647,3649,3653,3826],[348,349,243],"h2",{"id":350},"overview",[352,353,354,357,358,361],"p",{},[355,356,215],"code",{}," configures the behaviour of an individual query. Any field left at its default inherits from ",[355,359,360],{},"QoraClientConfig.defaultOptions",". Fields are merged with per-query values taking priority.",[363,364,370],"pre",{"className":365,"code":366,"filename":367,"language":368,"meta":369,"style":369},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","await client.fetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: QoraOptions(\n    staleTime: Duration(minutes: 5),\n    retryCount: 2,\n  ),\n);\n","user_repository.dart","dart","",[355,371,372,403,428,455,469,494,507,515],{"__ignoreMap":369},[373,374,377,381,385,389,393,396,400],"span",{"class":375,"line":376},"line",1,[373,378,380],{"class":379},"s7zQu","await",[373,382,384],{"class":383},"sTEyZ"," client",[373,386,388],{"class":387},"sMK4o",".",[373,390,392],{"class":391},"s2Zo4","fetchQuery",[373,394,395],{"class":383},"\u003C",[373,397,399],{"class":398},"sBMFI","User",[373,401,402],{"class":383},">(\n",[373,404,406,409,412,415,419,422,425],{"class":375,"line":405},2,[373,407,408],{"class":383},"  key",[373,410,411],{"class":387},":",[373,413,414],{"class":383}," [",[373,416,418],{"class":417},"sfazB","'users'",[373,420,421],{"class":387},",",[373,423,424],{"class":383}," userId]",[373,426,427],{"class":387},",\n",[373,429,431,434,436,439,442,445,447,450,453],{"class":375,"line":430},3,[373,432,433],{"class":383},"  fetcher",[373,435,411],{"class":387},[373,437,438],{"class":383}," () ",[373,440,441],{"class":387},"=>",[373,443,444],{"class":383}," api",[373,446,388],{"class":387},[373,448,449],{"class":391},"getUser",[373,451,452],{"class":383},"(userId)",[373,454,427],{"class":387},[373,456,458,461,463,466],{"class":375,"line":457},4,[373,459,460],{"class":383},"  options",[373,462,411],{"class":387},[373,464,465],{"class":398}," QoraOptions",[373,467,468],{"class":383},"(\n",[373,470,472,475,477,480,483,485,489,492],{"class":375,"line":471},5,[373,473,474],{"class":383},"    staleTime",[373,476,411],{"class":387},[373,478,479],{"class":398}," Duration",[373,481,482],{"class":383},"(minutes",[373,484,411],{"class":387},[373,486,488],{"class":487},"sbssI"," 5",[373,490,491],{"class":383},")",[373,493,427],{"class":387},[373,495,497,500,502,505],{"class":375,"line":496},6,[373,498,499],{"class":383},"    retryCount",[373,501,411],{"class":387},[373,503,504],{"class":487}," 2",[373,506,427],{"class":387},[373,508,510,513],{"class":375,"line":509},7,[373,511,512],{"class":383},"  )",[373,514,427],{"class":387},[373,516,518,520],{"class":375,"line":517},8,[373,519,491],{"class":383},[373,521,522],{"class":387},";\n",[524,525],"hr",{},[348,527,529],{"id":528},"constructor","Constructor",[363,531,533],{"className":365,"code":532,"language":368,"meta":369,"style":369},"const QoraOptions({\n  Duration staleTime = Duration.zero,\n  Duration gcTime = const Duration(minutes: 5),\n  bool enabled = true,\n  Object? dependsOn,\n  int retryCount = 3,\n  Duration retryDelay = const Duration(seconds: 1),\n  Duration Function(int attemptIndex)? retryDelayCalculator,\n  bool Function(Object error, int attemptIndex)? retryCondition,\n  bool refetchOnWindowFocus = true,\n  bool refetchOnReconnect = true,\n  Duration? refetchInterval,\n  bool? refetchOnMount,\n  NetworkMode networkMode = NetworkMode.online,\n  Object? Function(Object? data)? toJson,\n})\n",[355,534,535,546,566,590,603,616,631,656,679,708,720,732,744,756,777,802],{"__ignoreMap":369},[373,536,537,541,543],{"class":375,"line":376},[373,538,540],{"class":539},"spNyl","const",[373,542,465],{"class":398},[373,544,545],{"class":383},"({\n",[373,547,548,551,554,557,559,561,564],{"class":375,"line":405},[373,549,550],{"class":398},"  Duration",[373,552,553],{"class":383}," staleTime ",[373,555,556],{"class":387},"=",[373,558,479],{"class":398},[373,560,388],{"class":387},[373,562,563],{"class":383},"zero",[373,565,427],{"class":387},[373,567,568,570,573,575,578,580,582,584,586,588],{"class":375,"line":430},[373,569,550],{"class":398},[373,571,572],{"class":383}," gcTime ",[373,574,556],{"class":387},[373,576,577],{"class":539}," const",[373,579,479],{"class":398},[373,581,482],{"class":383},[373,583,411],{"class":387},[373,585,488],{"class":487},[373,587,491],{"class":383},[373,589,427],{"class":387},[373,591,592,595,598,600],{"class":375,"line":457},[373,593,594],{"class":398},"  bool",[373,596,597],{"class":383}," enabled ",[373,599,556],{"class":387},[373,601,602],{"class":387}," true,\n",[373,604,605,608,611,614],{"class":375,"line":471},[373,606,607],{"class":398},"  Object",[373,609,610],{"class":387},"?",[373,612,613],{"class":383}," dependsOn",[373,615,427],{"class":387},[373,617,618,621,624,626,629],{"class":375,"line":496},[373,619,620],{"class":398},"  int",[373,622,623],{"class":383}," retryCount ",[373,625,556],{"class":387},[373,627,628],{"class":487}," 3",[373,630,427],{"class":387},[373,632,633,635,638,640,642,644,647,649,652,654],{"class":375,"line":509},[373,634,550],{"class":398},[373,636,637],{"class":383}," retryDelay ",[373,639,556],{"class":387},[373,641,577],{"class":539},[373,643,479],{"class":398},[373,645,646],{"class":383},"(seconds",[373,648,411],{"class":387},[373,650,651],{"class":487}," 1",[373,653,491],{"class":383},[373,655,427],{"class":387},[373,657,658,660,663,666,669,672,674,677],{"class":375,"line":517},[373,659,550],{"class":398},[373,661,662],{"class":398}," Function",[373,664,665],{"class":383},"(",[373,667,668],{"class":398},"int",[373,670,671],{"class":383}," attemptIndex)",[373,673,610],{"class":387},[373,675,676],{"class":383}," retryDelayCalculator",[373,678,427],{"class":387},[373,680,682,684,686,688,691,694,696,699,701,703,706],{"class":375,"line":681},9,[373,683,594],{"class":398},[373,685,662],{"class":398},[373,687,665],{"class":383},[373,689,690],{"class":398},"Object",[373,692,693],{"class":383}," error",[373,695,421],{"class":387},[373,697,698],{"class":398}," int",[373,700,671],{"class":383},[373,702,610],{"class":387},[373,704,705],{"class":383}," retryCondition",[373,707,427],{"class":387},[373,709,711,713,716,718],{"class":375,"line":710},10,[373,712,594],{"class":398},[373,714,715],{"class":383}," refetchOnWindowFocus ",[373,717,556],{"class":387},[373,719,602],{"class":387},[373,721,723,725,728,730],{"class":375,"line":722},11,[373,724,594],{"class":398},[373,726,727],{"class":383}," refetchOnReconnect ",[373,729,556],{"class":387},[373,731,602],{"class":387},[373,733,735,737,739,742],{"class":375,"line":734},12,[373,736,550],{"class":398},[373,738,610],{"class":387},[373,740,741],{"class":383}," refetchInterval",[373,743,427],{"class":387},[373,745,747,749,751,754],{"class":375,"line":746},13,[373,748,594],{"class":398},[373,750,610],{"class":387},[373,752,753],{"class":383}," refetchOnMount",[373,755,427],{"class":387},[373,757,759,762,765,767,770,772,775],{"class":375,"line":758},14,[373,760,761],{"class":398},"  NetworkMode",[373,763,764],{"class":383}," networkMode ",[373,766,556],{"class":387},[373,768,769],{"class":398}," NetworkMode",[373,771,388],{"class":387},[373,773,774],{"class":383},"online",[373,776,427],{"class":387},[373,778,780,782,784,786,788,790,792,795,797,800],{"class":375,"line":779},15,[373,781,607],{"class":398},[373,783,610],{"class":387},[373,785,662],{"class":398},[373,787,665],{"class":383},[373,789,690],{"class":398},[373,791,610],{"class":387},[373,793,794],{"class":383}," data)",[373,796,610],{"class":387},[373,798,799],{"class":383}," toJson",[373,801,427],{"class":387},[373,803,805],{"class":375,"line":804},16,[373,806,807],{"class":383},"})\n",[524,809],{},[348,811,813],{"id":812},"fields","Fields",[815,816,818],"h3",{"id":817},"staletime",[355,819,820],{},"staleTime",[363,822,824],{"className":365,"code":823,"language":368,"meta":369,"style":369},"final Duration staleTime\n",[355,825,826],{"__ignoreMap":369},[373,827,828,831,833],{"class":375,"line":376},[373,829,830],{"class":539},"final",[373,832,479],{"class":398},[373,834,835],{"class":383}," staleTime\n",[352,837,838,842,843],{},[839,840,841],"strong",{},"Default:"," ",[355,844,845],{},"Duration.zero",[352,847,848,849,852,853,855,856,859],{},"How long data is considered ",[839,850,851],{},"fresh"," after a successful fetch. During the freshness window, ",[355,854,392],{}," and ",[355,857,858],{},"watchQuery"," skip the network entirely and return cached data.",[352,861,862,863,865,866,869],{},"Once ",[355,864,820],{}," elapses the data is considered ",[839,867,868],{},"stale",": Qora returns it immediately but also triggers a background revalidation.",[363,871,874],{"className":365,"code":872,"filename":873,"language":368,"meta":369,"style":369},"// Always stale (default): serve cache, always revalidate\nstaleTime: Duration.zero,\n\n// Fresh for 5 minutes: no network in the window\nstaleTime: Duration(minutes: 5),\n\n// Effectively never stale\nstaleTime: Duration(days: 365),\n","main.dart",[355,875,876,882,896,902,907,925,929,934],{"__ignoreMap":369},[373,877,878],{"class":375,"line":376},[373,879,881],{"class":880},"sHwdD","// Always stale (default): serve cache, always revalidate\n",[373,883,884,886,888,890,892,894],{"class":375,"line":405},[373,885,820],{"class":383},[373,887,411],{"class":387},[373,889,479],{"class":398},[373,891,388],{"class":387},[373,893,563],{"class":383},[373,895,427],{"class":387},[373,897,898],{"class":375,"line":430},[373,899,901],{"emptyLinePlaceholder":900},true,"\n",[373,903,904],{"class":375,"line":457},[373,905,906],{"class":880},"// Fresh for 5 minutes: no network in the window\n",[373,908,909,911,913,915,917,919,921,923],{"class":375,"line":471},[373,910,820],{"class":383},[373,912,411],{"class":387},[373,914,479],{"class":398},[373,916,482],{"class":383},[373,918,411],{"class":387},[373,920,488],{"class":487},[373,922,491],{"class":383},[373,924,427],{"class":387},[373,926,927],{"class":375,"line":496},[373,928,901],{"emptyLinePlaceholder":900},[373,930,931],{"class":375,"line":509},[373,932,933],{"class":880},"// Effectively never stale\n",[373,935,936,938,940,942,945,947,950,952],{"class":375,"line":517},[373,937,820],{"class":383},[373,939,411],{"class":387},[373,941,479],{"class":398},[373,943,944],{"class":383},"(days",[373,946,411],{"class":387},[373,948,949],{"class":487}," 365",[373,951,491],{"class":383},[373,953,427],{"class":387},[955,956,957,970],"table",{},[958,959,960],"thead",{},[961,962,963,967],"tr",{},[964,965,966],"th",{},"Data type",[964,968,969],{},"Recommended value",[971,972,973,983,993,1003,1013],"tbody",{},[961,974,975,979],{},[976,977,978],"td",{},"Live prices, feeds",[976,980,981],{},[355,982,845],{},[961,984,985,988],{},[976,986,987],{},"User profile",[976,989,990],{},[355,991,992],{},"Duration(minutes: 5)",[961,994,995,998],{},[976,996,997],{},"Article / post content",[976,999,1000],{},[355,1001,1002],{},"Duration(minutes: 10)",[961,1004,1005,1008],{},[976,1006,1007],{},"App configuration",[976,1009,1010],{},[355,1011,1012],{},"Duration(hours: 1)",[961,1014,1015,1018],{},[976,1016,1017],{},"Static reference data",[976,1019,1020],{},[355,1021,1022],{},"Duration(days: 1)",[524,1024],{},[815,1026,1028],{"id":1027},"gctime",[355,1029,1030],{},"gcTime",[363,1032,1034],{"className":365,"code":1033,"language":368,"meta":369,"style":369},"final Duration gcTime\n",[355,1035,1036],{"__ignoreMap":369},[373,1037,1038,1040,1042],{"class":375,"line":376},[373,1039,830],{"class":539},[373,1041,479],{"class":398},[373,1043,1044],{"class":383}," gcTime\n",[352,1046,1047,842,1049],{},[839,1048,841],{},[355,1050,992],{},[352,1052,1053,1054,1057,1058,1060,1061,388],{},"How long an ",[839,1055,1056],{},"inactive"," entry stays in cache after all ",[355,1059,858],{}," subscribers cancel. When the GC timer fires the entry is removed; the next access starts from ",[355,1062,1063],{},"Initial",[363,1065,1067],{"className":365,"code":1066,"filename":873,"language":368,"meta":369,"style":369},"// Keep in cache for 10 minutes after leaving the screen\ngcTime: Duration(minutes: 10),\n\n// Remove immediately on unsubscribe (e.g. sensitive session data)\ngcTime: Duration.zero,\n",[355,1068,1069,1074,1093,1097,1102],{"__ignoreMap":369},[373,1070,1071],{"class":375,"line":376},[373,1072,1073],{"class":880},"// Keep in cache for 10 minutes after leaving the screen\n",[373,1075,1076,1078,1080,1082,1084,1086,1089,1091],{"class":375,"line":405},[373,1077,1030],{"class":383},[373,1079,411],{"class":387},[373,1081,479],{"class":398},[373,1083,482],{"class":383},[373,1085,411],{"class":387},[373,1087,1088],{"class":487}," 10",[373,1090,491],{"class":383},[373,1092,427],{"class":387},[373,1094,1095],{"class":375,"line":430},[373,1096,901],{"emptyLinePlaceholder":900},[373,1098,1099],{"class":375,"line":457},[373,1100,1101],{"class":880},"// Remove immediately on unsubscribe (e.g. sensitive session data)\n",[373,1103,1104,1106,1108,1110,1112,1114],{"class":375,"line":471},[373,1105,1030],{"class":383},[373,1107,411],{"class":387},[373,1109,479],{"class":398},[373,1111,388],{"class":387},[373,1113,563],{"class":383},[373,1115,427],{"class":387},[1117,1118,1119,855,1121,1123,1124,1127],"tip",{},[355,1120,820],{},[355,1122,1030],{}," are independent. A common pattern is ",[355,1125,1126],{},"staleTime \u003C gcTime",": data goes stale (triggering a revalidation) but stays in cache so navigation back is instant.",[524,1129],{},[815,1131,1133],{"id":1132},"enabled",[355,1134,1132],{},[363,1136,1138],{"className":365,"code":1137,"language":368,"meta":369,"style":369},"final bool enabled\n",[355,1139,1140],{"__ignoreMap":369},[373,1141,1142,1144,1147],{"class":375,"line":376},[373,1143,830],{"class":539},[373,1145,1146],{"class":398}," bool",[373,1148,1149],{"class":383}," enabled\n",[352,1151,1152,842,1154],{},[839,1153,841],{},[355,1155,1156],{},"true",[352,1158,1159,1160,411],{},"When ",[355,1161,1162],{},"false",[1164,1165,1166,1176],"ul",{},[1167,1168,1169,1171,1172,1175],"li",{},[355,1170,392],{}," throws a ",[355,1173,1174],{},"StateError"," immediately",[1167,1177,1178,1180],{},[355,1179,858],{}," emits the current state without triggering any fetch",[352,1182,1183,1184,1187],{},"Useful for ",[839,1185,1186],{},"conditional queries"," that should only run when a prerequisite is satisfied:",[363,1189,1191],{"className":365,"code":1190,"filename":873,"language":368,"meta":369,"style":369},"// Only fetch when userId is non-null\noptions: QoraOptions(enabled: userId != null),\n",[355,1192,1193,1198],{"__ignoreMap":369},[373,1194,1195],{"class":375,"line":376},[373,1196,1197],{"class":880},"// Only fetch when userId is non-null\n",[373,1199,1200,1203,1205,1207,1210,1212,1215,1218,1221,1223],{"class":375,"line":405},[373,1201,1202],{"class":383},"options",[373,1204,411],{"class":387},[373,1206,465],{"class":398},[373,1208,1209],{"class":383},"(enabled",[373,1211,411],{"class":387},[373,1213,1214],{"class":383}," userId ",[373,1216,1217],{"class":387},"!=",[373,1219,1220],{"class":387}," null",[373,1222,491],{"class":383},[373,1224,427],{"class":387},[524,1226],{},[815,1228,1230],{"id":1229},"dependson",[355,1231,1232],{},"dependsOn",[363,1234,1236],{"className":365,"code":1235,"language":368,"meta":369,"style":369},"final Object? dependsOn\n",[355,1237,1238],{"__ignoreMap":369},[373,1239,1240,1242,1245,1247],{"class":375,"line":376},[373,1241,830],{"class":539},[373,1243,1244],{"class":398}," Object",[373,1246,610],{"class":387},[373,1248,1249],{"class":383}," dependsOn\n",[352,1251,1252,842,1254],{},[839,1253,841],{},[355,1255,1256],{},"null",[352,1258,1259,1260,1263],{},"The key of another query that must have ",[355,1261,1262],{},"Success"," data before this query fires. Provides a reactive dependency without manual coordination:",[955,1265,1266,1276],{},[958,1267,1268],{},[961,1269,1270,1273],{},[964,1271,1272],{},"API",[964,1274,1275],{},"Behaviour when dependency unresolved",[971,1277,1278,1287,1298],{},[961,1279,1280,1284],{},[976,1281,1282],{},[355,1283,858],{},[976,1285,1286],{},"Subscribes to the dependency stream; fires automatically when data arrives",[961,1288,1289,1293],{},[976,1290,1291],{},[355,1292,392],{},[976,1294,1295,1296,1175],{},"Throws ",[355,1297,1174],{},[961,1299,1300,1305],{},[976,1301,1302],{},[355,1303,1304],{},"prefetch",[976,1306,1307],{},"Silently skips",[363,1309,1311],{"className":365,"code":1310,"filename":873,"language":368,"meta":369,"style":369},"// Step 1: fetch the session (no dependency)\nclient.watchQuery\u003CSession>(\n  key: ['session'],\n  fetcher: () => api.getSession(),\n);\n\n// Step 2: fetch the user only once session has data\nclient.watchQuery\u003CUser>(\n  key: ['user'],\n  fetcher: () => api.getUser(session!.userId),\n  options: QoraOptions(dependsOn: ['session']),\n);\n",[355,1312,1313,1318,1334,1350,1372,1378,1382,1387,1401,1416,1443,1465],{"__ignoreMap":369},[373,1314,1315],{"class":375,"line":376},[373,1316,1317],{"class":880},"// Step 1: fetch the session (no dependency)\n",[373,1319,1320,1323,1325,1327,1329,1332],{"class":375,"line":405},[373,1321,1322],{"class":383},"client",[373,1324,388],{"class":387},[373,1326,858],{"class":391},[373,1328,395],{"class":383},[373,1330,1331],{"class":398},"Session",[373,1333,402],{"class":383},[373,1335,1336,1338,1340,1342,1345,1348],{"class":375,"line":430},[373,1337,408],{"class":383},[373,1339,411],{"class":387},[373,1341,414],{"class":383},[373,1343,1344],{"class":417},"'session'",[373,1346,1347],{"class":383},"]",[373,1349,427],{"class":387},[373,1351,1352,1354,1356,1358,1360,1362,1364,1367,1370],{"class":375,"line":457},[373,1353,433],{"class":383},[373,1355,411],{"class":387},[373,1357,438],{"class":383},[373,1359,441],{"class":387},[373,1361,444],{"class":383},[373,1363,388],{"class":387},[373,1365,1366],{"class":391},"getSession",[373,1368,1369],{"class":383},"()",[373,1371,427],{"class":387},[373,1373,1374,1376],{"class":375,"line":471},[373,1375,491],{"class":383},[373,1377,522],{"class":387},[373,1379,1380],{"class":375,"line":496},[373,1381,901],{"emptyLinePlaceholder":900},[373,1383,1384],{"class":375,"line":509},[373,1385,1386],{"class":880},"// Step 2: fetch the user only once session has data\n",[373,1388,1389,1391,1393,1395,1397,1399],{"class":375,"line":517},[373,1390,1322],{"class":383},[373,1392,388],{"class":387},[373,1394,858],{"class":391},[373,1396,395],{"class":383},[373,1398,399],{"class":398},[373,1400,402],{"class":383},[373,1402,1403,1405,1407,1409,1412,1414],{"class":375,"line":681},[373,1404,408],{"class":383},[373,1406,411],{"class":387},[373,1408,414],{"class":383},[373,1410,1411],{"class":417},"'user'",[373,1413,1347],{"class":383},[373,1415,427],{"class":387},[373,1417,1418,1420,1422,1424,1426,1428,1430,1432,1435,1438,1441],{"class":375,"line":710},[373,1419,433],{"class":383},[373,1421,411],{"class":387},[373,1423,438],{"class":383},[373,1425,441],{"class":387},[373,1427,444],{"class":383},[373,1429,388],{"class":387},[373,1431,449],{"class":391},[373,1433,1434],{"class":383},"(session",[373,1436,1437],{"class":387},"!.",[373,1439,1440],{"class":383},"userId)",[373,1442,427],{"class":387},[373,1444,1445,1447,1449,1451,1454,1456,1458,1460,1463],{"class":375,"line":722},[373,1446,460],{"class":383},[373,1448,411],{"class":387},[373,1450,465],{"class":398},[373,1452,1453],{"class":383},"(dependsOn",[373,1455,411],{"class":387},[373,1457,414],{"class":383},[373,1459,1344],{"class":417},[373,1461,1462],{"class":383},"])",[373,1464,427],{"class":387},[373,1466,1467,1469],{"class":375,"line":734},[373,1468,491],{"class":383},[373,1470,522],{"class":387},[352,1472,1473,1474,1479],{},"See the ",[1475,1476,1478],"a",{"href":1477},"../recipes/dependent-queries","Dependent Queries guide"," for full examples.",[524,1481],{},[815,1483,1485],{"id":1484},"retrycount",[355,1486,1487],{},"retryCount",[363,1489,1491],{"className":365,"code":1490,"language":368,"meta":369,"style":369},"final int retryCount\n",[355,1492,1493],{"__ignoreMap":369},[373,1494,1495,1497,1499],{"class":375,"line":376},[373,1496,830],{"class":539},[373,1498,698],{"class":398},[373,1500,1501],{"class":383}," retryCount\n",[352,1503,1504,842,1506],{},[839,1505,841],{},[355,1507,1508],{},"3",[352,1510,1511,1512,1515],{},"Number of automatic retry attempts after a fetch failure. Set to ",[355,1513,1514],{},"0"," to disable retries.",[363,1517,1519],{"className":365,"code":1518,"filename":873,"language":368,"meta":369,"style":369},"retryCount: 0,  // fail immediately on first error\nretryCount: 5,  // retry up to 5 times\n",[355,1520,1521,1535],{"__ignoreMap":369},[373,1522,1523,1525,1527,1530,1532],{"class":375,"line":376},[373,1524,1487],{"class":383},[373,1526,411],{"class":387},[373,1528,1529],{"class":487}," 0",[373,1531,421],{"class":387},[373,1533,1534],{"class":880},"  // fail immediately on first error\n",[373,1536,1537,1539,1541,1543,1545],{"class":375,"line":405},[373,1538,1487],{"class":383},[373,1540,411],{"class":387},[373,1542,488],{"class":487},[373,1544,421],{"class":387},[373,1546,1547],{"class":880},"  // retry up to 5 times\n",[524,1549],{},[815,1551,1553],{"id":1552},"retrydelay",[355,1554,1555],{},"retryDelay",[363,1557,1559],{"className":365,"code":1558,"language":368,"meta":369,"style":369},"final Duration retryDelay\n",[355,1560,1561],{"__ignoreMap":369},[373,1562,1563,1565,1567],{"class":375,"line":376},[373,1564,830],{"class":539},[373,1566,479],{"class":398},[373,1568,1569],{"class":383}," retryDelay\n",[352,1571,1572,842,1574],{},[839,1573,841],{},[355,1575,1576],{},"Duration(seconds: 1)",[352,1578,1579,1580,411],{},"Base delay between retry attempts. By default Qora uses ",[839,1581,1582],{},"exponential backoff",[1164,1584,1585,1591,1597,1603],{},[1167,1586,1587,1588],{},"Attempt 0 → ",[355,1589,1590],{},"1 s",[1167,1592,1593,1594],{},"Attempt 1 → ",[355,1595,1596],{},"2 s",[1167,1598,1599,1600],{},"Attempt 2 → ",[355,1601,1602],{},"4 s",[1167,1604,1605,1606],{},"Attempt 3 → ",[355,1607,1608],{},"8 s",[524,1610],{},[815,1612,1614],{"id":1613},"retrydelaycalculator",[355,1615,1616],{},"retryDelayCalculator",[363,1618,1620],{"className":365,"code":1619,"language":368,"meta":369,"style":369},"final Duration Function(int attemptIndex)? retryDelayCalculator\n",[355,1621,1622],{"__ignoreMap":369},[373,1623,1624,1626,1628,1630,1632,1634,1636,1638],{"class":375,"line":376},[373,1625,830],{"class":539},[373,1627,479],{"class":398},[373,1629,662],{"class":398},[373,1631,665],{"class":383},[373,1633,668],{"class":398},[373,1635,671],{"class":383},[373,1637,610],{"class":387},[373,1639,1640],{"class":383}," retryDelayCalculator\n",[352,1642,1643,842,1645,1647],{},[839,1644,841],{},[355,1646,1256],{}," (uses exponential backoff)",[352,1649,1650],{},"Custom delay calculator. Receives the zero-based attempt index and returns the delay before that attempt.",[363,1652,1654],{"className":365,"code":1653,"filename":873,"language":368,"meta":369,"style":369},"// Fixed 500 ms delay\nretryDelayCalculator: (_) => const Duration(milliseconds: 500),\n\n// Jittered exponential backoff\nretryDelayCalculator: (i) => Duration(\n  milliseconds: (500 * pow(2, i) + Random().nextInt(200)).toInt(),\n),\n",[355,1655,1656,1661,1688,1692,1697,1712,1771],{"__ignoreMap":369},[373,1657,1658],{"class":375,"line":376},[373,1659,1660],{"class":880},"// Fixed 500 ms delay\n",[373,1662,1663,1665,1667,1670,1672,1674,1676,1679,1681,1684,1686],{"class":375,"line":405},[373,1664,1616],{"class":383},[373,1666,411],{"class":387},[373,1668,1669],{"class":383}," (_) ",[373,1671,441],{"class":387},[373,1673,577],{"class":539},[373,1675,479],{"class":398},[373,1677,1678],{"class":383},"(milliseconds",[373,1680,411],{"class":387},[373,1682,1683],{"class":487}," 500",[373,1685,491],{"class":383},[373,1687,427],{"class":387},[373,1689,1690],{"class":375,"line":430},[373,1691,901],{"emptyLinePlaceholder":900},[373,1693,1694],{"class":375,"line":457},[373,1695,1696],{"class":880},"// Jittered exponential backoff\n",[373,1698,1699,1701,1703,1706,1708,1710],{"class":375,"line":471},[373,1700,1616],{"class":383},[373,1702,411],{"class":387},[373,1704,1705],{"class":383}," (i) ",[373,1707,441],{"class":387},[373,1709,479],{"class":398},[373,1711,468],{"class":383},[373,1713,1714,1717,1719,1722,1725,1728,1731,1733,1736,1738,1741,1744,1747,1749,1751,1754,1756,1759,1762,1764,1767,1769],{"class":375,"line":496},[373,1715,1716],{"class":383},"  milliseconds",[373,1718,411],{"class":387},[373,1720,1721],{"class":383}," (",[373,1723,1724],{"class":487},"500",[373,1726,1727],{"class":387}," *",[373,1729,1730],{"class":391}," pow",[373,1732,665],{"class":383},[373,1734,1735],{"class":487},"2",[373,1737,421],{"class":387},[373,1739,1740],{"class":383}," i) ",[373,1742,1743],{"class":387},"+",[373,1745,1746],{"class":398}," Random",[373,1748,1369],{"class":383},[373,1750,388],{"class":387},[373,1752,1753],{"class":391},"nextInt",[373,1755,665],{"class":383},[373,1757,1758],{"class":487},"200",[373,1760,1761],{"class":383},"))",[373,1763,388],{"class":387},[373,1765,1766],{"class":391},"toInt",[373,1768,1369],{"class":383},[373,1770,427],{"class":387},[373,1772,1773,1775],{"class":375,"line":509},[373,1774,491],{"class":383},[373,1776,427],{"class":387},[524,1778],{},[815,1780,1782],{"id":1781},"retrycondition",[355,1783,1784],{},"retryCondition",[363,1786,1788],{"className":365,"code":1787,"language":368,"meta":369,"style":369},"final bool Function(Object error, int attemptIndex)? retryCondition\n",[355,1789,1790],{"__ignoreMap":369},[373,1791,1792,1794,1796,1798,1800,1802,1804,1806,1808,1810,1812],{"class":375,"line":376},[373,1793,830],{"class":539},[373,1795,1146],{"class":398},[373,1797,662],{"class":398},[373,1799,665],{"class":383},[373,1801,690],{"class":398},[373,1803,693],{"class":383},[373,1805,421],{"class":387},[373,1807,698],{"class":398},[373,1809,671],{"class":383},[373,1811,610],{"class":387},[373,1813,1814],{"class":383}," retryCondition\n",[352,1816,1817,842,1819,1821,1822,491],{},[839,1818,841],{},[355,1820,1256],{}," (retry all failures up to ",[355,1823,1487],{},[352,1825,1826,1827,1829],{},"Predicate that decides whether a failed fetch should be retried. Receives the error and the zero-based attempt index that just failed. Return ",[355,1828,1162],{}," to skip further retries.",[352,1831,1832],{},"Useful to avoid retrying non-recoverable errors like 4xx HTTP responses:",[363,1834,1836],{"className":365,"code":1835,"filename":873,"language":368,"meta":369,"style":369},"// Only retry network errors, not application errors\nretryCondition: (error, attempt) => error is SocketException,\n\n// Never retry 4xx responses (assuming you map them to a typed exception)\nretryCondition: (error, attempt) => error is! HttpException,\n\n// Retry only the first attempt, fail fast on subsequent failures\nretryCondition: (error, attempt) => attempt == 0,\n",[355,1837,1838,1843,1870,1874,1879,1903,1907,1912],{"__ignoreMap":369},[373,1839,1840],{"class":375,"line":376},[373,1841,1842],{"class":880},"// Only retry network errors, not application errors\n",[373,1844,1845,1847,1849,1852,1854,1857,1859,1862,1865,1868],{"class":375,"line":405},[373,1846,1784],{"class":383},[373,1848,411],{"class":387},[373,1850,1851],{"class":383}," (error",[373,1853,421],{"class":387},[373,1855,1856],{"class":383}," attempt) ",[373,1858,441],{"class":387},[373,1860,1861],{"class":383}," error ",[373,1863,1864],{"class":387},"is",[373,1866,1867],{"class":398}," SocketException",[373,1869,427],{"class":387},[373,1871,1872],{"class":375,"line":430},[373,1873,901],{"emptyLinePlaceholder":900},[373,1875,1876],{"class":375,"line":457},[373,1877,1878],{"class":880},"// Never retry 4xx responses (assuming you map them to a typed exception)\n",[373,1880,1881,1883,1885,1887,1889,1891,1893,1895,1898,1901],{"class":375,"line":471},[373,1882,1784],{"class":383},[373,1884,411],{"class":387},[373,1886,1851],{"class":383},[373,1888,421],{"class":387},[373,1890,1856],{"class":383},[373,1892,441],{"class":387},[373,1894,1861],{"class":383},[373,1896,1897],{"class":387},"is!",[373,1899,1900],{"class":398}," HttpException",[373,1902,427],{"class":387},[373,1904,1905],{"class":375,"line":496},[373,1906,901],{"emptyLinePlaceholder":900},[373,1908,1909],{"class":375,"line":509},[373,1910,1911],{"class":880},"// Retry only the first attempt, fail fast on subsequent failures\n",[373,1913,1914,1916,1918,1920,1922,1924,1926,1929,1932,1934],{"class":375,"line":517},[373,1915,1784],{"class":383},[373,1917,411],{"class":387},[373,1919,1851],{"class":383},[373,1921,421],{"class":387},[373,1923,1856],{"class":383},[373,1925,441],{"class":387},[373,1927,1928],{"class":383}," attempt ",[373,1930,1931],{"class":387},"==",[373,1933,1529],{"class":487},[373,1935,427],{"class":387},[352,1937,1159,1938,1940,1941,1943],{},[355,1939,1784],{}," returns ",[355,1942,1162],{},", all remaining retries for that error are skipped and the error is thrown immediately.",[524,1945],{},[815,1947,1949],{"id":1948},"refetchonwindowfocus",[355,1950,1951],{},"refetchOnWindowFocus",[363,1953,1955],{"className":365,"code":1954,"language":368,"meta":369,"style":369},"final bool refetchOnWindowFocus\n",[355,1956,1957],{"__ignoreMap":369},[373,1958,1959,1961,1963],{"class":375,"line":376},[373,1960,830],{"class":539},[373,1962,1146],{"class":398},[373,1964,1965],{"class":383}," refetchOnWindowFocus\n",[352,1967,1968,842,1970],{},[839,1969,841],{},[355,1971,1156],{},[352,1973,1974,1975,1978],{},"Whether to refetch this query when the app regains window focus. Requires a ",[355,1976,1977],{},"LifecycleManager"," to be registered on the client.",[524,1980],{},[815,1982,1984],{"id":1983},"refetchonreconnect",[355,1985,1986],{},"refetchOnReconnect",[363,1988,1990],{"className":365,"code":1989,"language":368,"meta":369,"style":369},"final bool refetchOnReconnect\n",[355,1991,1992],{"__ignoreMap":369},[373,1993,1994,1996,1998],{"class":375,"line":376},[373,1995,830],{"class":539},[373,1997,1146],{"class":398},[373,1999,2000],{"class":383}," refetchOnReconnect\n",[352,2002,2003,842,2005],{},[839,2004,841],{},[355,2006,1156],{},[352,2008,2009,2010,1978],{},"Whether to refetch this query when the network connection is restored. Requires a ",[355,2011,2012],{},"ConnectivityManager",[524,2014],{},[815,2016,2018],{"id":2017},"refetchinterval",[355,2019,2020],{},"refetchInterval",[363,2022,2024],{"className":365,"code":2023,"language":368,"meta":369,"style":369},"final Duration? refetchInterval\n",[355,2025,2026],{"__ignoreMap":369},[373,2027,2028,2030,2032,2034],{"class":375,"line":376},[373,2029,830],{"class":539},[373,2031,479],{"class":398},[373,2033,610],{"class":387},[373,2035,2036],{"class":383}," refetchInterval\n",[352,2038,2039,842,2041,2043],{},[839,2040,841],{},[355,2042,1256],{}," (disabled)",[352,2045,2046,2047,2049],{},"When set, ",[355,2048,858],{}," automatically refetches at this cadence while at least one subscriber is active. The timer stops when the last subscriber cancels.",[363,2051,2054],{"className":365,"code":2052,"filename":2053,"language":368,"meta":369,"style":369},"// Poll every 30 seconds while the widget is mounted\noptions: QoraOptions(refetchInterval: Duration(seconds: 30)),\n","dashboard_page.dart",[355,2055,2056,2061],{"__ignoreMap":369},[373,2057,2058],{"class":375,"line":376},[373,2059,2060],{"class":880},"// Poll every 30 seconds while the widget is mounted\n",[373,2062,2063,2065,2067,2069,2072,2074,2076,2078,2080,2083,2085],{"class":375,"line":405},[373,2064,1202],{"class":383},[373,2066,411],{"class":387},[373,2068,465],{"class":398},[373,2070,2071],{"class":383},"(refetchInterval",[373,2073,411],{"class":387},[373,2075,479],{"class":398},[373,2077,646],{"class":383},[373,2079,411],{"class":387},[373,2081,2082],{"class":487}," 30",[373,2084,1761],{"class":383},[373,2086,427],{"class":387},[524,2088],{},[815,2090,2092],{"id":2091},"refetchonmount",[355,2093,2094],{},"refetchOnMount",[363,2096,2098],{"className":365,"code":2097,"language":368,"meta":369,"style":369},"final bool? refetchOnMount\n",[355,2099,2100],{"__ignoreMap":369},[373,2101,2102,2104,2106,2108],{"class":375,"line":376},[373,2103,830],{"class":539},[373,2105,1146],{"class":398},[373,2107,610],{"class":387},[373,2109,2110],{"class":383}," refetchOnMount\n",[352,2112,2113,842,2115,2117,2118,491],{},[839,2114,841],{},[355,2116,1256],{}," (falls back to ",[355,2119,2120],{},"QoraClientConfig.refetchOnMount",[352,2122,2123,2124,2126],{},"Controls whether ",[355,2125,858],{}," triggers a fetch on the first subscription:",[955,2128,2129,2139],{},[958,2130,2131],{},[961,2132,2133,2136],{},[964,2134,2135],{},"Value",[964,2137,2138],{},"Behaviour",[971,2140,2141,2150,2159],{},[961,2142,2143,2147],{},[976,2144,2145],{},[355,2146,1156],{},[976,2148,2149],{},"Always refetch on mount, even if data is fresh",[961,2151,2152,2156],{},[976,2153,2154],{},[355,2155,1162],{},[976,2157,2158],{},"Only fetch if data is missing; skip if cached",[961,2160,2161,2165],{},[976,2162,2163],{},[355,2164,1256],{},[976,2166,2167,2168,2170,2171,491],{},"Use ",[355,2169,2120],{}," (default: ",[355,2172,1156],{},[524,2174],{},[815,2176,2178],{"id":2177},"networkmode",[355,2179,2180],{},"networkMode",[363,2182,2184],{"className":365,"code":2183,"language":368,"meta":369,"style":369},"final NetworkMode networkMode\n",[355,2185,2186],{"__ignoreMap":369},[373,2187,2188,2190,2192],{"class":375,"line":376},[373,2189,830],{"class":539},[373,2191,769],{"class":398},[373,2193,2194],{"class":383}," networkMode\n",[352,2196,2197,842,2199],{},[839,2198,841],{},[355,2200,2201],{},"NetworkMode.online",[352,2203,2204],{},"Controls how this query behaves when the device has no connectivity:",[955,2206,2207,2215],{},[958,2208,2209],{},[961,2210,2211,2213],{},[964,2212,2135],{},[964,2214,2138],{},[971,2216,2217,2234,2248],{},[961,2218,2219,2223],{},[976,2220,2221],{},[355,2222,2201],{},[976,2224,2225,2226,2229,2230,2233],{},"Fetch is ",[839,2227,2228],{},"paused"," while offline (",[355,2231,2232],{},"FetchStatus.paused","). Replayed automatically on reconnect.",[961,2235,2236,2241],{},[976,2237,2238],{},[355,2239,2240],{},"NetworkMode.always",[976,2242,2243,2244,2247],{},"Fetch ",[839,2245,2246],{},"always runs"," regardless of connectivity. Use for local-database or in-memory fetchers.",[961,2249,2250,2255],{},[976,2251,2252],{},[355,2253,2254],{},"NetworkMode.offlineFirst",[976,2256,2257],{},"Cached data is returned immediately. A background revalidation is queued for when online.",[363,2259,2262],{"className":365,"code":2260,"filename":2261,"language":368,"meta":369,"style":369},"// Default: pause while offline, replay on reconnect\noptions: const QoraOptions(networkMode: NetworkMode.online),\n\n// Local DB query: always execute, never pause\noptions: const QoraOptions(networkMode: NetworkMode.always),\n\n// Serve cache immediately, refresh in background when online\noptions: const QoraOptions(networkMode: NetworkMode.offlineFirst),\n","lib/data/user_repository.dart",[355,2263,2264,2269,2293,2297,2302,2325,2329,2334],{"__ignoreMap":369},[373,2265,2266],{"class":375,"line":376},[373,2267,2268],{"class":880},"// Default: pause while offline, replay on reconnect\n",[373,2270,2271,2273,2275,2277,2279,2282,2284,2286,2288,2291],{"class":375,"line":405},[373,2272,1202],{"class":383},[373,2274,411],{"class":387},[373,2276,577],{"class":539},[373,2278,465],{"class":398},[373,2280,2281],{"class":383},"(networkMode",[373,2283,411],{"class":387},[373,2285,769],{"class":398},[373,2287,388],{"class":387},[373,2289,2290],{"class":383},"online)",[373,2292,427],{"class":387},[373,2294,2295],{"class":375,"line":430},[373,2296,901],{"emptyLinePlaceholder":900},[373,2298,2299],{"class":375,"line":457},[373,2300,2301],{"class":880},"// Local DB query: always execute, never pause\n",[373,2303,2304,2306,2308,2310,2312,2314,2316,2318,2320,2323],{"class":375,"line":471},[373,2305,1202],{"class":383},[373,2307,411],{"class":387},[373,2309,577],{"class":539},[373,2311,465],{"class":398},[373,2313,2281],{"class":383},[373,2315,411],{"class":387},[373,2317,769],{"class":398},[373,2319,388],{"class":387},[373,2321,2322],{"class":383},"always)",[373,2324,427],{"class":387},[373,2326,2327],{"class":375,"line":496},[373,2328,901],{"emptyLinePlaceholder":900},[373,2330,2331],{"class":375,"line":509},[373,2332,2333],{"class":880},"// Serve cache immediately, refresh in background when online\n",[373,2335,2336,2338,2340,2342,2344,2346,2348,2350,2352,2355],{"class":375,"line":517},[373,2337,1202],{"class":383},[373,2339,411],{"class":387},[373,2341,577],{"class":539},[373,2343,465],{"class":398},[373,2345,2281],{"class":383},[373,2347,411],{"class":387},[373,2349,769],{"class":398},[373,2351,388],{"class":387},[373,2353,2354],{"class":383},"offlineFirst)",[373,2356,427],{"class":387},[1117,2358,2359,2360,2362],{},"Set ",[355,2361,2240],{}," for queries backed by SQLite, Hive, or any local store: they do not need connectivity and should never be paused.",[524,2364],{},[815,2366,2368],{"id":2367},"structuralsharing",[355,2369,2370],{},"structuralSharing",[363,2372,2374],{"className":365,"code":2373,"language":368,"meta":369,"style":369},"final bool structuralSharing\n",[355,2375,2376],{"__ignoreMap":369},[373,2377,2378,2380,2382],{"class":375,"line":376},[373,2379,830],{"class":539},[373,2381,1146],{"class":398},[373,2383,2384],{"class":383}," structuralSharing\n",[352,2386,2387,842,2389],{},[839,2388,841],{},[355,2390,1156],{},[352,2392,2393],{},"Preserves referential equality for unchanged nested data across fetches. When enabled, every successful fetch compares the new data against the existing cache using deep equality. If the data is structurally unchanged, the previous data reference is retained.",[352,2395,2396,2397,2400,2401,2403],{},"This prevents unnecessary widget rebuilds: widgets that compare with ",[355,2398,2399],{},"identical()"," or ",[355,2402,1931],{}," can skip re-rendering when the data hasn't actually changed.",[352,2405,2406,2407,2410,2411,2414,2415,2418,2419,855,2421,2424],{},"The comparison is recursive for ",[355,2408,2409],{},"Map",", ",[355,2412,2413],{},"List",", and ",[355,2416,2417],{},"Set",". Custom model classes should override ",[355,2420,1931],{},[355,2422,2423],{},"hashCode"," for reliable detection.",[352,2426,2427],{},"Disable this only if you have very large data structures and the deep-equality check becomes a measured bottleneck:",[363,2429,2431],{"className":365,"code":2430,"filename":873,"language":368,"meta":369,"style":369},"// Enabled (default): preserve references when data has not changed\nQoraOptions(structuralSharing: true),\n\n// Disabled: always create new references on every fetch\nQoraOptions(structuralSharing: false),\n",[355,2432,2433,2438,2454,2458,2463],{"__ignoreMap":369},[373,2434,2435],{"class":375,"line":376},[373,2436,2437],{"class":880},"// Enabled (default): preserve references when data has not changed\n",[373,2439,2440,2442,2445,2447,2450,2452],{"class":375,"line":405},[373,2441,215],{"class":398},[373,2443,2444],{"class":383},"(structuralSharing",[373,2446,411],{"class":387},[373,2448,2449],{"class":387}," true",[373,2451,491],{"class":383},[373,2453,427],{"class":387},[373,2455,2456],{"class":375,"line":430},[373,2457,901],{"emptyLinePlaceholder":900},[373,2459,2460],{"class":375,"line":457},[373,2461,2462],{"class":880},"// Disabled: always create new references on every fetch\n",[373,2464,2465,2467,2469,2471,2474,2476],{"class":375,"line":471},[373,2466,215],{"class":398},[373,2468,2444],{"class":383},[373,2470,411],{"class":387},[373,2472,2473],{"class":387}," false",[373,2475,491],{"class":383},[373,2477,427],{"class":387},[524,2479],{},[815,2481,2483],{"id":2482},"keeppreviousdata",[355,2484,2485],{},"keepPreviousData",[363,2487,2489],{"className":365,"code":2488,"language":368,"meta":369,"style":369},"final bool keepPreviousData\n",[355,2490,2491],{"__ignoreMap":369},[373,2492,2493,2495,2497],{"class":375,"line":376},[373,2494,830],{"class":539},[373,2496,1146],{"class":398},[373,2498,2499],{"class":383}," keepPreviousData\n",[352,2501,2502,842,2504],{},[839,2503,841],{},[355,2505,1162],{},[352,2507,1159,2508,2510,2511,2514,2515,2517],{},[355,2509,1156],{},", the previous data stays visible while the next fetch is in progress, suppressing the ",[355,2512,2513],{},"Success → Loading → Success"," transition. The entry stays in ",[355,2516,1262],{}," state during the fetch and on fetch failure, so the UI never flashes a loading spinner.",[352,2519,1183,2520,2523],{},[839,2521,2522],{},"offset-based pagination",": keep the current page visible while fetching the next one.",[363,2525,2528],{"className":365,"code":2526,"filename":2527,"language":368,"meta":369,"style":369},"// Page changes without a loading flash\nfetchQuery\u003CList\u003CPost>>(\n  key: ['posts', 'page', page],\n  fetcher: () => api.getPosts(page: page, limit: 20),\n  options: QoraOptions(\n    keepPreviousData: true,\n    staleTime: Duration.zero,\n  ),\n);\n","post_list.dart",[355,2529,2530,2535,2551,2574,2613,2623,2632,2646,2652],{"__ignoreMap":369},[373,2531,2532],{"class":375,"line":376},[373,2533,2534],{"class":880},"// Page changes without a loading flash\n",[373,2536,2537,2539,2541,2543,2545,2548],{"class":375,"line":405},[373,2538,392],{"class":391},[373,2540,395],{"class":383},[373,2542,2413],{"class":398},[373,2544,395],{"class":383},[373,2546,2547],{"class":398},"Post",[373,2549,2550],{"class":383},">>(\n",[373,2552,2553,2555,2557,2559,2562,2564,2567,2569,2572],{"class":375,"line":430},[373,2554,408],{"class":383},[373,2556,411],{"class":387},[373,2558,414],{"class":383},[373,2560,2561],{"class":417},"'posts'",[373,2563,421],{"class":387},[373,2565,2566],{"class":417}," 'page'",[373,2568,421],{"class":387},[373,2570,2571],{"class":383}," page]",[373,2573,427],{"class":387},[373,2575,2576,2578,2580,2582,2584,2586,2588,2591,2594,2596,2599,2601,2604,2606,2609,2611],{"class":375,"line":457},[373,2577,433],{"class":383},[373,2579,411],{"class":387},[373,2581,438],{"class":383},[373,2583,441],{"class":387},[373,2585,444],{"class":383},[373,2587,388],{"class":387},[373,2589,2590],{"class":391},"getPosts",[373,2592,2593],{"class":383},"(page",[373,2595,411],{"class":387},[373,2597,2598],{"class":383}," page",[373,2600,421],{"class":387},[373,2602,2603],{"class":383}," limit",[373,2605,411],{"class":387},[373,2607,2608],{"class":487}," 20",[373,2610,491],{"class":383},[373,2612,427],{"class":387},[373,2614,2615,2617,2619,2621],{"class":375,"line":471},[373,2616,460],{"class":383},[373,2618,411],{"class":387},[373,2620,465],{"class":398},[373,2622,468],{"class":383},[373,2624,2625,2628,2630],{"class":375,"line":496},[373,2626,2627],{"class":383},"    keepPreviousData",[373,2629,411],{"class":387},[373,2631,602],{"class":387},[373,2633,2634,2636,2638,2640,2642,2644],{"class":375,"line":509},[373,2635,474],{"class":383},[373,2637,411],{"class":387},[373,2639,479],{"class":398},[373,2641,388],{"class":387},[373,2643,563],{"class":383},[373,2645,427],{"class":387},[373,2647,2648,2650],{"class":375,"line":517},[373,2649,512],{"class":383},[373,2651,427],{"class":387},[373,2653,2654,2656],{"class":375,"line":681},[373,2655,491],{"class":383},[373,2657,522],{"class":387},[352,2659,2660],{},"Has no effect on the initial fetch (no previous data to keep).",[524,2662],{},[815,2664,2666],{"id":2665},"transform",[355,2667,2665],{},[363,2669,2671],{"className":365,"code":2670,"language":368,"meta":369,"style":369},"final Object Function(Object? data)? transform\n",[355,2672,2673],{"__ignoreMap":369},[373,2674,2675,2677,2679,2681,2683,2685,2687,2689,2691],{"class":375,"line":376},[373,2676,830],{"class":539},[373,2678,1244],{"class":398},[373,2680,662],{"class":398},[373,2682,665],{"class":383},[373,2684,690],{"class":398},[373,2686,610],{"class":387},[373,2688,794],{"class":383},[373,2690,610],{"class":387},[373,2692,2693],{"class":383}," transform\n",[352,2695,2696,842,2698],{},[839,2697,841],{},[355,2699,1256],{},[352,2701,2702,2703,2706,2707,2709],{},"Transform function applied to successful fetch data ",[839,2704,2705],{},"before"," it enters the cache. Use this to decouple data transformation from the fetcher: the fetcher returns raw data (e.g. JSON-decoded maps) and ",[355,2708,2665],{}," converts it into the final model.",[352,2711,2712],{},"The transform runs before structural sharing, so changes to the transformed data are correctly detected against the cached entry.",[363,2714,2716],{"className":365,"code":2715,"filename":367,"language":368,"meta":369,"style":369},"// Fetcher returns raw JSON; transform converts it to a model class.\nfetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),             // returns Map\u003CString, dynamic>\n  options: QoraOptions(\n    transform: (raw) => User.fromJson(raw as Map\u003CString, dynamic>),\n  ),\n);\n",[355,2717,2718,2723,2733,2749,2772,2782,2826,2832],{"__ignoreMap":369},[373,2719,2720],{"class":375,"line":376},[373,2721,2722],{"class":880},"// Fetcher returns raw JSON; transform converts it to a model class.\n",[373,2724,2725,2727,2729,2731],{"class":375,"line":405},[373,2726,392],{"class":391},[373,2728,395],{"class":383},[373,2730,399],{"class":398},[373,2732,402],{"class":383},[373,2734,2735,2737,2739,2741,2743,2745,2747],{"class":375,"line":430},[373,2736,408],{"class":383},[373,2738,411],{"class":387},[373,2740,414],{"class":383},[373,2742,418],{"class":417},[373,2744,421],{"class":387},[373,2746,424],{"class":383},[373,2748,427],{"class":387},[373,2750,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769],{"class":375,"line":457},[373,2752,433],{"class":383},[373,2754,411],{"class":387},[373,2756,438],{"class":383},[373,2758,441],{"class":387},[373,2760,444],{"class":383},[373,2762,388],{"class":387},[373,2764,449],{"class":391},[373,2766,452],{"class":383},[373,2768,421],{"class":387},[373,2770,2771],{"class":880},"             // returns Map\u003CString, dynamic>\n",[373,2773,2774,2776,2778,2780],{"class":375,"line":471},[373,2775,460],{"class":383},[373,2777,411],{"class":387},[373,2779,465],{"class":398},[373,2781,468],{"class":383},[373,2783,2784,2787,2789,2792,2794,2797,2799,2802,2805,2808,2811,2813,2816,2818,2821,2824],{"class":375,"line":496},[373,2785,2786],{"class":383},"    transform",[373,2788,411],{"class":387},[373,2790,2791],{"class":383}," (raw) ",[373,2793,441],{"class":387},[373,2795,2796],{"class":398}," User",[373,2798,388],{"class":387},[373,2800,2801],{"class":391},"fromJson",[373,2803,2804],{"class":383},"(raw ",[373,2806,2807],{"class":387},"as",[373,2809,2810],{"class":398}," Map",[373,2812,395],{"class":383},[373,2814,2815],{"class":398},"String",[373,2817,2410],{"class":383},[373,2819,2820],{"class":398},"dynamic",[373,2822,2823],{"class":383},">)",[373,2825,427],{"class":387},[373,2827,2828,2830],{"class":375,"line":509},[373,2829,512],{"class":383},[373,2831,427],{"class":387},[373,2833,2834,2836],{"class":375,"line":517},[373,2835,491],{"class":383},[373,2837,522],{"class":387},[352,2839,2840],{},"Both the fetcher and the transform are independently testable: the fetcher returns raw data, the transform is a pure function.",[524,2842],{},[815,2844,2846],{"id":2845},"transformerror",[355,2847,2848],{},"transformError",[363,2850,2852],{"className":365,"code":2851,"language":368,"meta":369,"style":369},"final Object Function(Object error)? transformError\n",[355,2853,2854],{"__ignoreMap":369},[373,2855,2856,2858,2860,2862,2864,2866,2869,2871],{"class":375,"line":376},[373,2857,830],{"class":539},[373,2859,1244],{"class":398},[373,2861,662],{"class":398},[373,2863,665],{"class":383},[373,2865,690],{"class":398},[373,2867,2868],{"class":383}," error)",[373,2870,610],{"class":387},[373,2872,2873],{"class":383}," transformError\n",[352,2875,2876,842,2878],{},[839,2877,841],{},[355,2879,1256],{},[352,2881,2882],{},"Transform function applied to fetch errors before they enter the cache. Receives the raw error thrown by the fetcher (after all retries). Use it to normalise errors across your API layer or to enrich them with domain context.",[352,2884,2885,2886,842,2888,2892],{},"Runs ",[839,2887,2705],{},[1475,2889,2891],{"href":2890},"../api-reference/qora-client#config","QoraClientConfig.errorMapper",", so the per-query transform takes precedence for specific queries before the global mapper.",[363,2894,2897],{"className":365,"code":2895,"filename":2896,"language":368,"meta":369,"style":369},"fetchQuery\u003CPost>(\n  key: ['post', postId],\n  fetcher: () => api.getPost(postId),\n  options: QoraOptions(\n    transformError: (error) => switch (error) {\n      DioException(e: final err) => AppError.fromDio(err),\n      _ => AppError.unknown(error.toString()),\n    },\n  ),\n);\n","post_repository.dart",[355,2898,2899,2909,2927,2949,2959,2977,3008,3035,3042,3048],{"__ignoreMap":369},[373,2900,2901,2903,2905,2907],{"class":375,"line":376},[373,2902,392],{"class":391},[373,2904,395],{"class":383},[373,2906,2547],{"class":398},[373,2908,402],{"class":383},[373,2910,2911,2913,2915,2917,2920,2922,2925],{"class":375,"line":405},[373,2912,408],{"class":383},[373,2914,411],{"class":387},[373,2916,414],{"class":383},[373,2918,2919],{"class":417},"'post'",[373,2921,421],{"class":387},[373,2923,2924],{"class":383}," postId]",[373,2926,427],{"class":387},[373,2928,2929,2931,2933,2935,2937,2939,2941,2944,2947],{"class":375,"line":430},[373,2930,433],{"class":383},[373,2932,411],{"class":387},[373,2934,438],{"class":383},[373,2936,441],{"class":387},[373,2938,444],{"class":383},[373,2940,388],{"class":387},[373,2942,2943],{"class":391},"getPost",[373,2945,2946],{"class":383},"(postId)",[373,2948,427],{"class":387},[373,2950,2951,2953,2955,2957],{"class":375,"line":457},[373,2952,460],{"class":383},[373,2954,411],{"class":387},[373,2956,465],{"class":398},[373,2958,468],{"class":383},[373,2960,2961,2964,2966,2969,2971,2974],{"class":375,"line":471},[373,2962,2963],{"class":383},"    transformError",[373,2965,411],{"class":387},[373,2967,2968],{"class":383}," (error) ",[373,2970,441],{"class":387},[373,2972,2973],{"class":379}," switch",[373,2975,2976],{"class":383}," (error) {\n",[373,2978,2979,2982,2985,2987,2990,2993,2995,2998,3000,3003,3006],{"class":375,"line":496},[373,2980,2981],{"class":398},"      DioException",[373,2983,2984],{"class":383},"(e",[373,2986,411],{"class":387},[373,2988,2989],{"class":539}," final",[373,2991,2992],{"class":383}," err) ",[373,2994,441],{"class":387},[373,2996,2997],{"class":398}," AppError",[373,2999,388],{"class":387},[373,3001,3002],{"class":391},"fromDio",[373,3004,3005],{"class":383},"(err)",[373,3007,427],{"class":387},[373,3009,3010,3013,3015,3017,3019,3022,3025,3027,3030,3033],{"class":375,"line":509},[373,3011,3012],{"class":383},"      _ ",[373,3014,441],{"class":387},[373,3016,2997],{"class":398},[373,3018,388],{"class":387},[373,3020,3021],{"class":391},"unknown",[373,3023,3024],{"class":383},"(error",[373,3026,388],{"class":387},[373,3028,3029],{"class":391},"toString",[373,3031,3032],{"class":383},"())",[373,3034,427],{"class":387},[373,3036,3037,3040],{"class":375,"line":517},[373,3038,3039],{"class":383},"    }",[373,3041,427],{"class":387},[373,3043,3044,3046],{"class":375,"line":681},[373,3045,512],{"class":383},[373,3047,427],{"class":387},[373,3049,3050,3052],{"class":375,"line":710},[373,3051,491],{"class":383},[373,3053,522],{"class":387},[524,3055],{},[815,3057,3059],{"id":3058},"providestags",[355,3060,3061],{},"providesTags",[363,3063,3065],{"className":365,"code":3064,"language":368,"meta":369,"style":369},"final List\u003CQueryTag>? providesTags\n",[355,3066,3067],{"__ignoreMap":369},[373,3068,3069,3071,3074,3076,3079,3082,3084],{"class":375,"line":376},[373,3070,830],{"class":539},[373,3072,3073],{"class":398}," List",[373,3075,395],{"class":383},[373,3077,3078],{"class":398},"QueryTag",[373,3080,3081],{"class":383},">",[373,3083,610],{"class":387},[373,3085,3086],{"class":383}," providesTags\n",[352,3088,3089,842,3091],{},[839,3090,841],{},[355,3092,1256],{},[352,3094,3095,3096,3099],{},"Tags that this query provides for tag-based cache invalidation. When a mutation invalidates a matching tag (via ",[355,3097,3098],{},"MutationOptions.invalidatesTags","), all queries that provide that tag are automatically refetched, regardless of their query key.",[352,3101,3102],{},"This decouples invalidation logic from query-key structure, making it easier to invalidate related queries across different key patterns:",[363,3104,3106],{"className":365,"code":3105,"filename":2896,"language":368,"meta":369,"style":369},"// Query provides tags\nwatchQuery\u003CPost>(\n  key: ['post', postId],\n  fetcher: () => api.getPost(postId),\n  options: QoraOptions(\n    providesTags: [\n      QueryTag('post', postId.toString()),\n      QueryTag('author', authorId.toString()),\n    ],\n  ),\n);\n",[355,3107,3108,3113,3123,3139,3159,3169,3179,3201,3223,3230,3236],{"__ignoreMap":369},[373,3109,3110],{"class":375,"line":376},[373,3111,3112],{"class":880},"// Query provides tags\n",[373,3114,3115,3117,3119,3121],{"class":375,"line":405},[373,3116,858],{"class":391},[373,3118,395],{"class":383},[373,3120,2547],{"class":398},[373,3122,402],{"class":383},[373,3124,3125,3127,3129,3131,3133,3135,3137],{"class":375,"line":430},[373,3126,408],{"class":383},[373,3128,411],{"class":387},[373,3130,414],{"class":383},[373,3132,2919],{"class":417},[373,3134,421],{"class":387},[373,3136,2924],{"class":383},[373,3138,427],{"class":387},[373,3140,3141,3143,3145,3147,3149,3151,3153,3155,3157],{"class":375,"line":457},[373,3142,433],{"class":383},[373,3144,411],{"class":387},[373,3146,438],{"class":383},[373,3148,441],{"class":387},[373,3150,444],{"class":383},[373,3152,388],{"class":387},[373,3154,2943],{"class":391},[373,3156,2946],{"class":383},[373,3158,427],{"class":387},[373,3160,3161,3163,3165,3167],{"class":375,"line":471},[373,3162,460],{"class":383},[373,3164,411],{"class":387},[373,3166,465],{"class":398},[373,3168,468],{"class":383},[373,3170,3171,3174,3176],{"class":375,"line":496},[373,3172,3173],{"class":383},"    providesTags",[373,3175,411],{"class":387},[373,3177,3178],{"class":383}," [\n",[373,3180,3181,3184,3186,3188,3190,3193,3195,3197,3199],{"class":375,"line":509},[373,3182,3183],{"class":398},"      QueryTag",[373,3185,665],{"class":383},[373,3187,2919],{"class":417},[373,3189,421],{"class":387},[373,3191,3192],{"class":383}," postId",[373,3194,388],{"class":387},[373,3196,3029],{"class":391},[373,3198,3032],{"class":383},[373,3200,427],{"class":387},[373,3202,3203,3205,3207,3210,3212,3215,3217,3219,3221],{"class":375,"line":517},[373,3204,3183],{"class":398},[373,3206,665],{"class":383},[373,3208,3209],{"class":417},"'author'",[373,3211,421],{"class":387},[373,3213,3214],{"class":383}," authorId",[373,3216,388],{"class":387},[373,3218,3029],{"class":391},[373,3220,3032],{"class":383},[373,3222,427],{"class":387},[373,3224,3225,3228],{"class":375,"line":681},[373,3226,3227],{"class":383},"    ]",[373,3229,427],{"class":387},[373,3231,3232,3234],{"class":375,"line":710},[373,3233,512],{"class":383},[373,3235,427],{"class":387},[373,3237,3238,3240],{"class":375,"line":722},[373,3239,491],{"class":383},[373,3241,522],{"class":387},[3243,3244,3246],"h4",{"id":3245},"wildcard-matching","Wildcard matching",[352,3248,3249,3250,3253,3254,3256,3257,3260,3261,3264],{},"Invalidating ",[355,3251,3252],{},"QueryTag('post')"," (no id) refetches ALL queries that provide any tag of type ",[355,3255,2919],{}," regardless of their individual ids. Invalidating ",[355,3258,3259],{},"QueryTag('post', '123')"," only refetches queries that provide the specific ",[355,3262,3263],{},"'post:123'"," tag.",[363,3266,3268],{"className":365,"code":3267,"language":368,"meta":369,"style":369},"// Refetch ALL queries tagged with 'post' (any id).\nclient.invalidateTags([QueryTag('post')]);\n\n// Refetch only queries tagged with 'post:123'.\nclient.invalidateTags([QueryTag('post', '123')]);\n",[355,3269,3270,3275,3298,3302,3307],{"__ignoreMap":369},[373,3271,3272],{"class":375,"line":376},[373,3273,3274],{"class":880},"// Refetch ALL queries tagged with 'post' (any id).\n",[373,3276,3277,3279,3281,3284,3287,3289,3291,3293,3296],{"class":375,"line":405},[373,3278,1322],{"class":383},[373,3280,388],{"class":387},[373,3282,3283],{"class":391},"invalidateTags",[373,3285,3286],{"class":383},"([",[373,3288,3078],{"class":398},[373,3290,665],{"class":383},[373,3292,2919],{"class":417},[373,3294,3295],{"class":383},")])",[373,3297,522],{"class":387},[373,3299,3300],{"class":375,"line":430},[373,3301,901],{"emptyLinePlaceholder":900},[373,3303,3304],{"class":375,"line":457},[373,3305,3306],{"class":880},"// Refetch only queries tagged with 'post:123'.\n",[373,3308,3309,3311,3313,3315,3317,3319,3321,3323,3325,3328,3330],{"class":375,"line":471},[373,3310,1322],{"class":383},[373,3312,388],{"class":387},[373,3314,3283],{"class":391},[373,3316,3286],{"class":383},[373,3318,3078],{"class":398},[373,3320,665],{"class":383},[373,3322,2919],{"class":417},[373,3324,421],{"class":387},[373,3326,3327],{"class":417}," '123'",[373,3329,3295],{"class":383},[373,3331,522],{"class":387},[524,3333],{},[815,3335,3337],{"id":3336},"tojson",[355,3338,3339],{},"toJson",[363,3341,3343],{"className":365,"code":3342,"language":368,"meta":369,"style":369},"final Object? Function(Object? data)? toJson\n",[355,3344,3345],{"__ignoreMap":369},[373,3346,3347,3349,3351,3353,3355,3357,3359,3361,3363,3365],{"class":375,"line":376},[373,3348,830],{"class":539},[373,3350,1244],{"class":398},[373,3352,610],{"class":387},[373,3354,662],{"class":398},[373,3356,665],{"class":383},[373,3358,690],{"class":398},[373,3360,610],{"class":387},[373,3362,794],{"class":383},[373,3364,610],{"class":387},[373,3366,3367],{"class":383}," toJson\n",[352,3369,3370,842,3372],{},[839,3371,841],{},[355,3373,1256],{},[352,3375,3376],{},"Optional serializer that controls how query data is displayed in the DevTools overlay.",[352,3378,3379],{},"When omitted, Qora applies the following resolution order automatically:",[3381,3382,3383,3402,3416],"ol",{},[1167,3384,3385,3386,2410,3388,2410,3390,2410,3392,2410,3395,3398,3399,3401],{},"Data that is already ",[355,3387,2409],{},[355,3389,2413],{},[355,3391,2815],{},[355,3393,3394],{},"num",[355,3396,3397],{},"bool",", or ",[355,3400,1256],{},": passed through as-is.",[1167,3403,3404,3405,3408,3409,2410,3412,3415],{},"Any object with a ",[355,3406,3407],{},"toJson()"," method (",[355,3410,3411],{},"json_serializable",[355,3413,3414],{},"freezed",", manual): called dynamically.",[1167,3417,3418,3419,3422],{},"Everything else: ",[355,3420,3421],{},".toString()"," fallback.",[352,3424,3425,3426,3428,3429,3431],{},"Provide ",[355,3427,3339],{}," explicitly only when the automatic detection is insufficient, for example when your ",[355,3430,3407],{}," method has a non-standard signature or returns a non-encodable type.",[363,3433,3435],{"className":365,"code":3434,"filename":367,"language":368,"meta":369,"style":369},"// Explicit serializer (overrides auto-detection)\nfetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: QoraOptions(\n    toJson: (data) => (data as User).toJson(),\n  ),\n);\n",[355,3436,3437,3442,3452,3468,3488,3498,3527,3533],{"__ignoreMap":369},[373,3438,3439],{"class":375,"line":376},[373,3440,3441],{"class":880},"// Explicit serializer (overrides auto-detection)\n",[373,3443,3444,3446,3448,3450],{"class":375,"line":405},[373,3445,392],{"class":391},[373,3447,395],{"class":383},[373,3449,399],{"class":398},[373,3451,402],{"class":383},[373,3453,3454,3456,3458,3460,3462,3464,3466],{"class":375,"line":430},[373,3455,408],{"class":383},[373,3457,411],{"class":387},[373,3459,414],{"class":383},[373,3461,418],{"class":417},[373,3463,421],{"class":387},[373,3465,424],{"class":383},[373,3467,427],{"class":387},[373,3469,3470,3472,3474,3476,3478,3480,3482,3484,3486],{"class":375,"line":457},[373,3471,433],{"class":383},[373,3473,411],{"class":387},[373,3475,438],{"class":383},[373,3477,441],{"class":387},[373,3479,444],{"class":383},[373,3481,388],{"class":387},[373,3483,449],{"class":391},[373,3485,452],{"class":383},[373,3487,427],{"class":387},[373,3489,3490,3492,3494,3496],{"class":375,"line":471},[373,3491,460],{"class":383},[373,3493,411],{"class":387},[373,3495,465],{"class":398},[373,3497,468],{"class":383},[373,3499,3500,3503,3505,3508,3510,3513,3515,3517,3519,3521,3523,3525],{"class":375,"line":496},[373,3501,3502],{"class":383},"    toJson",[373,3504,411],{"class":387},[373,3506,3507],{"class":383}," (data) ",[373,3509,441],{"class":387},[373,3511,3512],{"class":383}," (data ",[373,3514,2807],{"class":387},[373,3516,2796],{"class":398},[373,3518,491],{"class":383},[373,3520,388],{"class":387},[373,3522,3339],{"class":391},[373,3524,1369],{"class":383},[373,3526,427],{"class":387},[373,3528,3529,3531],{"class":375,"line":509},[373,3530,512],{"class":383},[373,3532,427],{"class":387},[373,3534,3535,3537],{"class":375,"line":517},[373,3536,491],{"class":383},[373,3538,522],{"class":387},[352,3540,3541,3542,3545],{},"→ See ",[1475,3543,3544],{"href":254},"Displaying Query Data in DevTools"," for the full guide.",[524,3547],{},[348,3549,3551],{"id":3550},"getretrydelayint-attemptindex",[355,3552,3553],{},"getRetryDelay(int attemptIndex)",[363,3555,3557],{"className":365,"code":3556,"language":368,"meta":369,"style":369},"Duration getRetryDelay(int attemptIndex)\n",[355,3558,3559],{"__ignoreMap":369},[373,3560,3561,3564,3567,3569,3571],{"class":375,"line":376},[373,3562,3563],{"class":398},"Duration",[373,3565,3566],{"class":391}," getRetryDelay",[373,3568,665],{"class":383},[373,3570,668],{"class":398},[373,3572,3573],{"class":383}," attemptIndex)\n",[352,3575,3576,3577,3579,3580,388],{},"Computes the retry delay for the given zero-based attempt index. Delegates to ",[355,3578,1616],{}," if set, otherwise applies exponential backoff: ",[355,3581,3582],{},"retryDelay × 2^attemptIndex",[524,3584],{},[348,3586,3588],{"id":3587},"mergeqoraoptions-other",[355,3589,3590],{},"merge(QoraOptions? other)",[363,3592,3594],{"className":365,"code":3593,"language":368,"meta":369,"style":369},"QoraOptions merge(QoraOptions? other)\n",[355,3595,3596],{"__ignoreMap":369},[373,3597,3598,3600,3603,3605,3607,3609],{"class":375,"line":376},[373,3599,215],{"class":398},[373,3601,3602],{"class":391}," merge",[373,3604,665],{"class":383},[373,3606,215],{"class":398},[373,3608,610],{"class":387},[373,3610,3611],{"class":383}," other)\n",[352,3613,3614,3615,3617,3618,3621,3622,3625,3626,3628,3629,2410,3631,2410,3633,3635,3636,3638,3639,388],{},"Returns a new ",[355,3616,215],{}," merging ",[355,3619,3620],{},"this"," with ",[355,3623,3624],{},"other",". Fields from ",[355,3627,3624],{}," take priority. Nullable fields (",[355,3630,1616],{},[355,3632,2020],{},[355,3634,2094],{},") fall back to ",[355,3637,3620],{}," when not set in ",[355,3640,3624],{},[352,3642,3643,3644,3646],{},"Used internally by ",[355,3645,202],{}," to combine global defaults with per-query options.",[524,3648],{},[348,3650,3652],{"id":3651},"common-recipes","Common Recipes",[363,3654,3656],{"className":365,"code":3655,"filename":873,"language":368,"meta":369,"style":369},"// Live data: always fresh, poll every 10 s\nQoraOptions(\n  staleTime: Duration.zero,\n  refetchInterval: Duration(seconds: 10),\n)\n\n// Config data: cache aggressively\nQoraOptions(\n  staleTime: Duration(hours: 1),\n  gcTime: Duration(hours: 2),\n  retryCount: 5,\n)\n\n// Conditional query\nQoraOptions(enabled: currentUser != null)\n\n// Disable retries for mutations\nQoraOptions(retryCount: 0)\n",[355,3657,3658,3663,3669,3684,3703,3708,3712,3717,3723,3742,3761,3772,3776,3780,3785,3802,3806,3812],{"__ignoreMap":369},[373,3659,3660],{"class":375,"line":376},[373,3661,3662],{"class":880},"// Live data: always fresh, poll every 10 s\n",[373,3664,3665,3667],{"class":375,"line":405},[373,3666,215],{"class":398},[373,3668,468],{"class":383},[373,3670,3671,3674,3676,3678,3680,3682],{"class":375,"line":430},[373,3672,3673],{"class":383},"  staleTime",[373,3675,411],{"class":387},[373,3677,479],{"class":398},[373,3679,388],{"class":387},[373,3681,563],{"class":383},[373,3683,427],{"class":387},[373,3685,3686,3689,3691,3693,3695,3697,3699,3701],{"class":375,"line":457},[373,3687,3688],{"class":383},"  refetchInterval",[373,3690,411],{"class":387},[373,3692,479],{"class":398},[373,3694,646],{"class":383},[373,3696,411],{"class":387},[373,3698,1088],{"class":487},[373,3700,491],{"class":383},[373,3702,427],{"class":387},[373,3704,3705],{"class":375,"line":471},[373,3706,3707],{"class":383},")\n",[373,3709,3710],{"class":375,"line":496},[373,3711,901],{"emptyLinePlaceholder":900},[373,3713,3714],{"class":375,"line":509},[373,3715,3716],{"class":880},"// Config data: cache aggressively\n",[373,3718,3719,3721],{"class":375,"line":517},[373,3720,215],{"class":398},[373,3722,468],{"class":383},[373,3724,3725,3727,3729,3731,3734,3736,3738,3740],{"class":375,"line":681},[373,3726,3673],{"class":383},[373,3728,411],{"class":387},[373,3730,479],{"class":398},[373,3732,3733],{"class":383},"(hours",[373,3735,411],{"class":387},[373,3737,651],{"class":487},[373,3739,491],{"class":383},[373,3741,427],{"class":387},[373,3743,3744,3747,3749,3751,3753,3755,3757,3759],{"class":375,"line":710},[373,3745,3746],{"class":383},"  gcTime",[373,3748,411],{"class":387},[373,3750,479],{"class":398},[373,3752,3733],{"class":383},[373,3754,411],{"class":387},[373,3756,504],{"class":487},[373,3758,491],{"class":383},[373,3760,427],{"class":387},[373,3762,3763,3766,3768,3770],{"class":375,"line":722},[373,3764,3765],{"class":383},"  retryCount",[373,3767,411],{"class":387},[373,3769,488],{"class":487},[373,3771,427],{"class":387},[373,3773,3774],{"class":375,"line":734},[373,3775,3707],{"class":383},[373,3777,3778],{"class":375,"line":746},[373,3779,901],{"emptyLinePlaceholder":900},[373,3781,3782],{"class":375,"line":758},[373,3783,3784],{"class":880},"// Conditional query\n",[373,3786,3787,3789,3791,3793,3796,3798,3800],{"class":375,"line":779},[373,3788,215],{"class":398},[373,3790,1209],{"class":383},[373,3792,411],{"class":387},[373,3794,3795],{"class":383}," currentUser ",[373,3797,1217],{"class":387},[373,3799,1220],{"class":387},[373,3801,3707],{"class":383},[373,3803,3804],{"class":375,"line":804},[373,3805,901],{"emptyLinePlaceholder":900},[373,3807,3809],{"class":375,"line":3808},17,[373,3810,3811],{"class":880},"// Disable retries for mutations\n",[373,3813,3815,3817,3820,3822,3824],{"class":375,"line":3814},18,[373,3816,215],{"class":398},[373,3818,3819],{"class":383},"(retryCount",[373,3821,411],{"class":387},[373,3823,1529],{"class":487},[373,3825,3707],{"class":383},[3827,3828,3829],"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 .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 .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}",{"title":369,"searchDepth":405,"depth":405,"links":3831},[3832,3833,3834,3855,3856,3857],{"id":350,"depth":405,"text":243},{"id":528,"depth":405,"text":529},{"id":812,"depth":405,"text":813,"children":3835},[3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854],{"id":817,"depth":430,"text":820},{"id":1027,"depth":430,"text":1030},{"id":1132,"depth":430,"text":1132},{"id":1229,"depth":430,"text":1232},{"id":1484,"depth":430,"text":1487},{"id":1552,"depth":430,"text":1555},{"id":1613,"depth":430,"text":1616},{"id":1781,"depth":430,"text":1784},{"id":1948,"depth":430,"text":1951},{"id":1983,"depth":430,"text":1986},{"id":2017,"depth":430,"text":2020},{"id":2091,"depth":430,"text":2094},{"id":2177,"depth":430,"text":2180},{"id":2367,"depth":430,"text":2370},{"id":2482,"depth":430,"text":2485},{"id":2665,"depth":430,"text":2665},{"id":2845,"depth":430,"text":2848},{"id":3058,"depth":430,"text":3061},{"id":3336,"depth":430,"text":3339},{"id":3550,"depth":405,"text":3553},{"id":3587,"depth":405,"text":3590},{"id":3651,"depth":405,"text":3652},"Per-query configuration that overrides QoraClientConfig defaults. Pass to fetchQuery or watchQuery to customise caching, retries, staleness, and polling.","md",null,{},{"icon":218},{"title":215,"description":3858},"QVJtAFXq-h42DxfblH5epCVt5HAqcs1nK5zoC2dav_o",[3866,3868],{"title":211,"path":212,"stem":213,"description":3867,"icon":65,"children":-1},"Sealed class hierarchy representing the four possible states of a query. Exhaustive pattern matching is enforced at compile time.",{"title":220,"path":221,"stem":222,"description":3869,"icon":223,"children":-1},"Global configuration for QoraClient. Applied as the baseline for every query. Per-query QoraOptions are merged on top.",1794040401031]