[{"data":1,"prerenderedAt":1186},["ShallowReactive",2],{"navigation_docs_en":3,"-en-getting-started-comparison":342,"-en-getting-started-comparison-surround":1181},[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":25,"body":344,"description":1172,"extension":1173,"links":1174,"meta":1175,"navigation":1176,"path":26,"seo":1177,"stem":27,"__hash__":1180},"docs_en/en/01.getting-started/5.comparison.md",{"type":345,"value":346,"toc":1159},"minimark",[347,360,363,366,371,522,524,528,533,536,590,919,922,929,933,944,948,954,1041,1043,1049,1064,1066,1070,1073,1119,1122,1126,1128,1132,1155],[348,349,350,351,355,356,359],"p",{},"Qora, ",[352,353,354],"code",{},"flutter_query",", and ",[352,357,358],{},"cached_query"," are server-state libraries built for data that resides on a remote server. Provider and BLoC target client state; comparing them to Qora conflates two distinct problem domains.",[348,361,362],{},"This page documents the meaningful differences between the three server-state solutions. Claims about other libraries are based on their public documentation as of November 2026; open an issue if something is out of date.",[364,365],"hr",{},[367,368,370],"h2",{"id":369},"selection-criteria","Selection Criteria",[372,373,374,387],"table",{},[375,376,377],"thead",{},[378,379,380,384],"tr",{},[381,382,383],"th",{},"If you need...",[381,385,386],{},"Best fit",[388,389,390,399,410,423,432,441,450,463,475,484,493,504,513],"tbody",{},[378,391,392,396],{},[393,394,395],"td",{},"A solid SWR cache with minimal setup",[393,397,398],{},"Any of the three",[378,400,401,404],{},[393,402,403],{},"Writes made offline, queued and replayed on reconnect",[393,405,406],{},[407,408,409],"strong",{},"Qora",[378,411,412,419],{},[393,413,414,415,418],{},"Queries that pause offline and say so (",[352,416,417],{},"FetchStatus.paused",")",[393,420,421],{},[407,422,409],{},[378,424,425,428],{},[393,426,427],{},"Per-query network mode (online / always / offlineFirst)",[393,429,430],{},[407,431,409],{},[378,433,434,437],{},[393,435,436],{},"Thundering-herd control on reconnect",[393,438,439],{},[407,440,409],{},[378,442,443,446],{},[393,444,445],{},"Tag-based invalidation",[393,447,448],{},[407,449,409],{},[378,451,452,455],{},[393,453,454],{},"Disk persistence with a ready-made adapter",[393,456,457,459,460,418],{},[407,458,358],{}," (",[352,461,462],{},"cached_storage",[378,464,465,468],{},[393,466,467],{},"Disk persistence on your own storage backend",[393,469,470,472,473],{},[407,471,409],{}," or ",[407,474,358],{},[378,476,477,480],{},[393,478,479],{},"A hooks-only API, closest to TanStack Query on the web",[393,481,482],{},[407,483,354],{},[378,485,486,489],{},[393,487,488],{},"Hooks or widget builders, your choice",[393,490,491],{},[407,492,409],{},[378,494,495,498],{},[393,496,497],{},"Pure Dart core usable outside Flutter",[393,499,500,472,502],{},[407,501,409],{},[407,503,358],{},[378,505,506,509],{},[393,507,508],{},"A tab in Flutter DevTools today",[393,510,511],{},[407,512,358],{},[378,514,515,518],{},[393,516,517],{},"An in-app debug overlay",[393,519,520],{},[407,521,409],{},[364,523],{},[367,525,527],{"id":526},"qora-differentiators","Qora Differentiators",[529,530,532],"h3",{"id":531},"offline-architecture","Offline Architecture",[348,534,535],{},"Offline behaviour in Qora is a set of cooperating pieces rather than a single refetch-on-reconnect flag:",[537,538,539,561,567,582],"ul",{},[540,541,542,548,549,552,553,556,557,560],"li",{},[407,543,544,547],{},[352,545,546],{},"NetworkMode"," per query",": declare whether a query runs ",[352,550,551],{},"online"," only, ",[352,554,555],{},"always"," (local DB), or ",[352,558,559],{},"offlineFirst"," (serve cache, refresh in background when online).",[540,562,563,566],{},[407,564,565],{},"Offline mutation queue",": writes submitted while offline return an optimistic result, are queued in order and replayed on reconnect. The queue is held in memory: it survives connectivity changes, not an app restart.",[540,568,569,574,575,578,579,581],{},[407,570,571],{},[352,572,573],{},"FetchStatus",": a second-axis enum (",[352,576,577],{},"fetching / paused / idle",") emitted independently of ",[352,580,211],{},", allowing the UI to distinguish \"no network\" from \"loading\".",[540,583,584,589],{},[407,585,586],{},[352,587,588],{},"ReconnectStrategy",": limits the thundering herd on reconnect with a maximum number of concurrent refetches and random jitter between batches.",[591,592,598],"pre",{"className":593,"code":594,"filename":595,"language":596,"meta":597,"style":597},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: const QoraOptions(networkMode: NetworkMode.offlineFirst),\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","user_screen.dart","dart","",[352,599,600,618,644,673,703,724,745,769,775,787,814,835,873,897,905,913],{"__ignoreMap":597},[601,602,605,608,612,615],"span",{"class":603,"line":604},"line",1,[601,606,108],{"class":607},"sBMFI",[601,609,611],{"class":610},"sTEyZ","\u003C",[601,613,614],{"class":607},"User",[601,616,617],{"class":610},">(\n",[601,619,621,624,628,631,635,638,641],{"class":603,"line":620},2,[601,622,623],{"class":610},"  queryKey",[601,625,627],{"class":626},"sMK4o",":",[601,629,630],{"class":610}," [",[601,632,634],{"class":633},"sfazB","'users'",[601,636,637],{"class":626},",",[601,639,640],{"class":610}," userId]",[601,642,643],{"class":626},",\n",[601,645,647,650,652,655,658,661,664,668,671],{"class":603,"line":646},3,[601,648,649],{"class":610},"  fetcher",[601,651,627],{"class":626},[601,653,654],{"class":610}," () ",[601,656,657],{"class":626},"=>",[601,659,660],{"class":610}," api",[601,662,663],{"class":626},".",[601,665,667],{"class":666},"s2Zo4","getUser",[601,669,670],{"class":610},"(userId)",[601,672,643],{"class":626},[601,674,676,679,681,685,688,691,693,696,698,701],{"class":603,"line":675},4,[601,677,678],{"class":610},"  options",[601,680,627],{"class":626},[601,682,684],{"class":683},"spNyl"," const",[601,686,687],{"class":607}," QoraOptions",[601,689,690],{"class":610},"(networkMode",[601,692,627],{"class":626},[601,694,695],{"class":607}," NetworkMode",[601,697,663],{"class":626},[601,699,700],{"class":610},"offlineFirst)",[601,702,643],{"class":626},[601,704,706,709,711,714,716,719,721],{"class":603,"line":705},5,[601,707,708],{"class":610},"  builder",[601,710,627],{"class":626},[601,712,713],{"class":610}," (context",[601,715,637],{"class":626},[601,717,718],{"class":610}," state",[601,720,637],{"class":626},[601,722,723],{"class":610}," fetchStatus) {\n",[601,725,727,731,734,737,740,742],{"class":603,"line":726},6,[601,728,730],{"class":729},"s7zQu","    if",[601,732,733],{"class":610}," (fetchStatus ",[601,735,736],{"class":626},"==",[601,738,739],{"class":607}," FetchStatus",[601,741,663],{"class":626},[601,743,744],{"class":610},"paused) {\n",[601,746,748,751,754,757,759,761,763,766],{"class":603,"line":747},7,[601,749,750],{"class":729},"      return",[601,752,753],{"class":607}," OfflineBanner",[601,755,756],{"class":610},"(staleData",[601,758,627],{"class":626},[601,760,718],{"class":610},[601,762,663],{"class":626},[601,764,765],{"class":610},"dataOrNull)",[601,767,768],{"class":626},";\n",[601,770,772],{"class":603,"line":771},8,[601,773,774],{"class":610},"    }\n",[601,776,778,781,784],{"class":603,"line":777},9,[601,779,780],{"class":729},"    return",[601,782,783],{"class":729}," switch",[601,785,786],{"class":610}," (state) {\n",[601,788,790,793,796,798,801,804,806,809,812],{"class":603,"line":789},10,[601,791,792],{"class":607},"      Success",[601,794,795],{"class":610},"(",[601,797,627],{"class":626},[601,799,800],{"class":683},"final",[601,802,803],{"class":610}," data) ",[601,805,657],{"class":626},[601,807,808],{"class":607}," UserCard",[601,810,811],{"class":610},"(data)",[601,813,643],{"class":626},[601,815,817,820,823,825,827,830,833],{"class":603,"line":816},11,[601,818,819],{"class":607},"      Loading",[601,821,822],{"class":610},"() ",[601,824,657],{"class":626},[601,826,684],{"class":683},[601,828,829],{"class":607}," CircularProgressIndicator",[601,831,832],{"class":610},"()",[601,834,643],{"class":626},[601,836,838,841,843,845,847,850,852,855,857,860,863,867,869,871],{"class":603,"line":837},12,[601,839,840],{"class":607},"      Failure",[601,842,795],{"class":610},[601,844,627],{"class":626},[601,846,800],{"class":683},[601,848,849],{"class":610}," error) ",[601,851,657],{"class":626},[601,853,854],{"class":607}," ErrorWidget",[601,856,795],{"class":610},[601,858,859],{"class":633},"'",[601,861,862],{"class":610},"$",[601,864,866],{"class":865},"sHdIc","error",[601,868,859],{"class":633},[601,870,418],{"class":610},[601,872,643],{"class":626},[601,874,876,879,881,883,885,888,890,893,895],{"class":603,"line":875},13,[601,877,878],{"class":607},"      Initial",[601,880,822],{"class":610},[601,882,657],{"class":626},[601,884,684],{"class":683},[601,886,887],{"class":607}," SizedBox",[601,889,663],{"class":626},[601,891,892],{"class":666},"shrink",[601,894,832],{"class":610},[601,896,643],{"class":626},[601,898,900,903],{"class":603,"line":899},14,[601,901,902],{"class":610},"    }",[601,904,768],{"class":626},[601,906,908,911],{"class":603,"line":907},15,[601,909,910],{"class":610},"  }",[601,912,643],{"class":626},[601,914,916],{"class":603,"line":915},16,[601,917,918],{"class":610},")\n",[529,920,237],{"id":921},"devtools",[348,923,924,925,928],{},"Qora's in-app overlay (",[352,926,927],{},"qora_devtools_overlay",") runs inside your app in debug builds and shows every query with its state, data and staleness, plus the mutation queue. A Flutter DevTools extension sharing the same event protocol is in development; the version on pub.dev is not compatible with Qora 1.x yet.",[529,930,932],{"id":931},"pure-dart-core","Pure Dart Core",[348,934,935,936,939,940,943],{},"The ",[352,937,938],{},"qora"," package carries no Flutter dependency. It operates in CLI applications, Dart server-side code, and test suites without pulling in the Flutter SDK. ",[352,941,942],{},"qora_flutter"," is a thin opt-in widget binding layer on top.",[529,945,947],{"id":946},"advanced-invalidation","Advanced Invalidation",[348,949,950,953],{},[352,951,952],{},"invalidateQueries({required QueryFilter filter})"," invalidates by state, last-used options, or any combination, not just by key prefix:",[591,955,958],{"className":593,"code":956,"filename":957,"language":596,"meta":597,"style":597},"// Invalidate all online-mode queries that have not yet succeeded\nclient.invalidateQueries(\n  filter: (key, state, opts) =>\n      opts?.networkMode == NetworkMode.online && state is! Success,\n);\n","main.dart",[352,959,960,966,979,1001,1035],{"__ignoreMap":597},[601,961,962],{"class":603,"line":604},[601,963,965],{"class":964},"sHwdD","// Invalidate all online-mode queries that have not yet succeeded\n",[601,967,968,971,973,976],{"class":603,"line":620},[601,969,970],{"class":610},"client",[601,972,663],{"class":626},[601,974,975],{"class":666},"invalidateQueries",[601,977,978],{"class":610},"(\n",[601,980,981,984,986,989,991,993,995,998],{"class":603,"line":646},[601,982,983],{"class":610},"  filter",[601,985,627],{"class":626},[601,987,988],{"class":610}," (key",[601,990,637],{"class":626},[601,992,718],{"class":610},[601,994,637],{"class":626},[601,996,997],{"class":610}," opts) ",[601,999,1000],{"class":626},"=>\n",[601,1002,1003,1006,1009,1012,1014,1016,1018,1021,1024,1027,1030,1033],{"class":603,"line":675},[601,1004,1005],{"class":610},"      opts",[601,1007,1008],{"class":626},"?.",[601,1010,1011],{"class":610},"networkMode ",[601,1013,736],{"class":626},[601,1015,695],{"class":607},[601,1017,663],{"class":626},[601,1019,1020],{"class":610},"online ",[601,1022,1023],{"class":626},"&&",[601,1025,1026],{"class":610}," state ",[601,1028,1029],{"class":626},"is!",[601,1031,1032],{"class":607}," Success",[601,1034,643],{"class":626},[601,1036,1037,1039],{"class":603,"line":705},[601,1038,418],{"class":610},[601,1040,768],{"class":626},[364,1042],{},[367,1044,1046,1048],{"id":1045},"cached_query-ready-made-persistence",[352,1047,358],{},": Ready-Made Persistence",[348,1050,1051,1053,1054,1056,1057,1059,1060,1063],{},[352,1052,358],{}," ships ",[352,1055,462],{},", a sqflite-based storage implementation maintained alongside the library, and a Flutter DevTools extension. Qora's ",[352,1058,229],{}," covers the same use case through a ",[352,1061,1062],{},"StorageAdapter"," interface with an in-memory implementation included; adapters for specific backends (Hive, Isar, SharedPreferences) are implemented in your app for now.",[364,1065],{},[367,1067,1069],{"id":1068},"complementarity-with-bloc-and-riverpod","Complementarity with BLoC and Riverpod",[348,1071,1072],{},"Qora, BLoC, and Riverpod address different concerns and are designed to be used together:",[372,1074,1075,1085],{},[375,1076,1077],{},[378,1078,1079,1082],{},[381,1080,1081],{},"Layer",[381,1083,1084],{},"Appropriate tool",[388,1086,1087,1096,1106],{},[378,1088,1089,1092],{},[393,1090,1091],{},"Data that lives on a server (queries, mutations, pagination)",[393,1093,1094],{},[407,1095,409],{},[378,1097,1098,1101],{},[393,1099,1100],{},"Complex UI state machines (checkout flows, multi-step forms)",[393,1102,1103],{},[407,1104,1105],{},"BLoC",[378,1107,1108,1111],{},[393,1109,1110],{},"Client state and DI (theme, auth session, service graph)",[393,1112,1113,472,1116],{},[407,1114,1115],{},"Riverpod",[407,1117,1118],{},"Provider",[348,1120,1121],{},"A production application commonly uses all three in combination. Refer to the integration guides when adding Qora to an existing BLoC or Riverpod codebase.",[1123,1124,1125],"tip",{},"Qora manages server state. BLoC and Riverpod manage client state. The two domains are complementary; each library operates within its intended scope.",[364,1127],{},[367,1129,1131],{"id":1130},"related","Related",[537,1133,1134,1140,1145,1150],{},[540,1135,1136],{},[1137,1138,264],"a",{"href":1139},"../third-party/with-provider",[540,1141,1142],{},[1137,1143,269],{"href":1144},"../third-party/with-bloc",[540,1146,1147],{},[1137,1148,273],{"href":1149},"../third-party/with-riverpod",[540,1151,1152],{},[1137,1153,98],{"href":1154},"./installation",[1156,1157,1158],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":597,"searchDepth":620,"depth":620,"links":1160},[1161,1162,1168,1170,1171],{"id":369,"depth":620,"text":370},{"id":526,"depth":620,"text":527,"children":1163},[1164,1165,1166,1167],{"id":531,"depth":646,"text":532},{"id":921,"depth":646,"text":237},{"id":931,"depth":646,"text":932},{"id":946,"depth":646,"text":947},{"id":1045,"depth":620,"text":1169},"cached_query: Ready-Made Persistence",{"id":1068,"depth":620,"text":1069},{"id":1130,"depth":620,"text":1131},"How Qora compares to flutter_query and cached_query, the other server-state libraries for Flutter.","md",null,{},{"icon":28},{"title":1178,"description":1179},"Qora vs flutter_query vs cached_query, a server-state comparison","Feature comparison between Qora, flutter_query, and cached_query on caching, offline support, DevTools, and pagination.","40E0dCokjzpCFt447kP_eqC4HHDz8KTzY0swNHJGZJc",[1182,1184],{"title":21,"path":22,"stem":23,"description":1183,"icon":6,"children":-1},"Build a list and a detail screen backed by Qora, watch the cache work, then take the app offline.",{"title":30,"path":31,"stem":32,"description":1185,"icon":33,"children":-1},"A precise mapping of TanStack Query concepts, hooks, and configuration options to their Qora equivalents. Covers what is identical, what is renamed, and what works differently.",1794040396298]