[{"data":1,"prerenderedAt":2375},["ShallowReactive",2],{"navigation_docs_en":3,"-en-third-party-with-bloc":342,"-en-third-party-with-bloc-surround":2370},[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":269,"body":344,"description":2363,"extension":2364,"links":2365,"meta":2366,"navigation":2367,"path":270,"seo":2368,"stem":271,"__hash__":2369},"docs_en/en/07.third-party/2.with-bloc.md",{"type":345,"value":346,"toc":2353},"minimark",[347,351,354,357,362,475,485,487,491,494,930,1080,1082,1086,1307,1310,1325,1327,1331,1334,1725,1728,1730,1734,1737,1983,1993,1995,1998,2225,2234,2236,2240,2319,2321,2325,2349],[348,349,350],"p",{},"BLoC is effective for complex UI state machines such as multi-step checkout, authentication flows, and form orchestration. It is less efficient for repetitive server-state operations such as fetch, cache, retry, and background revalidation.",[348,352,353],{},"In a combined architecture, BLoC remains responsible for UI transitions and Qora manages server-state lifecycles.",[355,356],"hr",{},[358,359,361],"h2",{"id":360},"division-of-labour","Division of Labour",[363,364,365,381],"table",{},[366,367,368],"thead",{},[369,370,371,375,378],"tr",{},[372,373,374],"th",{},"Responsibility",[372,376,377],{},"BLoC",[372,379,380],{},"Qora",[382,383,384,397,411,422,434,447,459],"tbody",{},[369,385,386,390,392],{},[387,388,389],"td",{},"Fetch user profile",[387,391],{},[387,393,394],{},[395,396,108],"code",{},[369,398,399,402,404],{},[387,400,401],{},"Fetch product list / infinite feed",[387,403],{},[387,405,406,408,409],{},[395,407,108],{}," / ",[395,410,118],{},[369,412,413,416,418],{},[387,414,415],{},"Create, update, delete (mutations)",[387,417],{},[387,419,420],{},[395,421,113],{},[369,423,424,427,432],{},[387,425,426],{},"Multi-step checkout flow",[387,428,429],{},[395,430,431],{},"CheckoutBloc",[387,433],{},[369,435,436,439,445],{},[387,437,438],{},"Form validation state",[387,440,441,442],{},"BLoC or ",[395,443,444],{},"ValueNotifier",[387,446],{},[369,448,449,452,457],{},[387,450,451],{},"Authentication flow",[387,453,454],{},[395,455,456],{},"AuthBloc",[387,458],{},[369,460,461,464,466],{},[387,462,463],{},"Optimistic UI + cache invalidation after write",[387,465],{},[387,467,468,471,472],{},[395,469,470],{},"setQueryData"," + ",[395,473,474],{},"invalidate",[348,476,477,478,480,481,484],{},"The two coexist cleanly: ",[395,479,103],{}," nests inside the ",[395,482,483],{},"BlocProvider"," tree (or vice versa).",[355,486],{},[358,488,490],{"id":489},"the-anti-pattern-data-fetching-bloc","The Anti-Pattern: Data-Fetching BLoC",[348,492,493],{},"A BLoC that only wraps an API call provides no structural benefit over a function call, yet carries the full overhead of events, states, and wiring:",[495,496,502],"pre",{"className":497,"code":498,"filename":499,"language":500,"meta":501,"style":501},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","abstract class UserEvent {}\nclass LoadUser extends UserEvent { final int id; LoadUser(this.id); }\n\nabstract class UserState {}\nclass UserInitial extends UserState {}\nclass UserLoading extends UserState {}\nclass UserLoaded extends UserState { final User user; UserLoaded(this.user); }\nclass UserError extends UserState { final String message; UserError(this.message); }\n\nclass UserBloc extends Bloc\u003CUserEvent, UserState> {\n  final UserApi _api;\n\n  UserBloc(this._api) : super(UserInitial()) {\n    on\u003CLoadUser>((event, emit) async {\n      emit(UserLoading());\n      try {\n        emit(UserLoaded(await _api.getUser(event.id)));\n      } catch (e) {\n        emit(UserError('$e')); // no retry, no deduplication, no SWR\n      }\n    });\n  }\n}\n","lib/blocs/user_bloc.dart","dart","",[395,503,504,524,570,577,589,603,617,654,691,696,724,739,744,769,799,817,825,858,870,904,910,918,924],{"__ignoreMap":501},[505,506,509,513,516,520],"span",{"class":507,"line":508},"line",1,[505,510,512],{"class":511},"sMK4o","abstract",[505,514,515],{"class":511}," class",[505,517,519],{"class":518},"sBMFI"," UserEvent",[505,521,523],{"class":522},"sTEyZ"," {}\n",[505,525,527,530,533,536,538,541,545,548,551,554,556,559,562,565,567],{"class":507,"line":526},2,[505,528,529],{"class":511},"class",[505,531,532],{"class":518}," LoadUser",[505,534,535],{"class":511}," extends",[505,537,519],{"class":518},[505,539,540],{"class":522}," { ",[505,542,544],{"class":543},"spNyl","final",[505,546,547],{"class":518}," int",[505,549,550],{"class":522}," id",[505,552,553],{"class":511},";",[505,555,532],{"class":518},[505,557,558],{"class":522},"(this",[505,560,561],{"class":511},".",[505,563,564],{"class":522},"id)",[505,566,553],{"class":511},[505,568,569],{"class":522}," }\n",[505,571,573],{"class":507,"line":572},3,[505,574,576],{"emptyLinePlaceholder":575},true,"\n",[505,578,580,582,584,587],{"class":507,"line":579},4,[505,581,512],{"class":511},[505,583,515],{"class":511},[505,585,586],{"class":518}," UserState",[505,588,523],{"class":522},[505,590,592,594,597,599,601],{"class":507,"line":591},5,[505,593,529],{"class":511},[505,595,596],{"class":518}," UserInitial",[505,598,535],{"class":511},[505,600,586],{"class":518},[505,602,523],{"class":522},[505,604,606,608,611,613,615],{"class":507,"line":605},6,[505,607,529],{"class":511},[505,609,610],{"class":518}," UserLoading",[505,612,535],{"class":511},[505,614,586],{"class":518},[505,616,523],{"class":522},[505,618,620,622,625,627,629,631,633,636,639,641,643,645,647,650,652],{"class":507,"line":619},7,[505,621,529],{"class":511},[505,623,624],{"class":518}," UserLoaded",[505,626,535],{"class":511},[505,628,586],{"class":518},[505,630,540],{"class":522},[505,632,544],{"class":543},[505,634,635],{"class":518}," User",[505,637,638],{"class":522}," user",[505,640,553],{"class":511},[505,642,624],{"class":518},[505,644,558],{"class":522},[505,646,561],{"class":511},[505,648,649],{"class":522},"user)",[505,651,553],{"class":511},[505,653,569],{"class":522},[505,655,657,659,662,664,666,668,670,673,676,678,680,682,684,687,689],{"class":507,"line":656},8,[505,658,529],{"class":511},[505,660,661],{"class":518}," UserError",[505,663,535],{"class":511},[505,665,586],{"class":518},[505,667,540],{"class":522},[505,669,544],{"class":543},[505,671,672],{"class":518}," String",[505,674,675],{"class":522}," message",[505,677,553],{"class":511},[505,679,661],{"class":518},[505,681,558],{"class":522},[505,683,561],{"class":511},[505,685,686],{"class":522},"message)",[505,688,553],{"class":511},[505,690,569],{"class":522},[505,692,694],{"class":507,"line":693},9,[505,695,576],{"emptyLinePlaceholder":575},[505,697,699,701,704,706,709,712,715,718,721],{"class":507,"line":698},10,[505,700,529],{"class":511},[505,702,703],{"class":518}," UserBloc",[505,705,535],{"class":511},[505,707,708],{"class":518}," Bloc",[505,710,711],{"class":522},"\u003C",[505,713,714],{"class":518},"UserEvent",[505,716,717],{"class":522},", ",[505,719,720],{"class":518},"UserState",[505,722,723],{"class":522},"> {\n",[505,725,727,730,733,736],{"class":507,"line":726},11,[505,728,729],{"class":543},"  final",[505,731,732],{"class":518}," UserApi",[505,734,735],{"class":522}," _api",[505,737,738],{"class":511},";\n",[505,740,742],{"class":507,"line":741},12,[505,743,576],{"emptyLinePlaceholder":575},[505,745,747,750,752,754,757,760,763,766],{"class":507,"line":746},13,[505,748,749],{"class":518},"  UserBloc",[505,751,558],{"class":522},[505,753,561],{"class":511},[505,755,756],{"class":522},"_api) ",[505,758,759],{"class":511},":",[505,761,762],{"class":522}," super(",[505,764,765],{"class":518},"UserInitial",[505,767,768],{"class":522},"()) {\n",[505,770,772,776,778,781,784,787,790,793,796],{"class":507,"line":771},14,[505,773,775],{"class":774},"s7zQu","    on",[505,777,711],{"class":511},[505,779,780],{"class":518},"LoadUser",[505,782,783],{"class":511},">",[505,785,786],{"class":522},"((event",[505,788,789],{"class":511},",",[505,791,792],{"class":522}," emit) ",[505,794,795],{"class":774},"async",[505,797,798],{"class":522}," {\n",[505,800,802,806,809,812,815],{"class":507,"line":801},15,[505,803,805],{"class":804},"s2Zo4","      emit",[505,807,808],{"class":522},"(",[505,810,811],{"class":518},"UserLoading",[505,813,814],{"class":522},"())",[505,816,738],{"class":511},[505,818,820,823],{"class":507,"line":819},16,[505,821,822],{"class":774},"      try",[505,824,798],{"class":522},[505,826,828,831,833,836,838,841,843,845,848,851,853,856],{"class":507,"line":827},17,[505,829,830],{"class":804},"        emit",[505,832,808],{"class":522},[505,834,835],{"class":518},"UserLoaded",[505,837,808],{"class":522},[505,839,840],{"class":774},"await",[505,842,735],{"class":522},[505,844,561],{"class":511},[505,846,847],{"class":804},"getUser",[505,849,850],{"class":522},"(event",[505,852,561],{"class":511},[505,854,855],{"class":522},"id)))",[505,857,738],{"class":511},[505,859,861,864,867],{"class":507,"line":860},18,[505,862,863],{"class":522},"      } ",[505,865,866],{"class":774},"catch",[505,868,869],{"class":522}," (e) {\n",[505,871,873,875,877,880,882,886,889,893,895,898,900],{"class":507,"line":872},19,[505,874,830],{"class":804},[505,876,808],{"class":522},[505,878,879],{"class":518},"UserError",[505,881,808],{"class":522},[505,883,885],{"class":884},"sfazB","'",[505,887,888],{"class":522},"$",[505,890,892],{"class":891},"sHdIc","e",[505,894,885],{"class":884},[505,896,897],{"class":522},"))",[505,899,553],{"class":511},[505,901,903],{"class":902},"sHwdD"," // no retry, no deduplication, no SWR\n",[505,905,907],{"class":507,"line":906},20,[505,908,909],{"class":522},"      }\n",[505,911,913,916],{"class":507,"line":912},21,[505,914,915],{"class":522},"    })",[505,917,738],{"class":511},[505,919,921],{"class":507,"line":920},22,[505,922,923],{"class":522},"  }\n",[505,925,927],{"class":507,"line":926},23,[505,928,929],{"class":522},"}\n",[495,931,934],{"className":497,"code":932,"filename":933,"language":500,"meta":501,"style":501},"BlocBuilder\u003CUserBloc, UserState>(\n  builder: (context, state) => switch (state) {\n    UserLoading() => const CircularProgressIndicator(),\n    UserLoaded(:final user) => UserCard(user),\n    UserError(:final message) => ErrorWidget(message),\n    _ => const SizedBox.shrink(),\n  },\n)\n","lib/user_screen.dart",[395,935,936,953,977,999,1023,1047,1068,1075],{"__ignoreMap":501},[505,937,938,941,943,946,948,950],{"class":507,"line":508},[505,939,940],{"class":518},"BlocBuilder",[505,942,711],{"class":522},[505,944,945],{"class":518},"UserBloc",[505,947,717],{"class":522},[505,949,720],{"class":518},[505,951,952],{"class":522},">(\n",[505,954,955,958,960,963,965,968,971,974],{"class":507,"line":526},[505,956,957],{"class":522},"  builder",[505,959,759],{"class":511},[505,961,962],{"class":522}," (context",[505,964,789],{"class":511},[505,966,967],{"class":522}," state) ",[505,969,970],{"class":511},"=>",[505,972,973],{"class":774}," switch",[505,975,976],{"class":522}," (state) {\n",[505,978,979,982,985,987,990,993,996],{"class":507,"line":572},[505,980,981],{"class":518},"    UserLoading",[505,983,984],{"class":522},"() ",[505,986,970],{"class":511},[505,988,989],{"class":543}," const",[505,991,992],{"class":518}," CircularProgressIndicator",[505,994,995],{"class":522},"()",[505,997,998],{"class":511},",\n",[505,1000,1001,1004,1006,1008,1010,1013,1015,1018,1021],{"class":507,"line":579},[505,1002,1003],{"class":518},"    UserLoaded",[505,1005,808],{"class":522},[505,1007,759],{"class":511},[505,1009,544],{"class":543},[505,1011,1012],{"class":522}," user) ",[505,1014,970],{"class":511},[505,1016,1017],{"class":518}," UserCard",[505,1019,1020],{"class":522},"(user)",[505,1022,998],{"class":511},[505,1024,1025,1028,1030,1032,1034,1037,1039,1042,1045],{"class":507,"line":591},[505,1026,1027],{"class":518},"    UserError",[505,1029,808],{"class":522},[505,1031,759],{"class":511},[505,1033,544],{"class":543},[505,1035,1036],{"class":522}," message) ",[505,1038,970],{"class":511},[505,1040,1041],{"class":518}," ErrorWidget",[505,1043,1044],{"class":522},"(message)",[505,1046,998],{"class":511},[505,1048,1049,1052,1054,1056,1059,1061,1064,1066],{"class":507,"line":605},[505,1050,1051],{"class":522},"    _ ",[505,1053,970],{"class":511},[505,1055,989],{"class":543},[505,1057,1058],{"class":518}," SizedBox",[505,1060,561],{"class":511},[505,1062,1063],{"class":804},"shrink",[505,1065,995],{"class":522},[505,1067,998],{"class":511},[505,1069,1070,1073],{"class":507,"line":619},[505,1071,1072],{"class":522},"  }",[505,1074,998],{"class":511},[505,1076,1077],{"class":507,"line":656},[505,1078,1079],{"class":522},")\n",[355,1081],{},[358,1083,1085],{"id":1084},"after-qorabuilder-for-server-data","After: QoraBuilder for Server Data",[495,1087,1089],{"className":497,"code":1088,"filename":933,"language":500,"meta":501,"style":501},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => UserApi.getUser(userId),\n  options: const QoraOptions(staleTime: Duration(minutes: 5)),\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",[395,1090,1091,1102,1122,1145,1178,1202,1225,1242,1276,1297,1303],{"__ignoreMap":501},[505,1092,1093,1095,1097,1100],{"class":507,"line":508},[505,1094,108],{"class":518},[505,1096,711],{"class":522},[505,1098,1099],{"class":518},"User",[505,1101,952],{"class":522},[505,1103,1104,1107,1109,1112,1115,1117,1120],{"class":507,"line":526},[505,1105,1106],{"class":522},"  queryKey",[505,1108,759],{"class":511},[505,1110,1111],{"class":522}," [",[505,1113,1114],{"class":884},"'users'",[505,1116,789],{"class":511},[505,1118,1119],{"class":522}," userId]",[505,1121,998],{"class":511},[505,1123,1124,1127,1129,1132,1134,1136,1138,1140,1143],{"class":507,"line":572},[505,1125,1126],{"class":522},"  fetcher",[505,1128,759],{"class":511},[505,1130,1131],{"class":522}," () ",[505,1133,970],{"class":511},[505,1135,732],{"class":518},[505,1137,561],{"class":511},[505,1139,847],{"class":804},[505,1141,1142],{"class":522},"(userId)",[505,1144,998],{"class":511},[505,1146,1147,1150,1152,1154,1157,1160,1162,1165,1168,1170,1174,1176],{"class":507,"line":579},[505,1148,1149],{"class":522},"  options",[505,1151,759],{"class":511},[505,1153,989],{"class":543},[505,1155,1156],{"class":518}," QoraOptions",[505,1158,1159],{"class":522},"(staleTime",[505,1161,759],{"class":511},[505,1163,1164],{"class":518}," Duration",[505,1166,1167],{"class":522},"(minutes",[505,1169,759],{"class":511},[505,1171,1173],{"class":1172},"sbssI"," 5",[505,1175,897],{"class":522},[505,1177,998],{"class":511},[505,1179,1180,1182,1184,1186,1188,1191,1193,1196,1198,1200],{"class":507,"line":591},[505,1181,957],{"class":522},[505,1183,759],{"class":511},[505,1185,962],{"class":522},[505,1187,789],{"class":511},[505,1189,1190],{"class":522}," state",[505,1192,789],{"class":511},[505,1194,1195],{"class":522}," fetchStatus) ",[505,1197,970],{"class":511},[505,1199,973],{"class":774},[505,1201,976],{"class":522},[505,1203,1204,1207,1209,1211,1213,1216,1218,1220,1223],{"class":507,"line":605},[505,1205,1206],{"class":518},"    Success",[505,1208,808],{"class":522},[505,1210,759],{"class":511},[505,1212,544],{"class":543},[505,1214,1215],{"class":522}," data) ",[505,1217,970],{"class":511},[505,1219,1017],{"class":518},[505,1221,1222],{"class":522},"(data)",[505,1224,998],{"class":511},[505,1226,1227,1230,1232,1234,1236,1238,1240],{"class":507,"line":619},[505,1228,1229],{"class":518},"    Loading",[505,1231,984],{"class":522},[505,1233,970],{"class":511},[505,1235,989],{"class":543},[505,1237,992],{"class":518},[505,1239,995],{"class":522},[505,1241,998],{"class":511},[505,1243,1244,1247,1249,1251,1253,1256,1258,1260,1262,1264,1266,1269,1271,1274],{"class":507,"line":656},[505,1245,1246],{"class":518},"    Failure",[505,1248,808],{"class":522},[505,1250,759],{"class":511},[505,1252,544],{"class":543},[505,1254,1255],{"class":522}," error) ",[505,1257,970],{"class":511},[505,1259,1041],{"class":518},[505,1261,808],{"class":522},[505,1263,885],{"class":884},[505,1265,888],{"class":522},[505,1267,1268],{"class":891},"error",[505,1270,885],{"class":884},[505,1272,1273],{"class":522},")",[505,1275,998],{"class":511},[505,1277,1278,1281,1283,1285,1287,1289,1291,1293,1295],{"class":507,"line":693},[505,1279,1280],{"class":518},"    Initial",[505,1282,984],{"class":522},[505,1284,970],{"class":511},[505,1286,989],{"class":543},[505,1288,1058],{"class":518},[505,1290,561],{"class":511},[505,1292,1063],{"class":804},[505,1294,995],{"class":522},[505,1296,998],{"class":511},[505,1298,1299,1301],{"class":507,"line":698},[505,1300,1072],{"class":522},[505,1302,998],{"class":511},[505,1304,1305],{"class":507,"line":726},[505,1306,1079],{"class":522},[348,1308,1309],{},"For data-only reads, Qora removes event/state boilerplate and manual transition code. Retry with backoff, request deduplication, and background revalidation on focus or reconnect are built in.",[348,1311,1312,1313,1316,1317,1320,1321,1324],{},"The third builder argument ",[395,1314,1315],{},"fetchStatus"," distinguishes active requests (",[395,1318,1319],{},"FetchStatus.fetching",") from paused offline requests (",[395,1322,1323],{},"FetchStatus.paused",").",[355,1326],{},[358,1328,1330],{"id":1329},"bloc-qora-on-the-same-screen","BLoC + Qora on the Same Screen",[348,1332,1333],{},"Complex screens often need both: a UI state machine (BLoC) driving a view that also displays server data (Qora). They compose without friction:",[495,1335,1338],{"className":497,"code":1336,"filename":1337,"language":500,"meta":501,"style":501},"BlocBuilder\u003CCheckoutBloc, CheckoutState>(\n  builder: (context, checkoutState) {\n    // CheckoutBloc drives the step machine\n    if (checkoutState is SelectingAddress) {\n      return QoraBuilder\u003CList\u003CAddress>>(\n        queryKey: ['users', userId, 'addresses'],\n        fetcher: () => api.getAddresses(userId),\n        builder: (context, state, fetchStatus) => switch (state) {\n          Success(:final data) => AddressSelector(\n              addresses: data,\n              onSelect: (address) =>\n                context.read\u003CCheckoutBloc>().add(AddressSelected(address)),\n            ),\n          Loading() => const CircularProgressIndicator(),\n          Failure(:final error)=> ErrorWidget('$error'),\n          Initial() => const SizedBox.shrink(),\n        },\n      );\n    }\n    if (checkoutState is ReviewingOrder) {\n      return OrderReviewWidget(order: checkoutState.order);\n    }\n    return const SizedBox.shrink();\n  },\n)\n","lib/checkout_screen.dart",[395,1339,1340,1355,1368,1373,1390,1411,1437,1460,1483,1504,1516,1529,1561,1568,1585,1617,1638,1645,1652,1657,1670,1692,1696,1713,1720],{"__ignoreMap":501},[505,1341,1342,1344,1346,1348,1350,1353],{"class":507,"line":508},[505,1343,940],{"class":518},[505,1345,711],{"class":522},[505,1347,431],{"class":518},[505,1349,717],{"class":522},[505,1351,1352],{"class":518},"CheckoutState",[505,1354,952],{"class":522},[505,1356,1357,1359,1361,1363,1365],{"class":507,"line":526},[505,1358,957],{"class":522},[505,1360,759],{"class":511},[505,1362,962],{"class":522},[505,1364,789],{"class":511},[505,1366,1367],{"class":522}," checkoutState) {\n",[505,1369,1370],{"class":507,"line":572},[505,1371,1372],{"class":902},"    // CheckoutBloc drives the step machine\n",[505,1374,1375,1378,1381,1384,1387],{"class":507,"line":579},[505,1376,1377],{"class":774},"    if",[505,1379,1380],{"class":522}," (checkoutState ",[505,1382,1383],{"class":511},"is",[505,1385,1386],{"class":518}," SelectingAddress",[505,1388,1389],{"class":522},") {\n",[505,1391,1392,1395,1398,1400,1403,1405,1408],{"class":507,"line":591},[505,1393,1394],{"class":774},"      return",[505,1396,1397],{"class":518}," QoraBuilder",[505,1399,711],{"class":522},[505,1401,1402],{"class":518},"List",[505,1404,711],{"class":522},[505,1406,1407],{"class":518},"Address",[505,1409,1410],{"class":522},">>(\n",[505,1412,1413,1416,1418,1420,1422,1424,1427,1429,1432,1435],{"class":507,"line":605},[505,1414,1415],{"class":522},"        queryKey",[505,1417,759],{"class":511},[505,1419,1111],{"class":522},[505,1421,1114],{"class":884},[505,1423,789],{"class":511},[505,1425,1426],{"class":522}," userId",[505,1428,789],{"class":511},[505,1430,1431],{"class":884}," 'addresses'",[505,1433,1434],{"class":522},"]",[505,1436,998],{"class":511},[505,1438,1439,1442,1444,1446,1448,1451,1453,1456,1458],{"class":507,"line":619},[505,1440,1441],{"class":522},"        fetcher",[505,1443,759],{"class":511},[505,1445,1131],{"class":522},[505,1447,970],{"class":511},[505,1449,1450],{"class":522}," api",[505,1452,561],{"class":511},[505,1454,1455],{"class":804},"getAddresses",[505,1457,1142],{"class":522},[505,1459,998],{"class":511},[505,1461,1462,1465,1467,1469,1471,1473,1475,1477,1479,1481],{"class":507,"line":656},[505,1463,1464],{"class":522},"        builder",[505,1466,759],{"class":511},[505,1468,962],{"class":522},[505,1470,789],{"class":511},[505,1472,1190],{"class":522},[505,1474,789],{"class":511},[505,1476,1195],{"class":522},[505,1478,970],{"class":511},[505,1480,973],{"class":774},[505,1482,976],{"class":522},[505,1484,1485,1488,1490,1492,1494,1496,1498,1501],{"class":507,"line":693},[505,1486,1487],{"class":518},"          Success",[505,1489,808],{"class":522},[505,1491,759],{"class":511},[505,1493,544],{"class":543},[505,1495,1215],{"class":522},[505,1497,970],{"class":511},[505,1499,1500],{"class":518}," AddressSelector",[505,1502,1503],{"class":522},"(\n",[505,1505,1506,1509,1511,1514],{"class":507,"line":698},[505,1507,1508],{"class":522},"              addresses",[505,1510,759],{"class":511},[505,1512,1513],{"class":522}," data",[505,1515,998],{"class":511},[505,1517,1518,1521,1523,1526],{"class":507,"line":726},[505,1519,1520],{"class":522},"              onSelect",[505,1522,759],{"class":511},[505,1524,1525],{"class":522}," (address) ",[505,1527,1528],{"class":511},"=>\n",[505,1530,1531,1534,1536,1539,1541,1543,1546,1548,1551,1553,1556,1559],{"class":507,"line":741},[505,1532,1533],{"class":522},"                context",[505,1535,561],{"class":511},[505,1537,1538],{"class":804},"read",[505,1540,711],{"class":522},[505,1542,431],{"class":518},[505,1544,1545],{"class":522},">()",[505,1547,561],{"class":511},[505,1549,1550],{"class":804},"add",[505,1552,808],{"class":522},[505,1554,1555],{"class":518},"AddressSelected",[505,1557,1558],{"class":522},"(address))",[505,1560,998],{"class":511},[505,1562,1563,1566],{"class":507,"line":746},[505,1564,1565],{"class":522},"            )",[505,1567,998],{"class":511},[505,1569,1570,1573,1575,1577,1579,1581,1583],{"class":507,"line":771},[505,1571,1572],{"class":518},"          Loading",[505,1574,984],{"class":522},[505,1576,970],{"class":511},[505,1578,989],{"class":543},[505,1580,992],{"class":518},[505,1582,995],{"class":522},[505,1584,998],{"class":511},[505,1586,1587,1590,1592,1594,1596,1599,1601,1603,1605,1607,1609,1611,1613,1615],{"class":507,"line":801},[505,1588,1589],{"class":518},"          Failure",[505,1591,808],{"class":522},[505,1593,759],{"class":511},[505,1595,544],{"class":543},[505,1597,1598],{"class":522}," error)",[505,1600,970],{"class":511},[505,1602,1041],{"class":518},[505,1604,808],{"class":522},[505,1606,885],{"class":884},[505,1608,888],{"class":522},[505,1610,1268],{"class":891},[505,1612,885],{"class":884},[505,1614,1273],{"class":522},[505,1616,998],{"class":511},[505,1618,1619,1622,1624,1626,1628,1630,1632,1634,1636],{"class":507,"line":819},[505,1620,1621],{"class":518},"          Initial",[505,1623,984],{"class":522},[505,1625,970],{"class":511},[505,1627,989],{"class":543},[505,1629,1058],{"class":518},[505,1631,561],{"class":511},[505,1633,1063],{"class":804},[505,1635,995],{"class":522},[505,1637,998],{"class":511},[505,1639,1640,1643],{"class":507,"line":827},[505,1641,1642],{"class":522},"        }",[505,1644,998],{"class":511},[505,1646,1647,1650],{"class":507,"line":860},[505,1648,1649],{"class":522},"      )",[505,1651,738],{"class":511},[505,1653,1654],{"class":507,"line":872},[505,1655,1656],{"class":522},"    }\n",[505,1658,1659,1661,1663,1665,1668],{"class":507,"line":906},[505,1660,1377],{"class":774},[505,1662,1380],{"class":522},[505,1664,1383],{"class":511},[505,1666,1667],{"class":518}," ReviewingOrder",[505,1669,1389],{"class":522},[505,1671,1672,1674,1677,1680,1682,1685,1687,1690],{"class":507,"line":912},[505,1673,1394],{"class":774},[505,1675,1676],{"class":518}," OrderReviewWidget",[505,1678,1679],{"class":522},"(order",[505,1681,759],{"class":511},[505,1683,1684],{"class":522}," checkoutState",[505,1686,561],{"class":511},[505,1688,1689],{"class":522},"order)",[505,1691,738],{"class":511},[505,1693,1694],{"class":507,"line":920},[505,1695,1656],{"class":522},[505,1697,1698,1701,1703,1705,1707,1709,1711],{"class":507,"line":926},[505,1699,1700],{"class":774},"    return",[505,1702,989],{"class":543},[505,1704,1058],{"class":518},[505,1706,561],{"class":511},[505,1708,1063],{"class":804},[505,1710,995],{"class":522},[505,1712,738],{"class":511},[505,1714,1716,1718],{"class":507,"line":1715},24,[505,1717,1072],{"class":522},[505,1719,998],{"class":511},[505,1721,1723],{"class":507,"line":1722},25,[505,1724,1079],{"class":522},[348,1726,1727],{},"BLoC controls step selection. Qora provides server data inside each step.",[355,1729],{},[358,1731,1733],{"id":1732},"invalidating-qora-from-a-bloc","Invalidating Qora from a BLoC",[348,1735,1736],{},"When a BLoC performs a write (a form submission, a completed checkout step), it can invalidate Qora's cache so the next read gets fresh data:",[495,1738,1741],{"className":497,"code":1739,"filename":1740,"language":500,"meta":501,"style":501},"class UpdateUserBloc extends Bloc\u003CUpdateUserEvent, UpdateUserState> {\n  final QoraClient _client;\n  final UserApi _api;\n\n  UpdateUserBloc(this._client, this._api) : super(UpdateUserInitial()) {\n    on\u003CSubmitUpdate>((event, emit) async {\n      emit(UpdateUserLoading());\n      try {\n        await _api.updateUser(event.id, event.name);\n        _client.invalidate(['users', event.id]); // Qora refetches on next read\n        emit(UpdateUserSuccess());\n      } catch (e) {\n        emit(UpdateUserError('$e'));\n      }\n    });\n  }\n}\n","lib/blocs/update_user_bloc.dart",[395,1742,1743,1766,1778,1788,1792,1822,1843,1856,1862,1893,1921,1934,1942,1965,1969,1975,1979],{"__ignoreMap":501},[505,1744,1745,1747,1750,1752,1754,1756,1759,1761,1764],{"class":507,"line":508},[505,1746,529],{"class":511},[505,1748,1749],{"class":518}," UpdateUserBloc",[505,1751,535],{"class":511},[505,1753,708],{"class":518},[505,1755,711],{"class":522},[505,1757,1758],{"class":518},"UpdateUserEvent",[505,1760,717],{"class":522},[505,1762,1763],{"class":518},"UpdateUserState",[505,1765,723],{"class":522},[505,1767,1768,1770,1773,1776],{"class":507,"line":526},[505,1769,729],{"class":543},[505,1771,1772],{"class":518}," QoraClient",[505,1774,1775],{"class":522}," _client",[505,1777,738],{"class":511},[505,1779,1780,1782,1784,1786],{"class":507,"line":572},[505,1781,729],{"class":543},[505,1783,732],{"class":518},[505,1785,735],{"class":522},[505,1787,738],{"class":511},[505,1789,1790],{"class":507,"line":579},[505,1791,576],{"emptyLinePlaceholder":575},[505,1793,1794,1797,1799,1801,1804,1806,1809,1811,1813,1815,1817,1820],{"class":507,"line":591},[505,1795,1796],{"class":518},"  UpdateUserBloc",[505,1798,558],{"class":522},[505,1800,561],{"class":511},[505,1802,1803],{"class":522},"_client",[505,1805,789],{"class":511},[505,1807,1808],{"class":522}," this",[505,1810,561],{"class":511},[505,1812,756],{"class":522},[505,1814,759],{"class":511},[505,1816,762],{"class":522},[505,1818,1819],{"class":518},"UpdateUserInitial",[505,1821,768],{"class":522},[505,1823,1824,1826,1828,1831,1833,1835,1837,1839,1841],{"class":507,"line":605},[505,1825,775],{"class":774},[505,1827,711],{"class":511},[505,1829,1830],{"class":518},"SubmitUpdate",[505,1832,783],{"class":511},[505,1834,786],{"class":522},[505,1836,789],{"class":511},[505,1838,792],{"class":522},[505,1840,795],{"class":774},[505,1842,798],{"class":522},[505,1844,1845,1847,1849,1852,1854],{"class":507,"line":619},[505,1846,805],{"class":804},[505,1848,808],{"class":522},[505,1850,1851],{"class":518},"UpdateUserLoading",[505,1853,814],{"class":522},[505,1855,738],{"class":511},[505,1857,1858,1860],{"class":507,"line":656},[505,1859,822],{"class":774},[505,1861,798],{"class":522},[505,1863,1864,1867,1869,1871,1874,1876,1878,1881,1883,1886,1888,1891],{"class":507,"line":693},[505,1865,1866],{"class":774},"        await",[505,1868,735],{"class":522},[505,1870,561],{"class":511},[505,1872,1873],{"class":804},"updateUser",[505,1875,850],{"class":522},[505,1877,561],{"class":511},[505,1879,1880],{"class":522},"id",[505,1882,789],{"class":511},[505,1884,1885],{"class":522}," event",[505,1887,561],{"class":511},[505,1889,1890],{"class":522},"name)",[505,1892,738],{"class":511},[505,1894,1895,1898,1900,1902,1905,1907,1909,1911,1913,1916,1918],{"class":507,"line":698},[505,1896,1897],{"class":522},"        _client",[505,1899,561],{"class":511},[505,1901,474],{"class":804},[505,1903,1904],{"class":522},"([",[505,1906,1114],{"class":884},[505,1908,789],{"class":511},[505,1910,1885],{"class":522},[505,1912,561],{"class":511},[505,1914,1915],{"class":522},"id])",[505,1917,553],{"class":511},[505,1919,1920],{"class":902}," // Qora refetches on next read\n",[505,1922,1923,1925,1927,1930,1932],{"class":507,"line":726},[505,1924,830],{"class":804},[505,1926,808],{"class":522},[505,1928,1929],{"class":518},"UpdateUserSuccess",[505,1931,814],{"class":522},[505,1933,738],{"class":511},[505,1935,1936,1938,1940],{"class":507,"line":741},[505,1937,863],{"class":522},[505,1939,866],{"class":774},[505,1941,869],{"class":522},[505,1943,1944,1946,1948,1951,1953,1955,1957,1959,1961,1963],{"class":507,"line":746},[505,1945,830],{"class":804},[505,1947,808],{"class":522},[505,1949,1950],{"class":518},"UpdateUserError",[505,1952,808],{"class":522},[505,1954,885],{"class":884},[505,1956,888],{"class":522},[505,1958,892],{"class":891},[505,1960,885],{"class":884},[505,1962,897],{"class":522},[505,1964,738],{"class":511},[505,1966,1967],{"class":507,"line":771},[505,1968,909],{"class":522},[505,1970,1971,1973],{"class":507,"line":801},[505,1972,915],{"class":522},[505,1974,738],{"class":511},[505,1976,1977],{"class":507,"line":819},[505,1978,923],{"class":522},[505,1980,1981],{"class":507,"line":827},[505,1982,929],{"class":522},[348,1984,1985,1986,1988,1989,1992],{},"Pass ",[395,1987,202],{}," into BLoCs that need to coordinate with the server-state cache. Do not pass ",[395,1990,1991],{},"BuildContext",", the client is a shared cache object, not a widget concern.",[355,1994],{},[358,1996,98],{"id":1997},"setup",[495,1999,2002],{"className":497,"code":2000,"filename":2001,"language":500,"meta":501,"style":501},"final qoraClient = QoraClient(\n  config: const QoraClientConfig(debugMode: kDebugMode),\n);\n\nrunApp(\n  MultiBlocProvider(\n    providers: [\n      BlocProvider(create: (_) => AuthBloc()),\n      BlocProvider(create: (ctx) => CheckoutBloc(ctx.read())),\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",[395,2003,2004,2018,2040,2046,2050,2057,2064,2074,2096,2124,2131,2143,2155,2175,2189,2205,2212,2219],{"__ignoreMap":501},[505,2005,2006,2008,2011,2014,2016],{"class":507,"line":508},[505,2007,544],{"class":543},[505,2009,2010],{"class":522}," qoraClient ",[505,2012,2013],{"class":511},"=",[505,2015,1772],{"class":518},[505,2017,1503],{"class":522},[505,2019,2020,2023,2025,2027,2030,2033,2035,2038],{"class":507,"line":526},[505,2021,2022],{"class":522},"  config",[505,2024,759],{"class":511},[505,2026,989],{"class":543},[505,2028,2029],{"class":518}," QoraClientConfig",[505,2031,2032],{"class":522},"(debugMode",[505,2034,759],{"class":511},[505,2036,2037],{"class":522}," kDebugMode)",[505,2039,998],{"class":511},[505,2041,2042,2044],{"class":507,"line":572},[505,2043,1273],{"class":522},[505,2045,738],{"class":511},[505,2047,2048],{"class":507,"line":579},[505,2049,576],{"emptyLinePlaceholder":575},[505,2051,2052,2055],{"class":507,"line":591},[505,2053,2054],{"class":804},"runApp",[505,2056,1503],{"class":522},[505,2058,2059,2062],{"class":507,"line":605},[505,2060,2061],{"class":518},"  MultiBlocProvider",[505,2063,1503],{"class":522},[505,2065,2066,2069,2071],{"class":507,"line":619},[505,2067,2068],{"class":522},"    providers",[505,2070,759],{"class":511},[505,2072,2073],{"class":522}," [\n",[505,2075,2076,2079,2082,2084,2087,2089,2092,2094],{"class":507,"line":656},[505,2077,2078],{"class":518},"      BlocProvider",[505,2080,2081],{"class":522},"(create",[505,2083,759],{"class":511},[505,2085,2086],{"class":522}," (_) ",[505,2088,970],{"class":511},[505,2090,2091],{"class":518}," AuthBloc",[505,2093,814],{"class":522},[505,2095,998],{"class":511},[505,2097,2098,2100,2102,2104,2107,2109,2112,2115,2117,2119,2122],{"class":507,"line":693},[505,2099,2078],{"class":518},[505,2101,2081],{"class":522},[505,2103,759],{"class":511},[505,2105,2106],{"class":522}," (ctx) ",[505,2108,970],{"class":511},[505,2110,2111],{"class":518}," CheckoutBloc",[505,2113,2114],{"class":522},"(ctx",[505,2116,561],{"class":511},[505,2118,1538],{"class":804},[505,2120,2121],{"class":522},"()))",[505,2123,998],{"class":511},[505,2125,2126,2129],{"class":507,"line":698},[505,2127,2128],{"class":522},"    ]",[505,2130,998],{"class":511},[505,2132,2133,2136,2138,2141],{"class":507,"line":726},[505,2134,2135],{"class":522},"    child",[505,2137,759],{"class":511},[505,2139,2140],{"class":518}," QoraScope",[505,2142,1503],{"class":522},[505,2144,2145,2148,2150,2153],{"class":507,"line":741},[505,2146,2147],{"class":522},"      client",[505,2149,759],{"class":511},[505,2151,2152],{"class":522}," qoraClient",[505,2154,998],{"class":511},[505,2156,2157,2160,2162,2165,2168,2170,2173],{"class":507,"line":746},[505,2158,2159],{"class":522},"      lifecycleManager",[505,2161,759],{"class":511},[505,2163,2164],{"class":518}," FlutterLifecycleManager",[505,2166,2167],{"class":522},"(qoraClient",[505,2169,759],{"class":511},[505,2171,2172],{"class":522}," qoraClient)",[505,2174,998],{"class":511},[505,2176,2177,2180,2182,2185,2187],{"class":507,"line":771},[505,2178,2179],{"class":522},"      connectivityManager",[505,2181,759],{"class":511},[505,2183,2184],{"class":518}," FlutterConnectivityManager",[505,2186,995],{"class":522},[505,2188,998],{"class":511},[505,2190,2191,2194,2196,2198,2201,2203],{"class":507,"line":801},[505,2192,2193],{"class":522},"      child",[505,2195,759],{"class":511},[505,2197,989],{"class":543},[505,2199,2200],{"class":518}," MyApp",[505,2202,995],{"class":522},[505,2204,998],{"class":511},[505,2206,2207,2210],{"class":507,"line":819},[505,2208,2209],{"class":522},"    )",[505,2211,998],{"class":511},[505,2213,2214,2217],{"class":507,"line":827},[505,2215,2216],{"class":522},"  )",[505,2218,998],{"class":511},[505,2220,2221,2223],{"class":507,"line":860},[505,2222,1273],{"class":522},[505,2224,738],{"class":511},[348,2226,2227,2229,2230,2233],{},[395,2228,103],{}," can be nested inside or outside ",[395,2231,2232],{},"MultiBlocProvider",". Select the layout that yields the clearest composition in the app root.",[355,2235],{},[358,2237,2239],{"id":2238},"checklist","Checklist",[2241,2242,2245,2262,2272,2284,2290,2299,2310],"ul",{"className":2243},[2244],"contains-task-list",[2246,2247,2250,2254,2255,2258,2259],"li",{"className":2248},[2249],"task-list-item",[2251,2252],"input",{"disabled":575,"type":2253},"checkbox"," Add ",[395,2256,2257],{},"qora_flutter"," to ",[395,2260,2261],{},"pubspec.yaml",[2246,2263,2265,2254,2267,2269,2270],{"className":2264},[2249],[2251,2266],{"disabled":575,"type":2253},[395,2268,103],{}," to the widget tree alongside ",[395,2271,2232],{},[2246,2273,2275,2277,2278,2281,2282],{"className":2274},[2249],[2251,2276],{"disabled":575,"type":2253}," Identify BLoCs that only do ",[395,2279,2280],{},"emit(Loading) -> fetch -> emit(Loaded/Error)"," and replace them with ",[395,2283,108],{},[2246,2285,2287,2289],{"className":2286},[2249],[2251,2288],{"disabled":575,"type":2253}," Keep BLoCs that model multi-event workflows, complex transitions, or non-fetch domain logic",[2246,2291,2293,2295,2296,2298],{"className":2292},[2249],[2251,2294],{"disabled":575,"type":2253}," Remove ",[395,2297,483],{}," for data-only blocs",[2246,2300,2302,2304,2305,2307,2308],{"className":2301},[2249],[2251,2303],{"disabled":575,"type":2253}," Replace ",[395,2306,940],{}," for data-only blocs with ",[395,2309,108],{},[2246,2311,2313,2315,2316,2318],{"className":2312},[2249],[2251,2314],{"disabled":575,"type":2253}," Inject ",[395,2317,202],{}," into BLoCs that perform writes and need to invalidate the cache",[355,2320],{},[358,2322,2324],{"id":2323},"related","Related",[2241,2326,2327,2333,2338,2344],{},[2246,2328,2329],{},[2330,2331,98],"a",{"href":2332},"../flutter-integration/setup",[2246,2334,2335],{},[2330,2336,108],{"href":2337},"../flutter-integration/qora-builder",[2246,2339,2340],{},[2330,2341,2343],{"href":2342},"../recipes/mutations","Mutations Guide",[2246,2345,2346],{},[2330,2347,25],{"href":2348},"../getting-started/comparison",[2350,2351,2352],"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":501,"searchDepth":526,"depth":526,"links":2354},[2355,2356,2357,2358,2359,2360,2361,2362],{"id":360,"depth":526,"text":361},{"id":489,"depth":526,"text":490},{"id":1084,"depth":526,"text":1085},{"id":1329,"depth":526,"text":1330},{"id":1732,"depth":526,"text":1733},{"id":1997,"depth":526,"text":98},{"id":2238,"depth":526,"text":2239},{"id":2323,"depth":526,"text":2324},"Use Qora for server-state and BLoC for UI state machines, with explicit separation of concerns.","md",null,{},{"icon":111},{"title":269,"description":2363},"x-36yFyVdA7I3Ig5Zkyp2tPlUIO9SeTVAol1mpFMiMU",[2371,2373],{"title":264,"path":265,"stem":266,"description":2372,"icon":267,"children":-1},"Add Qora to an existing Provider app to specialize server-state handling while preserving Provider for UI state and dependency injection.",{"title":273,"path":274,"stem":275,"description":2374,"icon":276,"children":-1},"Add Qora to a Riverpod project to complement FutureProvider with SWR, offline behavior, and hooks-oriented query APIs.",1794040393901]