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