[{"data":1,"prerenderedAt":2548},["ShallowReactive",2],{"navigation_docs_en":3,"-en-recipes-error-handling":342,"-en-recipes-error-handling-surround":2543},[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":182,"body":344,"description":2536,"extension":2537,"links":2538,"meta":2539,"navigation":2540,"path":183,"seo":2541,"stem":184,"__hash__":2542},"docs_en/en/04.recipes/10.error-handling.md",{"type":345,"value":346,"toc":2521},"minimark",[347,356,359,367,376,512,523,868,870,874,879,939,944,988,993,1068,1072,1096,1098,1102,1109,1180,1183,1389,1396,1494,1496,1500,1509,1688,1690,1694,1716,1804,1810,1812,1816,1823,1957,1959,1963,1969,2310,2312,2316,2327,2357,2468,2470,2474,2517],[348,349,350,351,355],"p",{},"Qora distinguishes between transient errors (retry automatically) and terminal errors (surface to the UI). All fetch failures go through the same pipeline: retry with exponential backoff → transition to ",[352,353,354],"code",{},"Failure"," → notify subscribers.",[357,358],"hr",{},[360,361,363,364,366],"h2",{"id":362},"the-failure-state","The ",[352,365,354],{}," State",[348,368,369,370,372,373,375],{},"When all retries are exhausted, ",[352,371,211],{}," transitions to ",[352,374,354],{},":",[377,378,383],"pre",{"className":379,"code":380,"language":381,"meta":382,"style":382},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sealed class QoraState\u003CT> { ... }\n\nfinal class Failure\u003CT> extends QoraState\u003CT> {\n  final Object error;\n  final StackTrace? stackTrace;\n  final T? previousData; // non-null when data was cached before the failure\n}\n","dart","",[352,384,385,417,424,455,470,486,506],{"__ignoreMap":382},[386,387,390,394,397,401,405,408,411,414],"span",{"class":388,"line":389},"line",1,[386,391,393],{"class":392},"sMK4o","sealed",[386,395,396],{"class":392}," class",[386,398,400],{"class":399},"sBMFI"," QoraState",[386,402,404],{"class":403},"sTEyZ","\u003C",[386,406,407],{"class":399},"T",[386,409,410],{"class":403},"> { ",[386,412,413],{"class":392},"...",[386,415,416],{"class":403}," }\n",[386,418,420],{"class":388,"line":419},2,[386,421,423],{"emptyLinePlaceholder":422},true,"\n",[386,425,427,431,433,436,438,440,443,446,448,450,452],{"class":388,"line":426},3,[386,428,430],{"class":429},"spNyl","final",[386,432,396],{"class":392},[386,434,435],{"class":399}," Failure",[386,437,404],{"class":403},[386,439,407],{"class":399},[386,441,442],{"class":403},"> ",[386,444,445],{"class":392},"extends",[386,447,400],{"class":399},[386,449,404],{"class":403},[386,451,407],{"class":399},[386,453,454],{"class":403},"> {\n",[386,456,458,461,464,467],{"class":388,"line":457},4,[386,459,460],{"class":429},"  final",[386,462,463],{"class":399}," Object",[386,465,466],{"class":403}," error",[386,468,469],{"class":392},";\n",[386,471,473,475,478,481,484],{"class":388,"line":472},5,[386,474,460],{"class":429},[386,476,477],{"class":399}," StackTrace",[386,479,480],{"class":392},"?",[386,482,483],{"class":403}," stackTrace",[386,485,469],{"class":392},[386,487,489,491,494,496,499,502],{"class":388,"line":488},6,[386,490,460],{"class":429},[386,492,493],{"class":399}," T",[386,495,480],{"class":392},[386,497,498],{"class":403}," previousData",[386,500,501],{"class":392},";",[386,503,505],{"class":504},"sHwdD"," // non-null when data was cached before the failure\n",[386,507,509],{"class":388,"line":508},7,[386,510,511],{"class":403},"}\n",[348,513,514,517,518,522],{},[352,515,516],{},"previousData"," carries the last successfully fetched value. This enables ",[519,520,521],"strong",{},"graceful degradation",": show stale data alongside an error indicator rather than replacing the entire view.",[377,524,527],{"className":379,"code":525,"filename":526,"language":381,"meta":382,"style":382},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  builder: (context, state, fetchStatus) => switch (state) {\n    Initial() => const SizedBox.shrink(),\n    Loading(:final previousData) => previousData != null\n        ? Stack(children: [UserCard(previousData), const LoadingOverlay()])\n        : const CircularProgressIndicator(),\n    Success(:final data) => UserCard(data),\n    Failure(:final error, :final previousData) => previousData != null\n        ? Column(children: [\n            UserCard(previousData),\n            ErrorBanner('Failed to refresh: $error'),\n          ])\n        : ErrorScreen('$error'),\n  },\n)\n","user_screen.dart",[352,528,529,541,564,592,621,647,673,704,719,744,775,790,800,826,832,854,862],{"__ignoreMap":382},[386,530,531,533,535,538],{"class":388,"line":389},[386,532,108],{"class":399},[386,534,404],{"class":403},[386,536,537],{"class":399},"User",[386,539,540],{"class":403},">(\n",[386,542,543,546,548,551,555,558,561],{"class":388,"line":419},[386,544,545],{"class":403},"  queryKey",[386,547,375],{"class":392},[386,549,550],{"class":403}," [",[386,552,554],{"class":553},"sfazB","'users'",[386,556,557],{"class":392},",",[386,559,560],{"class":403}," userId]",[386,562,563],{"class":392},",\n",[386,565,566,569,571,574,577,580,583,587,590],{"class":388,"line":426},[386,567,568],{"class":403},"  fetcher",[386,570,375],{"class":392},[386,572,573],{"class":403}," () ",[386,575,576],{"class":392},"=>",[386,578,579],{"class":403}," api",[386,581,582],{"class":392},".",[386,584,586],{"class":585},"s2Zo4","getUser",[386,588,589],{"class":403},"(userId)",[386,591,563],{"class":392},[386,593,594,597,599,602,604,607,609,612,614,618],{"class":388,"line":457},[386,595,596],{"class":403},"  builder",[386,598,375],{"class":392},[386,600,601],{"class":403}," (context",[386,603,557],{"class":392},[386,605,606],{"class":403}," state",[386,608,557],{"class":392},[386,610,611],{"class":403}," fetchStatus) ",[386,613,576],{"class":392},[386,615,617],{"class":616},"s7zQu"," switch",[386,619,620],{"class":403}," (state) {\n",[386,622,623,626,629,631,634,637,639,642,645],{"class":388,"line":472},[386,624,625],{"class":399},"    Initial",[386,627,628],{"class":403},"() ",[386,630,576],{"class":392},[386,632,633],{"class":429}," const",[386,635,636],{"class":399}," SizedBox",[386,638,582],{"class":392},[386,640,641],{"class":585},"shrink",[386,643,644],{"class":403},"()",[386,646,563],{"class":392},[386,648,649,652,655,657,659,662,664,667,670],{"class":388,"line":488},[386,650,651],{"class":399},"    Loading",[386,653,654],{"class":403},"(",[386,656,375],{"class":392},[386,658,430],{"class":429},[386,660,661],{"class":403}," previousData) ",[386,663,576],{"class":392},[386,665,666],{"class":403}," previousData ",[386,668,669],{"class":392},"!=",[386,671,672],{"class":392}," null\n",[386,674,675,678,681,684,686,688,691,694,696,698,701],{"class":388,"line":508},[386,676,677],{"class":392},"        ?",[386,679,680],{"class":399}," Stack",[386,682,683],{"class":403},"(children",[386,685,375],{"class":392},[386,687,550],{"class":403},[386,689,690],{"class":399},"UserCard",[386,692,693],{"class":403},"(previousData)",[386,695,557],{"class":392},[386,697,633],{"class":429},[386,699,700],{"class":399}," LoadingOverlay",[386,702,703],{"class":403},"()])\n",[386,705,707,710,712,715,717],{"class":388,"line":706},8,[386,708,709],{"class":392},"        :",[386,711,633],{"class":429},[386,713,714],{"class":399}," CircularProgressIndicator",[386,716,644],{"class":403},[386,718,563],{"class":392},[386,720,722,725,727,729,731,734,736,739,742],{"class":388,"line":721},9,[386,723,724],{"class":399},"    Success",[386,726,654],{"class":403},[386,728,375],{"class":392},[386,730,430],{"class":429},[386,732,733],{"class":403}," data) ",[386,735,576],{"class":392},[386,737,738],{"class":399}," UserCard",[386,740,741],{"class":403},"(data)",[386,743,563],{"class":392},[386,745,747,750,752,754,756,758,760,763,765,767,769,771,773],{"class":388,"line":746},10,[386,748,749],{"class":399},"    Failure",[386,751,654],{"class":403},[386,753,375],{"class":392},[386,755,430],{"class":429},[386,757,466],{"class":403},[386,759,557],{"class":392},[386,761,762],{"class":392}," :",[386,764,430],{"class":429},[386,766,661],{"class":403},[386,768,576],{"class":392},[386,770,666],{"class":403},[386,772,669],{"class":392},[386,774,672],{"class":392},[386,776,778,780,783,785,787],{"class":388,"line":777},11,[386,779,677],{"class":392},[386,781,782],{"class":399}," Column",[386,784,683],{"class":403},[386,786,375],{"class":392},[386,788,789],{"class":403}," [\n",[386,791,793,796,798],{"class":388,"line":792},12,[386,794,795],{"class":399},"            UserCard",[386,797,693],{"class":403},[386,799,563],{"class":392},[386,801,803,806,808,811,814,818,821,824],{"class":388,"line":802},13,[386,804,805],{"class":399},"            ErrorBanner",[386,807,654],{"class":403},[386,809,810],{"class":553},"'Failed to refresh: ",[386,812,813],{"class":403},"$",[386,815,817],{"class":816},"sHdIc","error",[386,819,820],{"class":553},"'",[386,822,823],{"class":403},")",[386,825,563],{"class":392},[386,827,829],{"class":388,"line":828},14,[386,830,831],{"class":403},"          ])\n",[386,833,835,837,840,842,844,846,848,850,852],{"class":388,"line":834},15,[386,836,709],{"class":392},[386,838,839],{"class":399}," ErrorScreen",[386,841,654],{"class":403},[386,843,820],{"class":553},[386,845,813],{"class":403},[386,847,817],{"class":816},[386,849,820],{"class":553},[386,851,823],{"class":403},[386,853,563],{"class":392},[386,855,857,860],{"class":388,"line":856},16,[386,858,859],{"class":403},"  }",[386,861,563],{"class":392},[386,863,865],{"class":388,"line":864},17,[386,866,867],{"class":403},")\n",[357,869],{},[360,871,873],{"id":872},"retry-configuration","Retry Configuration",[348,875,876,877,375],{},"Qora retries failed fetches automatically with exponential backoff. Control this per query via ",[352,878,215],{},[377,880,883],{"className":379,"code":881,"filename":882,"language":381,"meta":382,"style":382},"QoraOptions(\n  retryCount: 3,                              // Default: 3: set 0 to disable\n  retryDelay: const Duration(seconds: 1),     // Base delay; doubles each attempt\n)\n","main.dart",[352,884,885,892,908,935],{"__ignoreMap":382},[386,886,887,889],{"class":388,"line":389},[386,888,215],{"class":399},[386,890,891],{"class":403},"(\n",[386,893,894,897,899,903,905],{"class":388,"line":419},[386,895,896],{"class":403},"  retryCount",[386,898,375],{"class":392},[386,900,902],{"class":901},"sbssI"," 3",[386,904,557],{"class":392},[386,906,907],{"class":504},"                              // Default: 3: set 0 to disable\n",[386,909,910,913,915,917,920,923,925,928,930,932],{"class":388,"line":426},[386,911,912],{"class":403},"  retryDelay",[386,914,375],{"class":392},[386,916,633],{"class":429},[386,918,919],{"class":399}," Duration",[386,921,922],{"class":403},"(seconds",[386,924,375],{"class":392},[386,926,927],{"class":901}," 1",[386,929,823],{"class":403},[386,931,557],{"class":392},[386,933,934],{"class":504},"     // Base delay; doubles each attempt\n",[386,936,937],{"class":388,"line":457},[386,938,867],{"class":403},[348,940,941],{},[519,942,943],{},"Default backoff schedule:",[945,946,947,960],"table",{},[948,949,950],"thead",{},[951,952,953,957],"tr",{},[954,955,956],"th",{},"Attempt",[954,958,959],{},"Delay",[961,962,963,972,980],"tbody",{},[951,964,965,969],{},[966,967,968],"td",{},"1",[966,970,971],{},"1 s",[951,973,974,977],{},[966,975,976],{},"2",[966,978,979],{},"2 s",[951,981,982,985],{},[966,983,984],{},"3",[966,986,987],{},"4 s",[989,990,992],"h3",{"id":991},"custom-delay","Custom Delay",[377,994,996],{"className":379,"code":995,"filename":882,"language":381,"meta":382,"style":382},"QoraOptions(\n  retryDelayCalculator: (attempt) => Duration(\n    milliseconds: (500 * pow(2, attempt)).toInt(),\n  ),\n)\n",[352,997,998,1004,1020,1057,1064],{"__ignoreMap":382},[386,999,1000,1002],{"class":388,"line":389},[386,1001,215],{"class":399},[386,1003,891],{"class":403},[386,1005,1006,1009,1011,1014,1016,1018],{"class":388,"line":419},[386,1007,1008],{"class":403},"  retryDelayCalculator",[386,1010,375],{"class":392},[386,1012,1013],{"class":403}," (attempt) ",[386,1015,576],{"class":392},[386,1017,919],{"class":399},[386,1019,891],{"class":403},[386,1021,1022,1025,1027,1030,1033,1036,1039,1041,1043,1045,1048,1050,1053,1055],{"class":388,"line":426},[386,1023,1024],{"class":403},"    milliseconds",[386,1026,375],{"class":392},[386,1028,1029],{"class":403}," (",[386,1031,1032],{"class":901},"500",[386,1034,1035],{"class":392}," *",[386,1037,1038],{"class":585}," pow",[386,1040,654],{"class":403},[386,1042,976],{"class":901},[386,1044,557],{"class":392},[386,1046,1047],{"class":403}," attempt))",[386,1049,582],{"class":392},[386,1051,1052],{"class":585},"toInt",[386,1054,644],{"class":403},[386,1056,563],{"class":392},[386,1058,1059,1062],{"class":388,"line":457},[386,1060,1061],{"class":403},"  )",[386,1063,563],{"class":392},[386,1065,1066],{"class":388,"line":472},[386,1067,867],{"class":403},[989,1069,1071],{"id":1070},"disable-retries","Disable Retries",[377,1073,1075],{"className":379,"code":1074,"filename":882,"language":381,"meta":382,"style":382},"// Fail immediately: e.g. for mutations or real-time queries\nQoraOptions(retryCount: 0)\n",[352,1076,1077,1082],{"__ignoreMap":382},[386,1078,1079],{"class":388,"line":389},[386,1080,1081],{"class":504},"// Fail immediately: e.g. for mutations or real-time queries\n",[386,1083,1084,1086,1089,1091,1094],{"class":388,"line":419},[386,1085,215],{"class":399},[386,1087,1088],{"class":403},"(retryCount",[386,1090,375],{"class":392},[386,1092,1093],{"class":901}," 0",[386,1095,867],{"class":403},[357,1097],{},[360,1099,1101],{"id":1100},"selectively-skipping-retries","Selectively Skipping Retries",[348,1103,1104,1105,1108],{},"To skip retries for specific error types (e.g. ",[352,1106,1107],{},"401 Unauthorized"," should never be retried):",[377,1110,1112],{"className":379,"code":1111,"filename":882,"language":381,"meta":382,"style":382},"QoraOptions(\n  retryCount: 3,\n  retryDelayCalculator: (attempt) {\n    // This won't be called if retryCount is effectively 0,\n    // but you can gate retry logic in the fetcher itself:\n    return Duration(seconds: 1 \u003C\u003C attempt);\n  },\n)\n",[352,1113,1114,1120,1130,1139,1144,1149,1170,1176],{"__ignoreMap":382},[386,1115,1116,1118],{"class":388,"line":389},[386,1117,215],{"class":399},[386,1119,891],{"class":403},[386,1121,1122,1124,1126,1128],{"class":388,"line":419},[386,1123,896],{"class":403},[386,1125,375],{"class":392},[386,1127,902],{"class":901},[386,1129,563],{"class":392},[386,1131,1132,1134,1136],{"class":388,"line":426},[386,1133,1008],{"class":403},[386,1135,375],{"class":392},[386,1137,1138],{"class":403}," (attempt) {\n",[386,1140,1141],{"class":388,"line":457},[386,1142,1143],{"class":504},"    // This won't be called if retryCount is effectively 0,\n",[386,1145,1146],{"class":388,"line":472},[386,1147,1148],{"class":504},"    // but you can gate retry logic in the fetcher itself:\n",[386,1150,1151,1154,1156,1158,1160,1162,1165,1168],{"class":388,"line":488},[386,1152,1153],{"class":616},"    return",[386,1155,919],{"class":399},[386,1157,922],{"class":403},[386,1159,375],{"class":392},[386,1161,927],{"class":901},[386,1163,1164],{"class":392}," \u003C\u003C",[386,1166,1167],{"class":403}," attempt)",[386,1169,469],{"class":392},[386,1171,1172,1174],{"class":388,"line":508},[386,1173,859],{"class":403},[386,1175,563],{"class":392},[386,1177,1178],{"class":388,"line":706},[386,1179,867],{"class":403},[348,1181,1182],{},"The recommended pattern is to throw a specific exception and catch it in the fetcher:",[377,1184,1187],{"className":379,"code":1185,"filename":1186,"language":381,"meta":382,"style":382},"Future\u003CUser> getUser(int id) async {\n  final response = await http.get(Uri.parse('/users/$id'));\n  if (response.statusCode == 401) throw const UnauthorizedException();\n  if (response.statusCode == 404) throw const NotFoundException();\n  if (response.statusCode != 200) throw HttpException(response.statusCode);\n  return User.fromJson(jsonDecode(response.body));\n}\n","user_api.dart",[352,1188,1189,1216,1264,1298,1326,1358,1385],{"__ignoreMap":382},[386,1190,1191,1194,1196,1198,1200,1202,1204,1207,1210,1213],{"class":388,"line":389},[386,1192,1193],{"class":399},"Future",[386,1195,404],{"class":403},[386,1197,537],{"class":399},[386,1199,442],{"class":403},[386,1201,586],{"class":585},[386,1203,654],{"class":403},[386,1205,1206],{"class":399},"int",[386,1208,1209],{"class":403}," id) ",[386,1211,1212],{"class":616},"async",[386,1214,1215],{"class":403}," {\n",[386,1217,1218,1220,1223,1226,1229,1232,1234,1237,1239,1242,1244,1247,1249,1252,1254,1257,1259,1262],{"class":388,"line":419},[386,1219,460],{"class":429},[386,1221,1222],{"class":403}," response ",[386,1224,1225],{"class":392},"=",[386,1227,1228],{"class":616}," await",[386,1230,1231],{"class":403}," http",[386,1233,582],{"class":392},[386,1235,1236],{"class":585},"get",[386,1238,654],{"class":403},[386,1240,1241],{"class":399},"Uri",[386,1243,582],{"class":392},[386,1245,1246],{"class":585},"parse",[386,1248,654],{"class":403},[386,1250,1251],{"class":553},"'/users/",[386,1253,813],{"class":403},[386,1255,1256],{"class":816},"id",[386,1258,820],{"class":553},[386,1260,1261],{"class":403},"))",[386,1263,469],{"class":392},[386,1265,1266,1269,1272,1274,1277,1280,1283,1286,1289,1291,1294,1296],{"class":388,"line":426},[386,1267,1268],{"class":616},"  if",[386,1270,1271],{"class":403}," (response",[386,1273,582],{"class":392},[386,1275,1276],{"class":403},"statusCode ",[386,1278,1279],{"class":392},"==",[386,1281,1282],{"class":901}," 401",[386,1284,1285],{"class":403},") ",[386,1287,1288],{"class":616},"throw",[386,1290,633],{"class":429},[386,1292,1293],{"class":399}," UnauthorizedException",[386,1295,644],{"class":403},[386,1297,469],{"class":392},[386,1299,1300,1302,1304,1306,1308,1310,1313,1315,1317,1319,1322,1324],{"class":388,"line":457},[386,1301,1268],{"class":616},[386,1303,1271],{"class":403},[386,1305,582],{"class":392},[386,1307,1276],{"class":403},[386,1309,1279],{"class":392},[386,1311,1312],{"class":901}," 404",[386,1314,1285],{"class":403},[386,1316,1288],{"class":616},[386,1318,633],{"class":429},[386,1320,1321],{"class":399}," NotFoundException",[386,1323,644],{"class":403},[386,1325,469],{"class":392},[386,1327,1328,1330,1332,1334,1336,1338,1341,1343,1345,1348,1351,1353,1356],{"class":388,"line":472},[386,1329,1268],{"class":616},[386,1331,1271],{"class":403},[386,1333,582],{"class":392},[386,1335,1276],{"class":403},[386,1337,669],{"class":392},[386,1339,1340],{"class":901}," 200",[386,1342,1285],{"class":403},[386,1344,1288],{"class":616},[386,1346,1347],{"class":399}," HttpException",[386,1349,1350],{"class":403},"(response",[386,1352,582],{"class":392},[386,1354,1355],{"class":403},"statusCode)",[386,1357,469],{"class":392},[386,1359,1360,1363,1366,1368,1371,1373,1376,1378,1380,1383],{"class":388,"line":488},[386,1361,1362],{"class":616},"  return",[386,1364,1365],{"class":399}," User",[386,1367,582],{"class":392},[386,1369,1370],{"class":585},"fromJson",[386,1372,654],{"class":403},[386,1374,1375],{"class":585},"jsonDecode",[386,1377,1350],{"class":403},[386,1379,582],{"class":392},[386,1381,1382],{"class":403},"body))",[386,1384,469],{"class":392},[386,1386,1387],{"class":388,"line":508},[386,1388,511],{"class":403},[348,1390,1391,1392,1395],{},"Then in ",[352,1393,1394],{},"QoraClientConfig.errorMapper",", normalize errors before they reach the retry engine:",[377,1397,1399],{"className":379,"code":1398,"filename":882,"language":381,"meta":382,"style":382},"QoraClientConfig(\n  errorMapper: (error, stack) {\n    if (error is UnauthorizedException) return error; // Don't wrap: let it surface\n    return QoraException('$error', originalError: error, stackTrace: stack);\n  },\n)\n",[352,1400,1401,1407,1422,1447,1484,1490],{"__ignoreMap":382},[386,1402,1403,1405],{"class":388,"line":389},[386,1404,220],{"class":399},[386,1406,891],{"class":403},[386,1408,1409,1412,1414,1417,1419],{"class":388,"line":419},[386,1410,1411],{"class":403},"  errorMapper",[386,1413,375],{"class":392},[386,1415,1416],{"class":403}," (error",[386,1418,557],{"class":392},[386,1420,1421],{"class":403}," stack) {\n",[386,1423,1424,1427,1430,1433,1435,1437,1440,1442,1444],{"class":388,"line":426},[386,1425,1426],{"class":616},"    if",[386,1428,1429],{"class":403}," (error ",[386,1431,1432],{"class":392},"is",[386,1434,1293],{"class":399},[386,1436,1285],{"class":403},[386,1438,1439],{"class":616},"return",[386,1441,466],{"class":403},[386,1443,501],{"class":392},[386,1445,1446],{"class":504}," // Don't wrap: let it surface\n",[386,1448,1449,1451,1454,1456,1458,1460,1462,1464,1466,1469,1471,1473,1475,1477,1479,1482],{"class":388,"line":457},[386,1450,1153],{"class":616},[386,1452,1453],{"class":399}," QoraException",[386,1455,654],{"class":403},[386,1457,820],{"class":553},[386,1459,813],{"class":403},[386,1461,817],{"class":816},[386,1463,820],{"class":553},[386,1465,557],{"class":392},[386,1467,1468],{"class":403}," originalError",[386,1470,375],{"class":392},[386,1472,466],{"class":403},[386,1474,557],{"class":392},[386,1476,483],{"class":403},[386,1478,375],{"class":392},[386,1480,1481],{"class":403}," stack)",[386,1483,469],{"class":392},[386,1485,1486,1488],{"class":388,"line":472},[386,1487,859],{"class":403},[386,1489,563],{"class":392},[386,1491,1492],{"class":388,"line":488},[386,1493,867],{"class":403},[357,1495],{},[360,1497,1499],{"id":1498},"global-error-handling","Global Error Handling",[348,1501,1502,1503,1505,1506,375],{},"Use ",[352,1504,1394],{}," to normalise all errors into a single type before they surface in ",[352,1507,1508],{},"Failure.error",[377,1510,1512],{"className":379,"code":1511,"filename":882,"language":381,"meta":382,"style":382},"final client = QoraClient(\n  config: QoraClientConfig(\n    errorMapper: (error, stackTrace) {\n      if (error is DioException) {\n        return switch (error.type) {\n          DioExceptionType.connectionTimeout => const NetworkTimeoutError(),\n          DioExceptionType.receiveTimeout => const NetworkTimeoutError(),\n          _ => ApiError(error.response?.statusCode),\n        };\n      }\n      return error;\n    },\n  ),\n);\n",[352,1513,1514,1528,1540,1554,1569,1583,1604,1623,1648,1655,1660,1669,1676,1682],{"__ignoreMap":382},[386,1515,1516,1518,1521,1523,1526],{"class":388,"line":389},[386,1517,430],{"class":429},[386,1519,1520],{"class":403}," client ",[386,1522,1225],{"class":392},[386,1524,1525],{"class":399}," QoraClient",[386,1527,891],{"class":403},[386,1529,1530,1533,1535,1538],{"class":388,"line":419},[386,1531,1532],{"class":403},"  config",[386,1534,375],{"class":392},[386,1536,1537],{"class":399}," QoraClientConfig",[386,1539,891],{"class":403},[386,1541,1542,1545,1547,1549,1551],{"class":388,"line":426},[386,1543,1544],{"class":403},"    errorMapper",[386,1546,375],{"class":392},[386,1548,1416],{"class":403},[386,1550,557],{"class":392},[386,1552,1553],{"class":403}," stackTrace) {\n",[386,1555,1556,1559,1561,1563,1566],{"class":388,"line":457},[386,1557,1558],{"class":616},"      if",[386,1560,1429],{"class":403},[386,1562,1432],{"class":392},[386,1564,1565],{"class":399}," DioException",[386,1567,1568],{"class":403},") {\n",[386,1570,1571,1574,1576,1578,1580],{"class":388,"line":472},[386,1572,1573],{"class":616},"        return",[386,1575,617],{"class":616},[386,1577,1416],{"class":403},[386,1579,582],{"class":392},[386,1581,1582],{"class":403},"type) {\n",[386,1584,1585,1588,1590,1593,1595,1597,1600,1602],{"class":388,"line":488},[386,1586,1587],{"class":399},"          DioExceptionType",[386,1589,582],{"class":392},[386,1591,1592],{"class":403},"connectionTimeout ",[386,1594,576],{"class":392},[386,1596,633],{"class":429},[386,1598,1599],{"class":399}," NetworkTimeoutError",[386,1601,644],{"class":403},[386,1603,563],{"class":392},[386,1605,1606,1608,1610,1613,1615,1617,1619,1621],{"class":388,"line":508},[386,1607,1587],{"class":399},[386,1609,582],{"class":392},[386,1611,1612],{"class":403},"receiveTimeout ",[386,1614,576],{"class":392},[386,1616,633],{"class":429},[386,1618,1599],{"class":399},[386,1620,644],{"class":403},[386,1622,563],{"class":392},[386,1624,1625,1628,1630,1633,1636,1638,1641,1644,1646],{"class":388,"line":706},[386,1626,1627],{"class":403},"          _ ",[386,1629,576],{"class":392},[386,1631,1632],{"class":399}," ApiError",[386,1634,1635],{"class":403},"(error",[386,1637,582],{"class":392},[386,1639,1640],{"class":403},"response",[386,1642,1643],{"class":392},"?.",[386,1645,1355],{"class":403},[386,1647,563],{"class":392},[386,1649,1650,1653],{"class":388,"line":721},[386,1651,1652],{"class":403},"        }",[386,1654,469],{"class":392},[386,1656,1657],{"class":388,"line":746},[386,1658,1659],{"class":403},"      }\n",[386,1661,1662,1665,1667],{"class":388,"line":777},[386,1663,1664],{"class":616},"      return",[386,1666,466],{"class":403},[386,1668,469],{"class":392},[386,1670,1671,1674],{"class":388,"line":792},[386,1672,1673],{"class":403},"    }",[386,1675,563],{"class":392},[386,1677,1678,1680],{"class":388,"line":802},[386,1679,1061],{"class":403},[386,1681,563],{"class":392},[386,1683,1684,1686],{"class":388,"line":828},[386,1685,823],{"class":403},[386,1687,469],{"class":392},[357,1689],{},[360,1691,1693],{"id":1692},"background-fetch-errors","Background Fetch Errors",[348,1695,1696,1697,1700,1701,1704,1705,1707,1708,1711,1712,1715],{},"When using ",[352,1698,1699],{},"watchQuery",", background fetches run in ",[352,1702,1703],{},"unawaited"," futures. If the fetch fails, the error is stored in the ",[352,1706,354],{}," state, but the re-thrown exception would crash the current async ",[352,1709,1710],{},"Zone",". Use ",[352,1713,1714],{},"QoraClientConfig.onBackgroundFetchError"," to safely intercept these errors for logging or crash reporting:",[377,1717,1720],{"className":379,"code":1718,"filename":1719,"language":381,"meta":382,"style":382},"final client = QoraClient(\n  config: QoraClientConfig(\n    onBackgroundFetchError: (error, stackTrace, key) {\n      // Error already stored in Failure state; use this for reporting\n      crashReporter.record(error, stackTrace);\n    },\n  ),\n);\n","lib/core/qora.dart",[352,1721,1722,1734,1744,1762,1767,1786,1792,1798],{"__ignoreMap":382},[386,1723,1724,1726,1728,1730,1732],{"class":388,"line":389},[386,1725,430],{"class":429},[386,1727,1520],{"class":403},[386,1729,1225],{"class":392},[386,1731,1525],{"class":399},[386,1733,891],{"class":403},[386,1735,1736,1738,1740,1742],{"class":388,"line":419},[386,1737,1532],{"class":403},[386,1739,375],{"class":392},[386,1741,1537],{"class":399},[386,1743,891],{"class":403},[386,1745,1746,1749,1751,1753,1755,1757,1759],{"class":388,"line":426},[386,1747,1748],{"class":403},"    onBackgroundFetchError",[386,1750,375],{"class":392},[386,1752,1416],{"class":403},[386,1754,557],{"class":392},[386,1756,483],{"class":403},[386,1758,557],{"class":392},[386,1760,1761],{"class":403}," key) {\n",[386,1763,1764],{"class":388,"line":457},[386,1765,1766],{"class":504},"      // Error already stored in Failure state; use this for reporting\n",[386,1768,1769,1772,1774,1777,1779,1781,1784],{"class":388,"line":472},[386,1770,1771],{"class":403},"      crashReporter",[386,1773,582],{"class":392},[386,1775,1776],{"class":585},"record",[386,1778,1635],{"class":403},[386,1780,557],{"class":392},[386,1782,1783],{"class":403}," stackTrace)",[386,1785,469],{"class":392},[386,1787,1788,1790],{"class":388,"line":488},[386,1789,1673],{"class":403},[386,1791,563],{"class":392},[386,1793,1794,1796],{"class":388,"line":508},[386,1795,1061],{"class":403},[386,1797,563],{"class":392},[386,1799,1800,1802],{"class":388,"line":706},[386,1801,823],{"class":403},[386,1803,469],{"class":392},[348,1805,1806,1807,1809],{},"The callback receives the error, stack trace, and the normalised query key. The error has already been stored in the query's ",[352,1808,354],{}," state, this callback is for observability only.",[357,1811],{},[360,1813,1815],{"id":1814},"per-tracker-error-observation","Per-Tracker Error Observation",[348,1817,1818,1819,1822],{},"Implement ",[352,1820,1821],{},"QoraTracker.onQueryFetchFailed"," to observe all query errors globally: useful for crash reporting or analytics:",[377,1824,1827],{"className":379,"code":1825,"filename":1826,"language":381,"meta":382,"style":382},"class AnalyticsTracker extends NoOpTracker {\n  @override\n  void onQueryFetchFailed(String key, Object error, StackTrace stackTrace) {\n    Sentry.captureException(error, stackTrace: stackTrace);\n    analytics.track('query_error', {'key': key, 'error': '$error'});\n  }\n}\n","analytics_tracker.dart",[352,1828,1829,1845,1850,1878,1900,1948,1953],{"__ignoreMap":382},[386,1830,1831,1834,1837,1840,1843],{"class":388,"line":389},[386,1832,1833],{"class":392},"class",[386,1835,1836],{"class":399}," AnalyticsTracker",[386,1838,1839],{"class":392}," extends",[386,1841,1842],{"class":399}," NoOpTracker",[386,1844,1215],{"class":403},[386,1846,1847],{"class":388,"line":419},[386,1848,1849],{"class":429},"  @override\n",[386,1851,1852,1855,1858,1860,1863,1866,1868,1870,1872,1874,1876],{"class":388,"line":426},[386,1853,1854],{"class":429},"  void",[386,1856,1857],{"class":585}," onQueryFetchFailed",[386,1859,654],{"class":403},[386,1861,1862],{"class":399},"String",[386,1864,1865],{"class":403}," key",[386,1867,557],{"class":392},[386,1869,463],{"class":399},[386,1871,466],{"class":403},[386,1873,557],{"class":392},[386,1875,477],{"class":399},[386,1877,1553],{"class":403},[386,1879,1880,1883,1885,1888,1890,1892,1894,1896,1898],{"class":388,"line":457},[386,1881,1882],{"class":399},"    Sentry",[386,1884,582],{"class":392},[386,1886,1887],{"class":585},"captureException",[386,1889,1635],{"class":403},[386,1891,557],{"class":392},[386,1893,483],{"class":403},[386,1895,375],{"class":392},[386,1897,1783],{"class":403},[386,1899,469],{"class":392},[386,1901,1902,1905,1907,1910,1912,1915,1917,1920,1923,1925,1927,1929,1932,1934,1937,1939,1941,1943,1946],{"class":388,"line":472},[386,1903,1904],{"class":403},"    analytics",[386,1906,582],{"class":392},[386,1908,1909],{"class":585},"track",[386,1911,654],{"class":403},[386,1913,1914],{"class":553},"'query_error'",[386,1916,557],{"class":392},[386,1918,1919],{"class":403}," {",[386,1921,1922],{"class":553},"'key'",[386,1924,375],{"class":392},[386,1926,1865],{"class":403},[386,1928,557],{"class":392},[386,1930,1931],{"class":553}," 'error'",[386,1933,375],{"class":392},[386,1935,1936],{"class":553}," '",[386,1938,813],{"class":403},[386,1940,817],{"class":816},[386,1942,820],{"class":553},[386,1944,1945],{"class":403},"})",[386,1947,469],{"class":392},[386,1949,1950],{"class":388,"line":488},[386,1951,1952],{"class":403},"  }\n",[386,1954,1955],{"class":388,"line":508},[386,1956,511],{"class":403},[357,1958],{},[360,1960,1962],{"id":1961},"mutation-errors","Mutation Errors",[348,1964,1965,1966,375],{},"Mutation errors are surfaced on ",[352,1967,1968],{},"MutationFailure",[377,1970,1972],{"className":379,"code":1971,"filename":882,"language":381,"meta":382,"style":382},"QoraMutationBuilder\u003CUser, UpdatePayload, User?>(\n  mutator: (payload) => api.updateUser(payload),\n  options: MutationOptions(\n    onMutate: (payload) async =>\n        QoraScope.of(context).getQueryData\u003CUser>(['users', userId]),\n    onError: (error, payload, snapshot) async {\n      if (snapshot != null) {\n        QoraScope.of(context).restoreQueryData(['users', userId], snapshot);\n      }\n    },\n    onSettled: (_, _, _, _) async =>\n        QoraScope.of(context).invalidate(['users', userId]),\n  ),\n  builder: (context, state, mutate) => switch (state) {\n    MutationFailure(:final error) => ErrorBanner('$error'),\n    _ => UpdateButton(onTap: () => mutate(payload)),\n  },\n)\n",[352,1973,1974,1995,2019,2031,2045,2079,2102,2116,2147,2151,2157,2185,2210,2216,2239,2272,2299,2305],{"__ignoreMap":382},[386,1975,1976,1978,1980,1982,1985,1988,1990,1992],{"class":388,"line":389},[386,1977,113],{"class":399},[386,1979,404],{"class":403},[386,1981,537],{"class":399},[386,1983,1984],{"class":403},", ",[386,1986,1987],{"class":399},"UpdatePayload",[386,1989,1984],{"class":403},[386,1991,537],{"class":399},[386,1993,1994],{"class":403},"?>(\n",[386,1996,1997,2000,2002,2005,2007,2009,2011,2014,2017],{"class":388,"line":419},[386,1998,1999],{"class":403},"  mutator",[386,2001,375],{"class":392},[386,2003,2004],{"class":403}," (payload) ",[386,2006,576],{"class":392},[386,2008,579],{"class":403},[386,2010,582],{"class":392},[386,2012,2013],{"class":585},"updateUser",[386,2015,2016],{"class":403},"(payload)",[386,2018,563],{"class":392},[386,2020,2021,2024,2026,2029],{"class":388,"line":426},[386,2022,2023],{"class":403},"  options",[386,2025,375],{"class":392},[386,2027,2028],{"class":399}," MutationOptions",[386,2030,891],{"class":403},[386,2032,2033,2036,2038,2040,2042],{"class":388,"line":457},[386,2034,2035],{"class":403},"    onMutate",[386,2037,375],{"class":392},[386,2039,2004],{"class":403},[386,2041,1212],{"class":616},[386,2043,2044],{"class":392}," =>\n",[386,2046,2047,2050,2052,2055,2058,2060,2063,2065,2067,2070,2072,2074,2077],{"class":388,"line":472},[386,2048,2049],{"class":399},"        QoraScope",[386,2051,582],{"class":392},[386,2053,2054],{"class":585},"of",[386,2056,2057],{"class":403},"(context)",[386,2059,582],{"class":392},[386,2061,2062],{"class":585},"getQueryData",[386,2064,404],{"class":403},[386,2066,537],{"class":399},[386,2068,2069],{"class":403},">([",[386,2071,554],{"class":553},[386,2073,557],{"class":392},[386,2075,2076],{"class":403}," userId])",[386,2078,563],{"class":392},[386,2080,2081,2084,2086,2088,2090,2093,2095,2098,2100],{"class":388,"line":488},[386,2082,2083],{"class":403},"    onError",[386,2085,375],{"class":392},[386,2087,1416],{"class":403},[386,2089,557],{"class":392},[386,2091,2092],{"class":403}," payload",[386,2094,557],{"class":392},[386,2096,2097],{"class":403}," snapshot) ",[386,2099,1212],{"class":616},[386,2101,1215],{"class":403},[386,2103,2104,2106,2109,2111,2114],{"class":388,"line":508},[386,2105,1558],{"class":616},[386,2107,2108],{"class":403}," (snapshot ",[386,2110,669],{"class":392},[386,2112,2113],{"class":392}," null",[386,2115,1568],{"class":403},[386,2117,2118,2120,2122,2124,2126,2128,2131,2134,2136,2138,2140,2142,2145],{"class":388,"line":706},[386,2119,2049],{"class":399},[386,2121,582],{"class":392},[386,2123,2054],{"class":585},[386,2125,2057],{"class":403},[386,2127,582],{"class":392},[386,2129,2130],{"class":585},"restoreQueryData",[386,2132,2133],{"class":403},"([",[386,2135,554],{"class":553},[386,2137,557],{"class":392},[386,2139,560],{"class":403},[386,2141,557],{"class":392},[386,2143,2144],{"class":403}," snapshot)",[386,2146,469],{"class":392},[386,2148,2149],{"class":388,"line":721},[386,2150,1659],{"class":403},[386,2152,2153,2155],{"class":388,"line":746},[386,2154,1673],{"class":403},[386,2156,563],{"class":392},[386,2158,2159,2162,2164,2167,2169,2172,2174,2176,2178,2181,2183],{"class":388,"line":777},[386,2160,2161],{"class":403},"    onSettled",[386,2163,375],{"class":392},[386,2165,2166],{"class":403}," (_",[386,2168,557],{"class":392},[386,2170,2171],{"class":403}," _",[386,2173,557],{"class":392},[386,2175,2171],{"class":403},[386,2177,557],{"class":392},[386,2179,2180],{"class":403}," _) ",[386,2182,1212],{"class":616},[386,2184,2044],{"class":392},[386,2186,2187,2189,2191,2193,2195,2197,2200,2202,2204,2206,2208],{"class":388,"line":792},[386,2188,2049],{"class":399},[386,2190,582],{"class":392},[386,2192,2054],{"class":585},[386,2194,2057],{"class":403},[386,2196,582],{"class":392},[386,2198,2199],{"class":585},"invalidate",[386,2201,2133],{"class":403},[386,2203,554],{"class":553},[386,2205,557],{"class":392},[386,2207,2076],{"class":403},[386,2209,563],{"class":392},[386,2211,2212,2214],{"class":388,"line":802},[386,2213,1061],{"class":403},[386,2215,563],{"class":392},[386,2217,2218,2220,2222,2224,2226,2228,2230,2233,2235,2237],{"class":388,"line":828},[386,2219,596],{"class":403},[386,2221,375],{"class":392},[386,2223,601],{"class":403},[386,2225,557],{"class":392},[386,2227,606],{"class":403},[386,2229,557],{"class":392},[386,2231,2232],{"class":403}," mutate) ",[386,2234,576],{"class":392},[386,2236,617],{"class":616},[386,2238,620],{"class":403},[386,2240,2241,2244,2246,2248,2250,2253,2255,2258,2260,2262,2264,2266,2268,2270],{"class":388,"line":834},[386,2242,2243],{"class":399},"    MutationFailure",[386,2245,654],{"class":403},[386,2247,375],{"class":392},[386,2249,430],{"class":429},[386,2251,2252],{"class":403}," error) ",[386,2254,576],{"class":392},[386,2256,2257],{"class":399}," ErrorBanner",[386,2259,654],{"class":403},[386,2261,820],{"class":553},[386,2263,813],{"class":403},[386,2265,817],{"class":816},[386,2267,820],{"class":553},[386,2269,823],{"class":403},[386,2271,563],{"class":392},[386,2273,2274,2277,2279,2282,2285,2287,2289,2291,2294,2297],{"class":388,"line":856},[386,2275,2276],{"class":403},"    _ ",[386,2278,576],{"class":392},[386,2280,2281],{"class":399}," UpdateButton",[386,2283,2284],{"class":403},"(onTap",[386,2286,375],{"class":392},[386,2288,573],{"class":403},[386,2290,576],{"class":392},[386,2292,2293],{"class":585}," mutate",[386,2295,2296],{"class":403},"(payload))",[386,2298,563],{"class":392},[386,2300,2301,2303],{"class":388,"line":864},[386,2302,859],{"class":403},[386,2304,563],{"class":392},[386,2306,2308],{"class":388,"line":2307},18,[386,2309,867],{"class":403},[357,2311],{},[360,2313,2315],{"id":2314},"offline-errors","Offline Errors",[348,2317,2318,2319,2322,2323,2326],{},"When ",[352,2320,2321],{},"networkMode"," is ",[352,2324,2325],{},"NetworkMode.online"," (default) and the device is offline:",[2328,2329,2330,2341,2354],"ul",{},[2331,2332,2333,2336,2337,2340],"li",{},[352,2334,2335],{},"fetchQuery"," throws ",[352,2338,2339],{},"QoraOfflineException"," if no cached data exists.",[2331,2342,2343,2345,2346,2349,2350,2353],{},[352,2344,1699],{}," emits ",[352,2347,2348],{},"FetchStatus.paused",": the state stays at ",[352,2351,2352],{},"Loading(previousData: ...)"," if data was previously cached.",[2331,2355,2356],{},"The fetch is replayed automatically when connectivity is restored.",[377,2358,2360],{"className":379,"code":2359,"filename":882,"language":381,"meta":382,"style":382},"try {\n  final data = await client.fetchQuery\u003CUser>(\n    key: ['users', userId],\n    fetcher: () => api.getUser(userId),\n  );\n} on QoraOfflineException {\n  showSnackBar('No internet connection');\n}\n",[352,2361,2362,2369,2393,2410,2431,2437,2450,2464],{"__ignoreMap":382},[386,2363,2364,2367],{"class":388,"line":389},[386,2365,2366],{"class":616},"try",[386,2368,1215],{"class":403},[386,2370,2371,2373,2376,2378,2380,2383,2385,2387,2389,2391],{"class":388,"line":419},[386,2372,460],{"class":429},[386,2374,2375],{"class":403}," data ",[386,2377,1225],{"class":392},[386,2379,1228],{"class":616},[386,2381,2382],{"class":403}," client",[386,2384,582],{"class":392},[386,2386,2335],{"class":585},[386,2388,404],{"class":403},[386,2390,537],{"class":399},[386,2392,540],{"class":403},[386,2394,2395,2398,2400,2402,2404,2406,2408],{"class":388,"line":426},[386,2396,2397],{"class":403},"    key",[386,2399,375],{"class":392},[386,2401,550],{"class":403},[386,2403,554],{"class":553},[386,2405,557],{"class":392},[386,2407,560],{"class":403},[386,2409,563],{"class":392},[386,2411,2412,2415,2417,2419,2421,2423,2425,2427,2429],{"class":388,"line":457},[386,2413,2414],{"class":403},"    fetcher",[386,2416,375],{"class":392},[386,2418,573],{"class":403},[386,2420,576],{"class":392},[386,2422,579],{"class":403},[386,2424,582],{"class":392},[386,2426,586],{"class":585},[386,2428,589],{"class":403},[386,2430,563],{"class":392},[386,2432,2433,2435],{"class":388,"line":472},[386,2434,1061],{"class":403},[386,2436,469],{"class":392},[386,2438,2439,2442,2445,2448],{"class":388,"line":488},[386,2440,2441],{"class":403},"} ",[386,2443,2444],{"class":616},"on",[386,2446,2447],{"class":399}," QoraOfflineException",[386,2449,1215],{"class":403},[386,2451,2452,2455,2457,2460,2462],{"class":388,"line":508},[386,2453,2454],{"class":585},"  showSnackBar",[386,2456,654],{"class":403},[386,2458,2459],{"class":553},"'No internet connection'",[386,2461,823],{"class":403},[386,2463,469],{"class":392},[386,2465,2466],{"class":388,"line":706},[386,2467,511],{"class":403},[357,2469],{},[360,2471,2473],{"id":2472},"related","Related",[2328,2475,2476,2494,2507],{},[2331,2477,2478,2482,2483,1984,2486,1984,2489,1984,2492],{},[2479,2480,215],"a",{"href":2481},"../api-reference/qora-options",": ",[352,2484,2485],{},"retryCount",[352,2487,2488],{},"retryDelay",[352,2490,2491],{},"retryDelayCalculator",[352,2493,2321],{},[2331,2495,2496,2500,2501,1984,2504],{},[2479,2497,2499],{"href":2498},"./network-aware","Network-Aware Queries",": offline behaviour, ",[352,2502,2503],{},"NetworkMode",[352,2505,2506],{},"FetchStatus",[2331,2508,2509,2482,2513,2516],{},[2479,2510,2512],{"href":2511},"./mutations","Mutations Guide",[352,2514,2515],{},"onError",", rollback",[2518,2519,2520],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":382,"searchDepth":419,"depth":419,"links":2522},[2523,2525,2529,2530,2531,2532,2533,2534,2535],{"id":362,"depth":419,"text":2524},"The Failure State",{"id":872,"depth":419,"text":873,"children":2526},[2527,2528],{"id":991,"depth":426,"text":992},{"id":1070,"depth":426,"text":1071},{"id":1100,"depth":419,"text":1101},{"id":1498,"depth":419,"text":1499},{"id":1692,"depth":419,"text":1693},{"id":1814,"depth":419,"text":1815},{"id":1961,"depth":419,"text":1962},{"id":2314,"depth":419,"text":2315},{"id":2472,"depth":419,"text":2473},"Understand how Qora surfaces errors, configures retry behaviour, and enables graceful degradation with previousData.","md",null,{},{"icon":185},{"title":182,"description":2536},"YP8cZZAWZydZpSm_LBsJvd74E-T4cKEa41jSy9xhPdg",[2544,2546],{"title":177,"path":178,"stem":179,"description":2545,"icon":180,"children":-1},"Eliminate the loading flash on server-rendered Flutter Web pages by injecting the server cache into QoraClient via SsrHydrator.",{"title":187,"path":188,"stem":189,"description":2547,"icon":190,"children":-1},"Test Qora queries, mutations, and widgets with deterministic helpers: no network, no Hive, no timers.",1794040400511]