[{"data":1,"prerenderedAt":1714},["ShallowReactive",2],{"navigation_docs_en":3,"-en-third-party-with-provider":342,"-en-third-party-with-provider-surround":1709},[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":264,"body":344,"description":1702,"extension":1703,"links":1704,"meta":1705,"navigation":1706,"path":265,"seo":1707,"stem":266,"__hash__":1708},"docs_en/en/07.third-party/1.with-provider.md",{"type":345,"value":346,"toc":1694},"minimark",[347,364,367,370,375,378,704,912,915,917,921,1173,1362,1365,1380,1382,1386,1473,1475,1479,1568,1570,1574,1666,1668,1672,1690],[348,349,350,351,355,356,359,360,363],"p",{},"Provider and ",[352,353,354],"code",{},"ChangeNotifier"," are effective for UI state and dependency injection. Server data management introduces repetitive boilerplate in each notifier: ",[352,357,358],{},"isLoading",", ",[352,361,362],{},"error",", manual cache guards, and inconsistent retry handling.",[348,365,366],{},"Qora takes over that specific responsibility. Provider keeps everything else.",[368,369],"hr",{},[371,372,374],"h2",{"id":373},"the-problem-with-changenotifier-for-server-data","The Problem with ChangeNotifier for Server Data",[348,376,377],{},"A typical data-fetching notifier:",[379,380,386],"pre",{"className":381,"code":382,"filename":383,"language":384,"meta":385,"style":385},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class UserNotifier extends ChangeNotifier {\n  User? data;\n  bool isLoading = false;\n  Object? error;\n  int? _loadedId;\n\n  Future\u003Cvoid> fetchUser(int id) async {\n    if (_loadedId == id && data != null) return; // manual cache, no TTL, no SWR\n    isLoading = true;\n    error = null;\n    notifyListeners();\n    try {\n      data = await UserApi.getUser(id);\n      _loadedId = id;\n    } catch (e) {\n      error = e; // no retry, no backoff\n    } finally {\n      isLoading = false;\n      notifyListeners();\n    }\n  }\n}\n","lib/providers/user_provider.dart","dart","",[352,387,388,411,426,441,454,467,474,509,549,560,571,582,590,615,628,640,656,666,676,686,692,698],{"__ignoreMap":385},[389,390,393,397,401,404,407],"span",{"class":391,"line":392},"line",1,[389,394,396],{"class":395},"sMK4o","class",[389,398,400],{"class":399},"sBMFI"," UserNotifier",[389,402,403],{"class":395}," extends",[389,405,406],{"class":399}," ChangeNotifier",[389,408,410],{"class":409},"sTEyZ"," {\n",[389,412,414,417,420,423],{"class":391,"line":413},2,[389,415,416],{"class":399},"  User",[389,418,419],{"class":395},"?",[389,421,422],{"class":409}," data",[389,424,425],{"class":395},";\n",[389,427,429,432,435,438],{"class":391,"line":428},3,[389,430,431],{"class":399},"  bool",[389,433,434],{"class":409}," isLoading ",[389,436,437],{"class":395},"=",[389,439,440],{"class":395}," false;\n",[389,442,444,447,449,452],{"class":391,"line":443},4,[389,445,446],{"class":399},"  Object",[389,448,419],{"class":395},[389,450,451],{"class":409}," error",[389,453,425],{"class":395},[389,455,457,460,462,465],{"class":391,"line":456},5,[389,458,459],{"class":399},"  int",[389,461,419],{"class":395},[389,463,464],{"class":409}," _loadedId",[389,466,425],{"class":395},[389,468,470],{"class":391,"line":469},6,[389,471,473],{"emptyLinePlaceholder":472},true,"\n",[389,475,477,480,483,487,490,494,497,500,503,507],{"class":391,"line":476},7,[389,478,479],{"class":399},"  Future",[389,481,482],{"class":409},"\u003C",[389,484,486],{"class":485},"spNyl","void",[389,488,489],{"class":409},"> ",[389,491,493],{"class":492},"s2Zo4","fetchUser",[389,495,496],{"class":409},"(",[389,498,499],{"class":399},"int",[389,501,502],{"class":409}," id) ",[389,504,506],{"class":505},"s7zQu","async",[389,508,410],{"class":409},[389,510,512,515,518,521,524,527,530,533,536,539,542,545],{"class":391,"line":511},8,[389,513,514],{"class":505},"    if",[389,516,517],{"class":409}," (_loadedId ",[389,519,520],{"class":395},"==",[389,522,523],{"class":409}," id ",[389,525,526],{"class":395},"&&",[389,528,529],{"class":409}," data ",[389,531,532],{"class":395},"!=",[389,534,535],{"class":395}," null",[389,537,538],{"class":409},") ",[389,540,541],{"class":505},"return",[389,543,544],{"class":395},";",[389,546,548],{"class":547},"sHwdD"," // manual cache, no TTL, no SWR\n",[389,550,552,555,557],{"class":391,"line":551},9,[389,553,554],{"class":409},"    isLoading ",[389,556,437],{"class":395},[389,558,559],{"class":395}," true;\n",[389,561,563,566,568],{"class":391,"line":562},10,[389,564,565],{"class":409},"    error ",[389,567,437],{"class":395},[389,569,570],{"class":395}," null;\n",[389,572,574,577,580],{"class":391,"line":573},11,[389,575,576],{"class":492},"    notifyListeners",[389,578,579],{"class":409},"()",[389,581,425],{"class":395},[389,583,585,588],{"class":391,"line":584},12,[389,586,587],{"class":505},"    try",[389,589,410],{"class":409},[389,591,593,596,598,601,604,607,610,613],{"class":391,"line":592},13,[389,594,595],{"class":409},"      data ",[389,597,437],{"class":395},[389,599,600],{"class":505}," await",[389,602,603],{"class":399}," UserApi",[389,605,606],{"class":395},".",[389,608,609],{"class":492},"getUser",[389,611,612],{"class":409},"(id)",[389,614,425],{"class":395},[389,616,618,621,623,626],{"class":391,"line":617},14,[389,619,620],{"class":409},"      _loadedId ",[389,622,437],{"class":395},[389,624,625],{"class":409}," id",[389,627,425],{"class":395},[389,629,631,634,637],{"class":391,"line":630},15,[389,632,633],{"class":409},"    } ",[389,635,636],{"class":505},"catch",[389,638,639],{"class":409}," (e) {\n",[389,641,643,646,648,651,653],{"class":391,"line":642},16,[389,644,645],{"class":409},"      error ",[389,647,437],{"class":395},[389,649,650],{"class":409}," e",[389,652,544],{"class":395},[389,654,655],{"class":547}," // no retry, no backoff\n",[389,657,659,661,664],{"class":391,"line":658},17,[389,660,633],{"class":409},[389,662,663],{"class":505},"finally",[389,665,410],{"class":409},[389,667,669,672,674],{"class":391,"line":668},18,[389,670,671],{"class":409},"      isLoading ",[389,673,437],{"class":395},[389,675,440],{"class":395},[389,677,679,682,684],{"class":391,"line":678},19,[389,680,681],{"class":492},"      notifyListeners",[389,683,579],{"class":409},[389,685,425],{"class":395},[389,687,689],{"class":391,"line":688},20,[389,690,691],{"class":409},"    }\n",[389,693,695],{"class":391,"line":694},21,[389,696,697],{"class":409},"  }\n",[389,699,701],{"class":391,"line":700},22,[389,702,703],{"class":409},"}\n",[379,705,708],{"className":381,"code":706,"filename":707,"language":384,"meta":385,"style":385},"Consumer\u003CUserNotifier>(\n  builder: (context, notifier, _) {\n    if (notifier.isLoading) return const CircularProgressIndicator();\n    if (notifier.error != null) return ErrorWidget('${notifier.error}');\n    if (notifier.data == null) {\n      notifier.fetchUser(userId); // side effect in build, fragile lifecycle\n      return const SizedBox.shrink();\n    }\n    return UserCard(notifier.data!);\n  },\n)\n","lib/user_screen.dart",[352,709,710,723,745,769,818,836,853,872,876,899,907],{"__ignoreMap":385},[389,711,712,715,717,720],{"class":391,"line":392},[389,713,714],{"class":399},"Consumer",[389,716,482],{"class":409},[389,718,719],{"class":399},"UserNotifier",[389,721,722],{"class":409},">(\n",[389,724,725,728,731,734,737,740,742],{"class":391,"line":413},[389,726,727],{"class":409},"  builder",[389,729,730],{"class":395},":",[389,732,733],{"class":409}," (context",[389,735,736],{"class":395},",",[389,738,739],{"class":409}," notifier",[389,741,736],{"class":395},[389,743,744],{"class":409}," _) {\n",[389,746,747,749,752,754,757,759,762,765,767],{"class":391,"line":428},[389,748,514],{"class":505},[389,750,751],{"class":409}," (notifier",[389,753,606],{"class":395},[389,755,756],{"class":409},"isLoading) ",[389,758,541],{"class":505},[389,760,761],{"class":485}," const",[389,763,764],{"class":399}," CircularProgressIndicator",[389,766,579],{"class":409},[389,768,425],{"class":395},[389,770,771,773,775,777,780,782,784,786,788,791,793,797,800,804,806,808,811,813,816],{"class":391,"line":443},[389,772,514],{"class":505},[389,774,751],{"class":409},[389,776,606],{"class":395},[389,778,779],{"class":409},"error ",[389,781,532],{"class":395},[389,783,535],{"class":395},[389,785,538],{"class":409},[389,787,541],{"class":505},[389,789,790],{"class":399}," ErrorWidget",[389,792,496],{"class":409},[389,794,796],{"class":795},"sfazB","'",[389,798,799],{"class":409},"${",[389,801,803],{"class":802},"sHdIc","notifier",[389,805,606],{"class":409},[389,807,362],{"class":802},[389,809,810],{"class":409},"}",[389,812,796],{"class":795},[389,814,815],{"class":409},")",[389,817,425],{"class":395},[389,819,820,822,824,826,829,831,833],{"class":391,"line":456},[389,821,514],{"class":505},[389,823,751],{"class":409},[389,825,606],{"class":395},[389,827,828],{"class":409},"data ",[389,830,520],{"class":395},[389,832,535],{"class":395},[389,834,835],{"class":409},") {\n",[389,837,838,841,843,845,848,850],{"class":391,"line":469},[389,839,840],{"class":409},"      notifier",[389,842,606],{"class":395},[389,844,493],{"class":492},[389,846,847],{"class":409},"(userId)",[389,849,544],{"class":395},[389,851,852],{"class":547}," // side effect in build, fragile lifecycle\n",[389,854,855,858,860,863,865,868,870],{"class":391,"line":476},[389,856,857],{"class":505},"      return",[389,859,761],{"class":485},[389,861,862],{"class":399}," SizedBox",[389,864,606],{"class":395},[389,866,867],{"class":492},"shrink",[389,869,579],{"class":409},[389,871,425],{"class":395},[389,873,874],{"class":391,"line":511},[389,875,691],{"class":409},[389,877,878,881,884,887,889,892,895,897],{"class":391,"line":551},[389,879,880],{"class":505},"    return",[389,882,883],{"class":399}," UserCard",[389,885,886],{"class":409},"(notifier",[389,888,606],{"class":395},[389,890,891],{"class":409},"data",[389,893,894],{"class":395},"!",[389,896,815],{"class":409},[389,898,425],{"class":395},[389,900,901,904],{"class":391,"line":562},[389,902,903],{"class":409},"  }",[389,905,906],{"class":395},",\n",[389,908,909],{"class":391,"line":573},[389,910,911],{"class":409},")\n",[348,913,914],{},"This pattern is written identically for every API call. It also misses: stale-while-revalidate, background refetch on focus/reconnect, request deduplication, and offline support.",[368,916],{},[371,918,920],{"id":919},"after-let-qora-own-server-data","After: Let Qora Own Server Data",[379,922,925],{"className":381,"code":923,"filename":924,"language":384,"meta":385,"style":385},"final qoraClient = QoraClient(\n  config: const QoraClientConfig(\n    defaultOptions: QoraOptions(staleTime: Duration(minutes: 5)),\n  ),\n);\n\nrunApp(\n  MultiProvider(\n    providers: [\n      ChangeNotifierProvider(create: (_) => ThemeNotifier()),\n      ChangeNotifierProvider(create: (_) => AuthNotifier()),\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,926,927,943,957,989,996,1002,1006,1013,1020,1030,1054,1073,1080,1092,1104,1124,1138,1154,1161,1167],{"__ignoreMap":385},[389,928,929,932,935,937,940],{"class":391,"line":392},[389,930,931],{"class":485},"final",[389,933,934],{"class":409}," qoraClient ",[389,936,437],{"class":395},[389,938,939],{"class":399}," QoraClient",[389,941,942],{"class":409},"(\n",[389,944,945,948,950,952,955],{"class":391,"line":413},[389,946,947],{"class":409},"  config",[389,949,730],{"class":395},[389,951,761],{"class":485},[389,953,954],{"class":399}," QoraClientConfig",[389,956,942],{"class":409},[389,958,959,962,964,967,970,972,975,978,980,984,987],{"class":391,"line":428},[389,960,961],{"class":409},"    defaultOptions",[389,963,730],{"class":395},[389,965,966],{"class":399}," QoraOptions",[389,968,969],{"class":409},"(staleTime",[389,971,730],{"class":395},[389,973,974],{"class":399}," Duration",[389,976,977],{"class":409},"(minutes",[389,979,730],{"class":395},[389,981,983],{"class":982},"sbssI"," 5",[389,985,986],{"class":409},"))",[389,988,906],{"class":395},[389,990,991,994],{"class":391,"line":443},[389,992,993],{"class":409},"  )",[389,995,906],{"class":395},[389,997,998,1000],{"class":391,"line":456},[389,999,815],{"class":409},[389,1001,425],{"class":395},[389,1003,1004],{"class":391,"line":469},[389,1005,473],{"emptyLinePlaceholder":472},[389,1007,1008,1011],{"class":391,"line":476},[389,1009,1010],{"class":492},"runApp",[389,1012,942],{"class":409},[389,1014,1015,1018],{"class":391,"line":511},[389,1016,1017],{"class":399},"  MultiProvider",[389,1019,942],{"class":409},[389,1021,1022,1025,1027],{"class":391,"line":551},[389,1023,1024],{"class":409},"    providers",[389,1026,730],{"class":395},[389,1028,1029],{"class":409}," [\n",[389,1031,1032,1035,1038,1040,1043,1046,1049,1052],{"class":391,"line":562},[389,1033,1034],{"class":399},"      ChangeNotifierProvider",[389,1036,1037],{"class":409},"(create",[389,1039,730],{"class":395},[389,1041,1042],{"class":409}," (_) ",[389,1044,1045],{"class":395},"=>",[389,1047,1048],{"class":399}," ThemeNotifier",[389,1050,1051],{"class":409},"())",[389,1053,906],{"class":395},[389,1055,1056,1058,1060,1062,1064,1066,1069,1071],{"class":391,"line":573},[389,1057,1034],{"class":399},[389,1059,1037],{"class":409},[389,1061,730],{"class":395},[389,1063,1042],{"class":409},[389,1065,1045],{"class":395},[389,1067,1068],{"class":399}," AuthNotifier",[389,1070,1051],{"class":409},[389,1072,906],{"class":395},[389,1074,1075,1078],{"class":391,"line":584},[389,1076,1077],{"class":409},"    ]",[389,1079,906],{"class":395},[389,1081,1082,1085,1087,1090],{"class":391,"line":592},[389,1083,1084],{"class":409},"    child",[389,1086,730],{"class":395},[389,1088,1089],{"class":399}," QoraScope",[389,1091,942],{"class":409},[389,1093,1094,1097,1099,1102],{"class":391,"line":617},[389,1095,1096],{"class":409},"      client",[389,1098,730],{"class":395},[389,1100,1101],{"class":409}," qoraClient",[389,1103,906],{"class":395},[389,1105,1106,1109,1111,1114,1117,1119,1122],{"class":391,"line":630},[389,1107,1108],{"class":409},"      lifecycleManager",[389,1110,730],{"class":395},[389,1112,1113],{"class":399}," FlutterLifecycleManager",[389,1115,1116],{"class":409},"(qoraClient",[389,1118,730],{"class":395},[389,1120,1121],{"class":409}," qoraClient)",[389,1123,906],{"class":395},[389,1125,1126,1129,1131,1134,1136],{"class":391,"line":642},[389,1127,1128],{"class":409},"      connectivityManager",[389,1130,730],{"class":395},[389,1132,1133],{"class":399}," FlutterConnectivityManager",[389,1135,579],{"class":409},[389,1137,906],{"class":395},[389,1139,1140,1143,1145,1147,1150,1152],{"class":391,"line":658},[389,1141,1142],{"class":409},"      child",[389,1144,730],{"class":395},[389,1146,761],{"class":485},[389,1148,1149],{"class":399}," MyApp",[389,1151,579],{"class":409},[389,1153,906],{"class":395},[389,1155,1156,1159],{"class":391,"line":668},[389,1157,1158],{"class":409},"    )",[389,1160,906],{"class":395},[389,1162,1163,1165],{"class":391,"line":678},[389,1164,993],{"class":409},[389,1166,906],{"class":395},[389,1168,1169,1171],{"class":391,"line":688},[389,1170,815],{"class":409},[389,1172,425],{"class":395},[379,1174,1176],{"className":381,"code":1175,"filename":707,"language":384,"meta":385,"style":385},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => UserApi.getUser(userId),\n  builder: (context, state, fetchStatus) => 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",[352,1177,1178,1189,1209,1231,1257,1280,1298,1331,1352,1358],{"__ignoreMap":385},[389,1179,1180,1182,1184,1187],{"class":391,"line":392},[389,1181,108],{"class":399},[389,1183,482],{"class":409},[389,1185,1186],{"class":399},"User",[389,1188,722],{"class":409},[389,1190,1191,1194,1196,1199,1202,1204,1207],{"class":391,"line":413},[389,1192,1193],{"class":409},"  queryKey",[389,1195,730],{"class":395},[389,1197,1198],{"class":409}," [",[389,1200,1201],{"class":795},"'users'",[389,1203,736],{"class":395},[389,1205,1206],{"class":409}," userId]",[389,1208,906],{"class":395},[389,1210,1211,1214,1216,1219,1221,1223,1225,1227,1229],{"class":391,"line":428},[389,1212,1213],{"class":409},"  fetcher",[389,1215,730],{"class":395},[389,1217,1218],{"class":409}," () ",[389,1220,1045],{"class":395},[389,1222,603],{"class":399},[389,1224,606],{"class":395},[389,1226,609],{"class":492},[389,1228,847],{"class":409},[389,1230,906],{"class":395},[389,1232,1233,1235,1237,1239,1241,1244,1246,1249,1251,1254],{"class":391,"line":443},[389,1234,727],{"class":409},[389,1236,730],{"class":395},[389,1238,733],{"class":409},[389,1240,736],{"class":395},[389,1242,1243],{"class":409}," state",[389,1245,736],{"class":395},[389,1247,1248],{"class":409}," fetchStatus) ",[389,1250,1045],{"class":395},[389,1252,1253],{"class":505}," switch",[389,1255,1256],{"class":409}," (state) {\n",[389,1258,1259,1262,1264,1266,1268,1271,1273,1275,1278],{"class":391,"line":456},[389,1260,1261],{"class":399},"    Success",[389,1263,496],{"class":409},[389,1265,730],{"class":395},[389,1267,931],{"class":485},[389,1269,1270],{"class":409}," data) ",[389,1272,1045],{"class":395},[389,1274,883],{"class":399},[389,1276,1277],{"class":409},"(data)",[389,1279,906],{"class":395},[389,1281,1282,1285,1288,1290,1292,1294,1296],{"class":391,"line":469},[389,1283,1284],{"class":399},"    Loading",[389,1286,1287],{"class":409},"() ",[389,1289,1045],{"class":395},[389,1291,761],{"class":485},[389,1293,764],{"class":399},[389,1295,579],{"class":409},[389,1297,906],{"class":395},[389,1299,1300,1303,1305,1307,1309,1312,1314,1316,1318,1320,1323,1325,1327,1329],{"class":391,"line":476},[389,1301,1302],{"class":399},"    Failure",[389,1304,496],{"class":409},[389,1306,730],{"class":395},[389,1308,931],{"class":485},[389,1310,1311],{"class":409}," error) ",[389,1313,1045],{"class":395},[389,1315,790],{"class":399},[389,1317,496],{"class":409},[389,1319,796],{"class":795},[389,1321,1322],{"class":409},"$",[389,1324,362],{"class":802},[389,1326,796],{"class":795},[389,1328,815],{"class":409},[389,1330,906],{"class":395},[389,1332,1333,1336,1338,1340,1342,1344,1346,1348,1350],{"class":391,"line":511},[389,1334,1335],{"class":399},"    Initial",[389,1337,1287],{"class":409},[389,1339,1045],{"class":395},[389,1341,761],{"class":485},[389,1343,862],{"class":399},[389,1345,606],{"class":395},[389,1347,867],{"class":492},[389,1349,579],{"class":409},[389,1351,906],{"class":395},[389,1353,1354,1356],{"class":391,"line":551},[389,1355,903],{"class":409},[389,1357,906],{"class":395},[389,1359,1360],{"class":391,"line":562},[389,1361,911],{"class":409},[348,1363,1364],{},"The Qora version removes manual loading flags, notifier notifications, and custom cache guards. Retry, request deduplication, background revalidation, and SWR behavior are built in.",[348,1366,1367,1368,1371,1372,1375,1376,1379],{},"The third builder argument ",[352,1369,1370],{},"fetchStatus"," distinguishes ",[352,1373,1374],{},"FetchStatus.fetching"," from ",[352,1377,1378],{},"FetchStatus.paused"," in offline conditions. Use this state to render a waiting-for-connection indicator instead of a loading spinner.",[368,1381],{},[371,1383,1385],{"id":1384},"division-of-responsibilities","Division of Responsibilities",[1387,1388,1389,1405],"table",{},[1390,1391,1392],"thead",{},[1393,1394,1395,1399,1402],"tr",{},[1396,1397,1398],"th",{},"Responsibility",[1396,1400,1401],{},"Keep in Provider",[1396,1403,1404],{},"Move to Qora",[1406,1407,1408,1424,1435,1446,1457],"tbody",{},[1393,1409,1410,1414,1416],{},[1411,1412,1413],"td",{},"Data fetched from an API (users, products, feeds)",[1411,1415],{},[1411,1417,1418,1420,1421],{},[352,1419,108],{}," + ",[352,1422,1423],{},"fetcher:",[1393,1425,1426,1429,1431],{},[1411,1427,1428],{},"Mutations (create, update, delete)",[1411,1430],{},[1411,1432,1433],{},[352,1434,113],{},[1393,1436,1437,1440,1444],{},[1411,1438,1439],{},"UI state (selected tab, modal open, form values)",[1411,1441,1442],{},[352,1443,354],{},[1411,1445],{},[1393,1447,1448,1451,1455],{},[1411,1449,1450],{},"Authentication session (token in memory)",[1411,1452,1453],{},[352,1454,354],{},[1411,1456],{},[1393,1458,1459,1462,1471],{},[1411,1460,1461],{},"Dependency injection (services, repositories)",[1411,1463,1464,1467,1468],{},[352,1465,1466],{},"Provider"," / ",[352,1469,1470],{},"ChangeNotifierProvider",[1411,1472],{},[368,1474],{},[371,1476,1478],{"id":1477},"key-api-mapping","Key API Mapping",[1387,1480,1481,1491],{},[1390,1482,1483],{},[1393,1484,1485,1488],{},[1396,1486,1487],{},"Provider pattern",[1396,1489,1490],{},"Qora equivalent",[1406,1492,1493,1510,1528,1544,1555],{},[1393,1494,1495,1503],{},[1411,1496,1497,1420,1499,1502],{},[352,1498,354],{},[352,1500,1501],{},"fetch()"," method",[1411,1504,1505,1507,1508],{},[352,1506,108],{}," with ",[352,1509,1423],{},[1393,1511,1512,1520],{},[1411,1513,1514,1516,1517],{},[352,1515,714],{}," + ternary on ",[352,1518,1519],{},"isLoading / error / data",[1411,1521,1522,1525,1526],{},[352,1523,1524],{},"switch (state)"," on ",[352,1527,211],{},[1393,1529,1530,1536],{},[1411,1531,1532,1533],{},"Manual ",[352,1534,1535],{},"if (data != null) return",[1411,1537,1538,1541,1542],{},[352,1539,1540],{},"staleTime"," in ",[352,1543,215],{},[1393,1545,1546,1551],{},[1411,1547,1548,1550],{},[352,1549,1470],{}," (data layer)",[1411,1552,1553],{},[352,1554,103],{},[1393,1556,1557,1563],{},[1411,1558,1559,1562],{},[352,1560,1561],{},"notifyListeners()"," after write",[1411,1564,1565],{},[352,1566,1567],{},"client.invalidate(key)",[368,1569],{},[371,1571,1573],{"id":1572},"checklist","Checklist",[1575,1576,1579,1600,1613,1628,1639,1647,1657],"ul",{"className":1577},[1578],"contains-task-list",[1580,1581,1584,1588,1589,1592,1593,1596,1597],"li",{"className":1582},[1583],"task-list-item",[1585,1586],"input",{"disabled":472,"type":1587},"checkbox"," Add ",[352,1590,1591],{},"qora_flutter"," to ",[352,1594,1595],{},"pubspec.yaml"," and run ",[352,1598,1599],{},"flutter pub get",[1580,1601,1603,1605,1606,1608,1609,1612],{"className":1602},[1583],[1585,1604],{"disabled":472,"type":1587}," Nest ",[352,1607,103],{}," inside existing ",[352,1610,1611],{},"MultiProvider"," root (not a replacement)",[1580,1614,1616,1618,1619,1621,1622,1624,1625,1627],{"className":1615},[1583],[1585,1617],{"disabled":472,"type":1587}," Identify ",[352,1620,354],{}," classes that only fetch and emit loading/error/data and replace them with ",[352,1623,108],{}," (",[352,1626,1423],{},", 3-arg builder)",[1580,1629,1631,1633,1634,1636,1637],{"className":1630},[1583],[1585,1632],{"disabled":472,"type":1587}," Replace ",[352,1635,714],{}," loading/error/data ternaries with ",[352,1638,1524],{},[1580,1640,1642,1644,1645],{"className":1641},[1583],[1585,1643],{"disabled":472,"type":1587}," Replace manual cache guards with ",[352,1646,1540],{},[1580,1648,1650,1633,1652,1654,1655],{"className":1649},[1583],[1585,1651],{"disabled":472,"type":1587},[352,1653,1561],{}," post-write with ",[352,1656,1567],{},[1580,1658,1660,1662,1663,1665],{"className":1659},[1583],[1585,1661],{"disabled":472,"type":1587}," Keep ",[352,1664,1470],{}," entries for UI state, auth, and DI",[368,1667],{},[371,1669,1671],{"id":1670},"related","Related",[1575,1673,1674,1680,1685],{},[1580,1675,1676],{},[1677,1678,98],"a",{"href":1679},"../flutter-integration/setup",[1580,1681,1682],{},[1677,1683,108],{"href":1684},"../flutter-integration/qora-builder",[1580,1686,1687],{},[1677,1688,21],{"href":1689},"../getting-started/quick-start",[1691,1692,1693],"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 .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 .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 .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":385,"searchDepth":413,"depth":413,"links":1695},[1696,1697,1698,1699,1700,1701],{"id":373,"depth":413,"text":374},{"id":919,"depth":413,"text":920},{"id":1384,"depth":413,"text":1385},{"id":1477,"depth":413,"text":1478},{"id":1572,"depth":413,"text":1573},{"id":1670,"depth":413,"text":1671},"Add Qora to an existing Provider app to specialize server-state handling while preserving Provider for UI state and dependency injection.","md",null,{},{"icon":267},{"title":264,"description":1702},"zMveGNGKeURnaqJuKJzdSE_IBqTVg5EQX2FMyuhw32M",[1710,1712],{"title":253,"path":254,"stem":255,"description":1711,"icon":256,"children":-1},"How cached query data is turned into the JSON tree shown in the overlay, and how to make custom model types readable.",{"title":269,"path":270,"stem":271,"description":1713,"icon":111,"children":-1},"Use Qora for server-state and BLoC for UI state machines, with explicit separation of concerns.",1794040401445]