[{"data":1,"prerenderedAt":2234},["ShallowReactive",2],{"navigation_docs_en":3,"-en-examples-network-awareness":342,"-en-examples-network-awareness-surround":2229},[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":315,"body":344,"description":2220,"extension":2221,"links":2222,"meta":2223,"navigation":2224,"path":316,"seo":2225,"stem":317,"__hash__":2228},"docs_en/en/08.examples/5.network-awareness.md",{"type":345,"value":346,"toc":2204},"minimark",[347,352,360,379,382,386,473,475,479,498,508,517,842,844,848,855,858,864,951,958,964,986,1546,1550,1561,1940,1961,1967,1970,2110,2113,2122,2124,2128,2134,2143,2145,2149,2200],[348,349,351],"h2",{"id":350},"objective","Objective",[353,354,355,359],"p",{},[356,357,358],"strong",{},"Context",": When a device loses connectivity, a naive implementation either crashes (uncaught network exception), freezes (spinner that never resolves), or silently drops the user's last action (mutation lost forever). None of these are acceptable in a production app.",[353,361,362,363,366,367,370,371,374,375,378],{},"This example demonstrates Qora's network-aware layer: queries ",[356,364,365],{},"pause"," automatically when offline and ",[356,368,369],{},"replay"," on reconnect, mutations are ",[356,372,373],{},"queued"," and replayed in FIFO order, and reconnect replay uses ",[356,376,377],{},"controlled concurrency"," so that a sudden flood of paused queries doesn't spike the server.",[380,381],"hr",{},[348,383,385],{"id":384},"key-features-demonstrated","Key Features Demonstrated",[387,388,389,403,411,419,426,434,450,458],"ul",{},[390,391,392,398,399,402],"li",{},[356,393,394],{},[395,396,397],"code",{},"NetworkMode.online"," (default): queries pause at ",[395,400,401],{},"FetchStatus.paused"," when offline; replay automatically on reconnect",[390,404,405,410],{},[356,406,407],{},[395,408,409],{},"NetworkMode.offlineFirst",": serves cached data immediately, schedules background revalidation when back online",[390,412,413,418],{},[356,414,415],{},[395,416,417],{},"NetworkMode.always",": bypasses connectivity checks entirely (for local-DB-backed queries)",[390,420,421,425],{},[356,422,423],{},[395,424,401],{},": surfaces the \"waiting for connection\" state to the UI without any custom boolean",[390,427,428,433],{},[356,429,430],{},[395,431,432],{},"OfflineMutationQueue",": FIFO queue; mutations fired offline are replayed in order on reconnect",[390,435,436,441,442,445,446,449],{},[356,437,438],{},[395,439,440],{},"ReconnectStrategy",": ",[395,443,444],{},"maxConcurrent"," + ",[395,447,448],{},"jitter"," prevent thundering-herd when dozens of queries resume simultaneously",[390,451,452,457],{},[356,453,454],{},[395,455,456],{},"NetworkStatusIndicator",": automatic offline banner widget, zero configuration",[390,459,460,465,466,469,470,472],{},[356,461,462],{},[395,463,464],{},"FlutterConnectivityManager",": wires ",[395,467,468],{},"connectivity_plus"," into ",[395,471,103],{}," in one line",[380,474],{},[348,476,478],{"id":477},"architecture-highlights","Architecture Highlights",[353,480,481,482,485,486,489,490,493,494,497],{},"Network awareness is ",[356,483,484],{},"orthogonal"," to query state. A query can be in ",[395,487,488],{},"Success"," state (data visible) while ",[395,491,492],{},"FetchStatus"," is ",[395,495,496],{},"paused"," (connectivity lost, background revalidation waiting). The widget tree is never blocked: it always has something to render.",[499,500,506],"pre",{"className":501,"code":503,"language":504,"meta":505},[502],"language-text","main.dart\n└── QoraScope(\n      client:              QoraClient(config: reconnectStrategy + networkMode)\n      connectivityManager: FlutterConnectivityManager()    ← plugs in connectivity_plus\n      lifecycleManager:    FlutterLifecycleManager(...)    ← refetch on resume\n      child: NetworkStatusIndicator(                        ← offline banner, zero config\n        child: MyApp(),\n      ),\n    )\n","text","",[395,507,503],{"__ignoreMap":505},[353,509,510,511,513,514,516],{},"The ",[395,512,202],{}," is configured with a ",[395,515,440],{}," that controls how paused queries are replayed when connectivity returns:",[499,518,523],{"className":519,"code":520,"filename":521,"language":522,"meta":505,"style":505},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","final client = QoraClient(\n  config: QoraClientConfig(\n    defaultOptions: const QoraOptions(\n      networkMode: NetworkMode.online, // pause when offline, replay on reconnect\n      staleTime: Duration(minutes: 5),\n    ),\n    reconnectStrategy: const ReconnectStrategy(\n      maxConcurrent: 5, // replay 5 queries at a time\n      jitter: Duration(milliseconds: 200), // random delay between batches\n    ),\n    debugMode: kDebugMode,\n  ),\n);\n\nrunApp(\n  QoraScope(\n    client: client,\n    connectivityManager: FlutterConnectivityManager(),\n    lifecycleManager:    FlutterLifecycleManager(qoraClient: client),\n    child: NetworkStatusIndicator(child: const MyApp()),\n  ),\n);\n","lib/main.dart","dart",[395,524,525,549,563,579,603,629,637,652,667,692,699,712,720,728,735,744,752,765,781,802,828,835],{"__ignoreMap":505},[526,527,530,534,538,542,546],"span",{"class":528,"line":529},"line",1,[526,531,533],{"class":532},"spNyl","final",[526,535,537],{"class":536},"sTEyZ"," client ",[526,539,541],{"class":540},"sMK4o","=",[526,543,545],{"class":544},"sBMFI"," QoraClient",[526,547,548],{"class":536},"(\n",[526,550,552,555,558,561],{"class":528,"line":551},2,[526,553,554],{"class":536},"  config",[526,556,557],{"class":540},":",[526,559,560],{"class":544}," QoraClientConfig",[526,562,548],{"class":536},[526,564,566,569,571,574,577],{"class":528,"line":565},3,[526,567,568],{"class":536},"    defaultOptions",[526,570,557],{"class":540},[526,572,573],{"class":532}," const",[526,575,576],{"class":544}," QoraOptions",[526,578,548],{"class":536},[526,580,582,585,587,590,593,596,599],{"class":528,"line":581},4,[526,583,584],{"class":536},"      networkMode",[526,586,557],{"class":540},[526,588,589],{"class":544}," NetworkMode",[526,591,592],{"class":540},".",[526,594,595],{"class":536},"online",[526,597,598],{"class":540},",",[526,600,602],{"class":601},"sHwdD"," // pause when offline, replay on reconnect\n",[526,604,606,609,611,614,617,619,623,626],{"class":528,"line":605},5,[526,607,608],{"class":536},"      staleTime",[526,610,557],{"class":540},[526,612,613],{"class":544}," Duration",[526,615,616],{"class":536},"(minutes",[526,618,557],{"class":540},[526,620,622],{"class":621},"sbssI"," 5",[526,624,625],{"class":536},")",[526,627,628],{"class":540},",\n",[526,630,632,635],{"class":528,"line":631},6,[526,633,634],{"class":536},"    )",[526,636,628],{"class":540},[526,638,640,643,645,647,650],{"class":528,"line":639},7,[526,641,642],{"class":536},"    reconnectStrategy",[526,644,557],{"class":540},[526,646,573],{"class":532},[526,648,649],{"class":544}," ReconnectStrategy",[526,651,548],{"class":536},[526,653,655,658,660,662,664],{"class":528,"line":654},8,[526,656,657],{"class":536},"      maxConcurrent",[526,659,557],{"class":540},[526,661,622],{"class":621},[526,663,598],{"class":540},[526,665,666],{"class":601}," // replay 5 queries at a time\n",[526,668,670,673,675,677,680,682,685,687,689],{"class":528,"line":669},9,[526,671,672],{"class":536},"      jitter",[526,674,557],{"class":540},[526,676,613],{"class":544},[526,678,679],{"class":536},"(milliseconds",[526,681,557],{"class":540},[526,683,684],{"class":621}," 200",[526,686,625],{"class":536},[526,688,598],{"class":540},[526,690,691],{"class":601}," // random delay between batches\n",[526,693,695,697],{"class":528,"line":694},10,[526,696,634],{"class":536},[526,698,628],{"class":540},[526,700,702,705,707,710],{"class":528,"line":701},11,[526,703,704],{"class":536},"    debugMode",[526,706,557],{"class":540},[526,708,709],{"class":536}," kDebugMode",[526,711,628],{"class":540},[526,713,715,718],{"class":528,"line":714},12,[526,716,717],{"class":536},"  )",[526,719,628],{"class":540},[526,721,723,725],{"class":528,"line":722},13,[526,724,625],{"class":536},[526,726,727],{"class":540},";\n",[526,729,731],{"class":528,"line":730},14,[526,732,734],{"emptyLinePlaceholder":733},true,"\n",[526,736,738,742],{"class":528,"line":737},15,[526,739,741],{"class":740},"s2Zo4","runApp",[526,743,548],{"class":536},[526,745,747,750],{"class":528,"line":746},16,[526,748,749],{"class":544},"  QoraScope",[526,751,548],{"class":536},[526,753,755,758,760,763],{"class":528,"line":754},17,[526,756,757],{"class":536},"    client",[526,759,557],{"class":540},[526,761,762],{"class":536}," client",[526,764,628],{"class":540},[526,766,768,771,773,776,779],{"class":528,"line":767},18,[526,769,770],{"class":536},"    connectivityManager",[526,772,557],{"class":540},[526,774,775],{"class":544}," FlutterConnectivityManager",[526,777,778],{"class":536},"()",[526,780,628],{"class":540},[526,782,784,787,789,792,795,797,800],{"class":528,"line":783},19,[526,785,786],{"class":536},"    lifecycleManager",[526,788,557],{"class":540},[526,790,791],{"class":544},"    FlutterLifecycleManager",[526,793,794],{"class":536},"(qoraClient",[526,796,557],{"class":540},[526,798,799],{"class":536}," client)",[526,801,628],{"class":540},[526,803,805,808,810,813,816,818,820,823,826],{"class":528,"line":804},20,[526,806,807],{"class":536},"    child",[526,809,557],{"class":540},[526,811,812],{"class":544}," NetworkStatusIndicator",[526,814,815],{"class":536},"(child",[526,817,557],{"class":540},[526,819,573],{"class":532},[526,821,822],{"class":544}," MyApp",[526,824,825],{"class":536},"())",[526,827,628],{"class":540},[526,829,831,833],{"class":528,"line":830},21,[526,832,717],{"class":536},[526,834,628],{"class":540},[526,836,838,840],{"class":528,"line":837},22,[526,839,625],{"class":536},[526,841,727],{"class":540},[380,843],{},[348,845,847],{"id":846},"implementation-details","Implementation Details",[849,850,852,854],"h3",{"id":851},"reconnectstrategy-thundering-herd-prevention",[395,853,440],{},": thundering-herd prevention",[353,856,857],{},"Consider an app with 20 queries active across 8 screens. The user takes the subway for 20 minutes: all 20 queries pause. On reconnect, without a strategy, 20 simultaneous requests fire. If 200 users come out of the same subway station at the same time, the server receives 4,000 simultaneous requests.",[353,859,860,863],{},[395,861,862],{},"ReconnectStrategy(maxConcurrent: 5, jitter: Duration(milliseconds: 200))"," staggers replay into batches of 5, with a random delay (up to 200 ms) between each batch:",[499,865,867],{"className":519,"code":866,"filename":521,"language":522,"meta":505,"style":505},"const ReconnectStrategy(\n  maxConcurrent: 5,\n  jitter: Duration(milliseconds: 200),\n)\n\n// Named constructors for common configurations:\nReconnectStrategy.instant() // all at once: useful for tests\nReconnectStrategy.conservative() // maxConcurrent: 2, jitter: 500ms: battery-conscious\n",[395,868,869,878,889,908,913,917,922,937],{"__ignoreMap":505},[526,870,871,874,876],{"class":528,"line":529},[526,872,873],{"class":532},"const",[526,875,649],{"class":544},[526,877,548],{"class":536},[526,879,880,883,885,887],{"class":528,"line":551},[526,881,882],{"class":536},"  maxConcurrent",[526,884,557],{"class":540},[526,886,622],{"class":621},[526,888,628],{"class":540},[526,890,891,894,896,898,900,902,904,906],{"class":528,"line":565},[526,892,893],{"class":536},"  jitter",[526,895,557],{"class":540},[526,897,613],{"class":544},[526,899,679],{"class":536},[526,901,557],{"class":540},[526,903,684],{"class":621},[526,905,625],{"class":536},[526,907,628],{"class":540},[526,909,910],{"class":528,"line":581},[526,911,912],{"class":536},")\n",[526,914,915],{"class":528,"line":605},[526,916,734],{"emptyLinePlaceholder":733},[526,918,919],{"class":528,"line":631},[526,920,921],{"class":601},"// Named constructors for common configurations:\n",[526,923,924,926,928,931,934],{"class":528,"line":639},[526,925,440],{"class":544},[526,927,592],{"class":540},[526,929,930],{"class":740},"instant",[526,932,933],{"class":536},"() ",[526,935,936],{"class":601},"// all at once: useful for tests\n",[526,938,939,941,943,946,948],{"class":528,"line":654},[526,940,440],{"class":544},[526,942,592],{"class":540},[526,944,945],{"class":740},"conservative",[526,947,933],{"class":536},[526,949,950],{"class":601},"// maxConcurrent: 2, jitter: 500ms: battery-conscious\n",[353,952,953,954,957],{},"The jitter is ",[356,955,956],{},"random per client instance",": so even if 1,000 devices reconnect simultaneously, their replay windows are spread across a 200 ms window, distributing the load.",[849,959,961,963],{"id":960},"fetchstatuspaused-accurate-ui-state-without-custom-flags",[395,962,401],{},": accurate UI state without custom flags",[353,965,966,968,969,971,972,974,975,978,979,982,983,557],{},[395,967,108],{}," exposes ",[395,970,492],{}," as its third builder argument. ",[395,973,496],{}," means \"a fetch is queued but waiting for connectivity\": distinct from ",[395,976,977],{},"fetching"," (actively running) and ",[395,980,981],{},"idle"," (nothing pending). This lets widgets render an accurate offline indicator without a single ",[395,984,985],{},"bool _isOffline",[499,987,990],{"className":519,"code":988,"filename":989,"language":522,"meta":505,"style":505},"QoraBuilder\u003CList\u003CPost>>(\n  queryKey: const ['posts'],\n  fetcher: api.getPosts,\n  builder: (context, state, fetchStatus) {\n    return switch (state) {\n      // First load, offline: nothing to show yet\n      Initial() || Loading(previousData: null) when fetchStatus == FetchStatus.paused =>\n          const Center(\n            child: Column(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                Icon(Icons.wifi_off, size: 48, color: Colors.grey),\n                SizedBox(height: 12),\n                Text('No connection: connect to load posts'),\n              ],\n            ),\n          ),\n\n      // First load, online: standard spinner\n      Initial() || Loading(previousData: null) =>\n          const Center(child: CircularProgressIndicator()),\n\n      // Data available: show feed regardless of connectivity\n      _ => Column(\n          children: [\n            // Paused: offline but data visible\n            if (fetchStatus == FetchStatus.paused)\n              const _OfflineBanner(),\n            // Fetching: SWR background revalidation running\n            if (fetchStatus == FetchStatus.fetching)\n              const LinearProgressIndicator(minHeight: 2),\n            if (state is Failure\u003CList\u003CPost>>)\n              _ErrorBanner(error: state.error),\n            Expanded(child: PostList(posts: state.dataOrNull!)),\n          ],\n        ),\n    };\n  },\n)\n","lib/features/feed/ui/feed_screen.dart",[395,991,992,1010,1031,1048,1068,1080,1085,1129,1139,1151,1168,1178,1221,1238,1252,1259,1266,1273,1277,1282,1302,1319,1323,1329,1342,1352,1358,1376,1389,1395,1411,1431,1456,1476,1509,1517,1525,1533,1541],{"__ignoreMap":505},[526,993,994,996,999,1002,1004,1007],{"class":528,"line":529},[526,995,108],{"class":544},[526,997,998],{"class":536},"\u003C",[526,1000,1001],{"class":544},"List",[526,1003,998],{"class":536},[526,1005,1006],{"class":544},"Post",[526,1008,1009],{"class":536},">>(\n",[526,1011,1012,1015,1017,1019,1022,1026,1029],{"class":528,"line":551},[526,1013,1014],{"class":536},"  queryKey",[526,1016,557],{"class":540},[526,1018,573],{"class":532},[526,1020,1021],{"class":536}," [",[526,1023,1025],{"class":1024},"sfazB","'posts'",[526,1027,1028],{"class":536},"]",[526,1030,628],{"class":540},[526,1032,1033,1036,1038,1041,1043,1046],{"class":528,"line":565},[526,1034,1035],{"class":536},"  fetcher",[526,1037,557],{"class":540},[526,1039,1040],{"class":536}," api",[526,1042,592],{"class":540},[526,1044,1045],{"class":536},"getPosts",[526,1047,628],{"class":540},[526,1049,1050,1053,1055,1058,1060,1063,1065],{"class":528,"line":581},[526,1051,1052],{"class":536},"  builder",[526,1054,557],{"class":540},[526,1056,1057],{"class":536}," (context",[526,1059,598],{"class":540},[526,1061,1062],{"class":536}," state",[526,1064,598],{"class":540},[526,1066,1067],{"class":536}," fetchStatus) {\n",[526,1069,1070,1074,1077],{"class":528,"line":605},[526,1071,1073],{"class":1072},"s7zQu","    return",[526,1075,1076],{"class":1072}," switch",[526,1078,1079],{"class":536}," (state) {\n",[526,1081,1082],{"class":528,"line":631},[526,1083,1084],{"class":601},"      // First load, offline: nothing to show yet\n",[526,1086,1087,1090,1092,1095,1098,1101,1103,1106,1109,1112,1115,1118,1121,1123,1126],{"class":528,"line":639},[526,1088,1089],{"class":544},"      Initial",[526,1091,933],{"class":536},[526,1093,1094],{"class":540},"||",[526,1096,1097],{"class":544}," Loading",[526,1099,1100],{"class":536},"(previousData",[526,1102,557],{"class":540},[526,1104,1105],{"class":540}," null",[526,1107,1108],{"class":536},") ",[526,1110,1111],{"class":1072},"when",[526,1113,1114],{"class":536}," fetchStatus ",[526,1116,1117],{"class":540},"==",[526,1119,1120],{"class":544}," FetchStatus",[526,1122,592],{"class":540},[526,1124,1125],{"class":536},"paused ",[526,1127,1128],{"class":540},"=>\n",[526,1130,1131,1134,1137],{"class":528,"line":654},[526,1132,1133],{"class":532},"          const",[526,1135,1136],{"class":544}," Center",[526,1138,548],{"class":536},[526,1140,1141,1144,1146,1149],{"class":528,"line":669},[526,1142,1143],{"class":536},"            child",[526,1145,557],{"class":540},[526,1147,1148],{"class":544}," Column",[526,1150,548],{"class":536},[526,1152,1153,1156,1158,1161,1163,1166],{"class":528,"line":694},[526,1154,1155],{"class":536},"              mainAxisAlignment",[526,1157,557],{"class":540},[526,1159,1160],{"class":544}," MainAxisAlignment",[526,1162,592],{"class":540},[526,1164,1165],{"class":536},"center",[526,1167,628],{"class":540},[526,1169,1170,1173,1175],{"class":528,"line":701},[526,1171,1172],{"class":536},"              children",[526,1174,557],{"class":540},[526,1176,1177],{"class":536}," [\n",[526,1179,1180,1183,1186,1189,1191,1194,1196,1199,1201,1204,1206,1209,1211,1214,1216,1219],{"class":528,"line":714},[526,1181,1182],{"class":544},"                Icon",[526,1184,1185],{"class":536},"(",[526,1187,1188],{"class":544},"Icons",[526,1190,592],{"class":540},[526,1192,1193],{"class":536},"wifi_off",[526,1195,598],{"class":540},[526,1197,1198],{"class":536}," size",[526,1200,557],{"class":540},[526,1202,1203],{"class":621}," 48",[526,1205,598],{"class":540},[526,1207,1208],{"class":536}," color",[526,1210,557],{"class":540},[526,1212,1213],{"class":544}," Colors",[526,1215,592],{"class":540},[526,1217,1218],{"class":536},"grey)",[526,1220,628],{"class":540},[526,1222,1223,1226,1229,1231,1234,1236],{"class":528,"line":722},[526,1224,1225],{"class":544},"                SizedBox",[526,1227,1228],{"class":536},"(height",[526,1230,557],{"class":540},[526,1232,1233],{"class":621}," 12",[526,1235,625],{"class":536},[526,1237,628],{"class":540},[526,1239,1240,1243,1245,1248,1250],{"class":528,"line":730},[526,1241,1242],{"class":544},"                Text",[526,1244,1185],{"class":536},[526,1246,1247],{"class":1024},"'No connection: connect to load posts'",[526,1249,625],{"class":536},[526,1251,628],{"class":540},[526,1253,1254,1257],{"class":528,"line":737},[526,1255,1256],{"class":536},"              ]",[526,1258,628],{"class":540},[526,1260,1261,1264],{"class":528,"line":746},[526,1262,1263],{"class":536},"            )",[526,1265,628],{"class":540},[526,1267,1268,1271],{"class":528,"line":754},[526,1269,1270],{"class":536},"          )",[526,1272,628],{"class":540},[526,1274,1275],{"class":528,"line":767},[526,1276,734],{"emptyLinePlaceholder":733},[526,1278,1279],{"class":528,"line":783},[526,1280,1281],{"class":601},"      // First load, online: standard spinner\n",[526,1283,1284,1286,1288,1290,1292,1294,1296,1298,1300],{"class":528,"line":804},[526,1285,1089],{"class":544},[526,1287,933],{"class":536},[526,1289,1094],{"class":540},[526,1291,1097],{"class":544},[526,1293,1100],{"class":536},[526,1295,557],{"class":540},[526,1297,1105],{"class":540},[526,1299,1108],{"class":536},[526,1301,1128],{"class":540},[526,1303,1304,1306,1308,1310,1312,1315,1317],{"class":528,"line":830},[526,1305,1133],{"class":532},[526,1307,1136],{"class":544},[526,1309,815],{"class":536},[526,1311,557],{"class":540},[526,1313,1314],{"class":544}," CircularProgressIndicator",[526,1316,825],{"class":536},[526,1318,628],{"class":540},[526,1320,1321],{"class":528,"line":837},[526,1322,734],{"emptyLinePlaceholder":733},[526,1324,1326],{"class":528,"line":1325},23,[526,1327,1328],{"class":601},"      // Data available: show feed regardless of connectivity\n",[526,1330,1332,1335,1338,1340],{"class":528,"line":1331},24,[526,1333,1334],{"class":536},"      _ ",[526,1336,1337],{"class":540},"=>",[526,1339,1148],{"class":544},[526,1341,548],{"class":536},[526,1343,1345,1348,1350],{"class":528,"line":1344},25,[526,1346,1347],{"class":536},"          children",[526,1349,557],{"class":540},[526,1351,1177],{"class":536},[526,1353,1355],{"class":528,"line":1354},26,[526,1356,1357],{"class":601},"            // Paused: offline but data visible\n",[526,1359,1361,1364,1367,1369,1371,1373],{"class":528,"line":1360},27,[526,1362,1363],{"class":1072},"            if",[526,1365,1366],{"class":536}," (fetchStatus ",[526,1368,1117],{"class":540},[526,1370,1120],{"class":544},[526,1372,592],{"class":540},[526,1374,1375],{"class":536},"paused)\n",[526,1377,1379,1382,1385,1387],{"class":528,"line":1378},28,[526,1380,1381],{"class":532},"              const",[526,1383,1384],{"class":544}," _OfflineBanner",[526,1386,778],{"class":536},[526,1388,628],{"class":540},[526,1390,1392],{"class":528,"line":1391},29,[526,1393,1394],{"class":601},"            // Fetching: SWR background revalidation running\n",[526,1396,1398,1400,1402,1404,1406,1408],{"class":528,"line":1397},30,[526,1399,1363],{"class":1072},[526,1401,1366],{"class":536},[526,1403,1117],{"class":540},[526,1405,1120],{"class":544},[526,1407,592],{"class":540},[526,1409,1410],{"class":536},"fetching)\n",[526,1412,1414,1416,1419,1422,1424,1427,1429],{"class":528,"line":1413},31,[526,1415,1381],{"class":532},[526,1417,1418],{"class":544}," LinearProgressIndicator",[526,1420,1421],{"class":536},"(minHeight",[526,1423,557],{"class":540},[526,1425,1426],{"class":621}," 2",[526,1428,625],{"class":536},[526,1430,628],{"class":540},[526,1432,1434,1436,1439,1442,1445,1447,1449,1451,1453],{"class":528,"line":1433},32,[526,1435,1363],{"class":1072},[526,1437,1438],{"class":536}," (state ",[526,1440,1441],{"class":540},"is",[526,1443,1444],{"class":544}," Failure",[526,1446,998],{"class":536},[526,1448,1001],{"class":544},[526,1450,998],{"class":536},[526,1452,1006],{"class":544},[526,1454,1455],{"class":536},">>)\n",[526,1457,1459,1462,1465,1467,1469,1471,1474],{"class":528,"line":1458},33,[526,1460,1461],{"class":544},"              _ErrorBanner",[526,1463,1464],{"class":536},"(error",[526,1466,557],{"class":540},[526,1468,1062],{"class":536},[526,1470,592],{"class":540},[526,1472,1473],{"class":536},"error)",[526,1475,628],{"class":540},[526,1477,1479,1482,1484,1486,1489,1492,1494,1496,1498,1501,1504,1507],{"class":528,"line":1478},34,[526,1480,1481],{"class":544},"            Expanded",[526,1483,815],{"class":536},[526,1485,557],{"class":540},[526,1487,1488],{"class":544}," PostList",[526,1490,1491],{"class":536},"(posts",[526,1493,557],{"class":540},[526,1495,1062],{"class":536},[526,1497,592],{"class":540},[526,1499,1500],{"class":536},"dataOrNull",[526,1502,1503],{"class":540},"!",[526,1505,1506],{"class":536},"))",[526,1508,628],{"class":540},[526,1510,1512,1515],{"class":528,"line":1511},35,[526,1513,1514],{"class":536},"          ]",[526,1516,628],{"class":540},[526,1518,1520,1523],{"class":528,"line":1519},36,[526,1521,1522],{"class":536},"        )",[526,1524,628],{"class":540},[526,1526,1528,1531],{"class":528,"line":1527},37,[526,1529,1530],{"class":536},"    }",[526,1532,727],{"class":540},[526,1534,1536,1539],{"class":528,"line":1535},38,[526,1537,1538],{"class":536},"  }",[526,1540,628],{"class":540},[526,1542,1544],{"class":528,"line":1543},39,[526,1545,912],{"class":536},[849,1547,1549],{"id":1548},"offline-mutation-queue-write-now-sync-later","Offline mutation queue: write now, sync later",[353,1551,1552,1553,1556,1557,1560],{},"Mutations fired while offline are enqueued and replayed in FIFO order on reconnect. The ",[395,1554,1555],{},"isOptimistic"," flag on ",[395,1558,1559],{},"MutationSuccess"," drives a \"pending sync\" visual so the UI is never misleading:",[499,1562,1565],{"className":519,"code":1563,"filename":1564,"language":522,"meta":505,"style":505},"QoraMutationBuilder\u003CPost, String, void>(\n  mutator: (content) => api.createPost(content),\n  options: MutationOptions(\n    offlineQueue: true,\n    optimisticResponse: (content) => Post.optimistic(content: content),\n    onSuccess: (_, __, ___) async =>\n        context.qora.invalidate(const ['posts']),\n  ),\n  builder: (context, state, mutate) {\n    final isQueued = state is MutationSuccess && state.isOptimistic;\n\n    return Column(\n      children: [\n        if (isQueued)\n          const _SyncPendingBanner(), // \"Will sync when online\"\n        SubmitButton(\n          label: isQueued ? 'Queued' : 'Post',\n          icon: isQueued ? Icons.schedule : Icons.send,\n          onPressed: state.isPending ? null : () => mutate(_controller.text),\n        ),\n      ],\n    );\n  },\n)\n","lib/features/feed/ui/compose_screen.dart",[395,1566,1567,1589,1613,1625,1635,1664,1690,1718,1724,1741,1770,1774,1782,1791,1799,1813,1820,1843,1873,1911,1917,1924,1930,1936],{"__ignoreMap":505},[526,1568,1569,1571,1573,1575,1578,1581,1583,1586],{"class":528,"line":529},[526,1570,113],{"class":544},[526,1572,998],{"class":536},[526,1574,1006],{"class":544},[526,1576,1577],{"class":536},", ",[526,1579,1580],{"class":544},"String",[526,1582,1577],{"class":536},[526,1584,1585],{"class":532},"void",[526,1587,1588],{"class":536},">(\n",[526,1590,1591,1594,1596,1599,1601,1603,1605,1608,1611],{"class":528,"line":551},[526,1592,1593],{"class":536},"  mutator",[526,1595,557],{"class":540},[526,1597,1598],{"class":536}," (content) ",[526,1600,1337],{"class":540},[526,1602,1040],{"class":536},[526,1604,592],{"class":540},[526,1606,1607],{"class":740},"createPost",[526,1609,1610],{"class":536},"(content)",[526,1612,628],{"class":540},[526,1614,1615,1618,1620,1623],{"class":528,"line":565},[526,1616,1617],{"class":536},"  options",[526,1619,557],{"class":540},[526,1621,1622],{"class":544}," MutationOptions",[526,1624,548],{"class":536},[526,1626,1627,1630,1632],{"class":528,"line":581},[526,1628,1629],{"class":536},"    offlineQueue",[526,1631,557],{"class":540},[526,1633,1634],{"class":540}," true,\n",[526,1636,1637,1640,1642,1644,1646,1649,1651,1654,1657,1659,1662],{"class":528,"line":605},[526,1638,1639],{"class":536},"    optimisticResponse",[526,1641,557],{"class":540},[526,1643,1598],{"class":536},[526,1645,1337],{"class":540},[526,1647,1648],{"class":544}," Post",[526,1650,592],{"class":540},[526,1652,1653],{"class":740},"optimistic",[526,1655,1656],{"class":536},"(content",[526,1658,557],{"class":540},[526,1660,1661],{"class":536}," content)",[526,1663,628],{"class":540},[526,1665,1666,1669,1671,1674,1676,1679,1681,1684,1687],{"class":528,"line":631},[526,1667,1668],{"class":536},"    onSuccess",[526,1670,557],{"class":540},[526,1672,1673],{"class":536}," (_",[526,1675,598],{"class":540},[526,1677,1678],{"class":536}," __",[526,1680,598],{"class":540},[526,1682,1683],{"class":536}," ___) ",[526,1685,1686],{"class":1072},"async",[526,1688,1689],{"class":540}," =>\n",[526,1691,1692,1695,1697,1700,1702,1705,1707,1709,1711,1713,1716],{"class":528,"line":639},[526,1693,1694],{"class":536},"        context",[526,1696,592],{"class":540},[526,1698,1699],{"class":536},"qora",[526,1701,592],{"class":540},[526,1703,1704],{"class":740},"invalidate",[526,1706,1185],{"class":536},[526,1708,873],{"class":532},[526,1710,1021],{"class":536},[526,1712,1025],{"class":1024},[526,1714,1715],{"class":536},"])",[526,1717,628],{"class":540},[526,1719,1720,1722],{"class":528,"line":654},[526,1721,717],{"class":536},[526,1723,628],{"class":540},[526,1725,1726,1728,1730,1732,1734,1736,1738],{"class":528,"line":669},[526,1727,1052],{"class":536},[526,1729,557],{"class":540},[526,1731,1057],{"class":536},[526,1733,598],{"class":540},[526,1735,1062],{"class":536},[526,1737,598],{"class":540},[526,1739,1740],{"class":536}," mutate) {\n",[526,1742,1743,1746,1749,1751,1754,1756,1759,1762,1764,1766,1768],{"class":528,"line":694},[526,1744,1745],{"class":532},"    final",[526,1747,1748],{"class":536}," isQueued ",[526,1750,541],{"class":540},[526,1752,1753],{"class":536}," state ",[526,1755,1441],{"class":540},[526,1757,1758],{"class":544}," MutationSuccess",[526,1760,1761],{"class":540}," &&",[526,1763,1062],{"class":536},[526,1765,592],{"class":540},[526,1767,1555],{"class":536},[526,1769,727],{"class":540},[526,1771,1772],{"class":528,"line":701},[526,1773,734],{"emptyLinePlaceholder":733},[526,1775,1776,1778,1780],{"class":528,"line":714},[526,1777,1073],{"class":1072},[526,1779,1148],{"class":544},[526,1781,548],{"class":536},[526,1783,1784,1787,1789],{"class":528,"line":722},[526,1785,1786],{"class":536},"      children",[526,1788,557],{"class":540},[526,1790,1177],{"class":536},[526,1792,1793,1796],{"class":528,"line":730},[526,1794,1795],{"class":1072},"        if",[526,1797,1798],{"class":536}," (isQueued)\n",[526,1800,1801,1803,1806,1808,1810],{"class":528,"line":737},[526,1802,1133],{"class":532},[526,1804,1805],{"class":544}," _SyncPendingBanner",[526,1807,778],{"class":536},[526,1809,598],{"class":540},[526,1811,1812],{"class":601}," // \"Will sync when online\"\n",[526,1814,1815,1818],{"class":528,"line":746},[526,1816,1817],{"class":544},"        SubmitButton",[526,1819,548],{"class":536},[526,1821,1822,1825,1827,1829,1832,1835,1838,1841],{"class":528,"line":754},[526,1823,1824],{"class":536},"          label",[526,1826,557],{"class":540},[526,1828,1748],{"class":536},[526,1830,1831],{"class":540},"?",[526,1833,1834],{"class":1024}," 'Queued'",[526,1836,1837],{"class":540}," :",[526,1839,1840],{"class":1024}," 'Post'",[526,1842,628],{"class":540},[526,1844,1845,1848,1850,1852,1854,1857,1859,1862,1864,1866,1868,1871],{"class":528,"line":767},[526,1846,1847],{"class":536},"          icon",[526,1849,557],{"class":540},[526,1851,1748],{"class":536},[526,1853,1831],{"class":540},[526,1855,1856],{"class":544}," Icons",[526,1858,592],{"class":540},[526,1860,1861],{"class":536},"schedule ",[526,1863,557],{"class":540},[526,1865,1856],{"class":544},[526,1867,592],{"class":540},[526,1869,1870],{"class":536},"send",[526,1872,628],{"class":540},[526,1874,1875,1878,1880,1882,1884,1887,1889,1891,1893,1896,1898,1901,1904,1906,1909],{"class":528,"line":783},[526,1876,1877],{"class":536},"          onPressed",[526,1879,557],{"class":540},[526,1881,1062],{"class":536},[526,1883,592],{"class":540},[526,1885,1886],{"class":536},"isPending ",[526,1888,1831],{"class":540},[526,1890,1105],{"class":540},[526,1892,1837],{"class":540},[526,1894,1895],{"class":536}," () ",[526,1897,1337],{"class":540},[526,1899,1900],{"class":740}," mutate",[526,1902,1903],{"class":536},"(_controller",[526,1905,592],{"class":540},[526,1907,1908],{"class":536},"text)",[526,1910,628],{"class":540},[526,1912,1913,1915],{"class":528,"line":804},[526,1914,1522],{"class":536},[526,1916,628],{"class":540},[526,1918,1919,1922],{"class":528,"line":830},[526,1920,1921],{"class":536},"      ]",[526,1923,628],{"class":540},[526,1925,1926,1928],{"class":528,"line":837},[526,1927,634],{"class":536},[526,1929,727],{"class":540},[526,1931,1932,1934],{"class":528,"line":1325},[526,1933,1538],{"class":536},[526,1935,628],{"class":540},[526,1937,1938],{"class":528,"line":1331},[526,1939,912],{"class":536},[353,1941,1942,1943,1945,1946,1949,1950,1952,1953,1956,1957,1960],{},"On reconnect, ",[395,1944,202],{}," replays the queue in FIFO order automatically. The ",[395,1947,1948],{},"onSuccess"," callback (which calls ",[395,1951,1704],{},") fires only for ",[356,1954,1955],{},"real"," server confirmations (",[395,1958,1959],{},"isOptimistic: false","): never for the optimistic write.",[849,1962,1964,1966],{"id":1963},"networkmodealways-for-local-database-queries",[395,1965,417],{}," for local-database queries",[353,1968,1969],{},"Not all queries need connectivity. A query backed by a local Hive box or SQLite database should never be paused:",[499,1971,1974],{"className":519,"code":1972,"filename":1973,"language":522,"meta":505,"style":505},"QoraBuilder\u003CSettings>(\n  queryKey: const ['settings'],\n  fetcher: localDb.getSettings, // reads from Hive: no network needed\n  options: const QoraOptions(\n    networkMode: NetworkMode.always, // never pauses, never waits for connectivity\n    staleTime: Duration(hours: 1),\n  ),\n  builder: (context, state, _) { /* ... */ },\n)\n","settings_screen.dart",[395,1975,1976,1987,2004,2023,2035,2054,2075,2081,2106],{"__ignoreMap":505},[526,1977,1978,1980,1982,1985],{"class":528,"line":529},[526,1979,108],{"class":544},[526,1981,998],{"class":536},[526,1983,1984],{"class":544},"Settings",[526,1986,1588],{"class":536},[526,1988,1989,1991,1993,1995,1997,2000,2002],{"class":528,"line":551},[526,1990,1014],{"class":536},[526,1992,557],{"class":540},[526,1994,573],{"class":532},[526,1996,1021],{"class":536},[526,1998,1999],{"class":1024},"'settings'",[526,2001,1028],{"class":536},[526,2003,628],{"class":540},[526,2005,2006,2008,2010,2013,2015,2018,2020],{"class":528,"line":565},[526,2007,1035],{"class":536},[526,2009,557],{"class":540},[526,2011,2012],{"class":536}," localDb",[526,2014,592],{"class":540},[526,2016,2017],{"class":536},"getSettings",[526,2019,598],{"class":540},[526,2021,2022],{"class":601}," // reads from Hive: no network needed\n",[526,2024,2025,2027,2029,2031,2033],{"class":528,"line":581},[526,2026,1617],{"class":536},[526,2028,557],{"class":540},[526,2030,573],{"class":532},[526,2032,576],{"class":544},[526,2034,548],{"class":536},[526,2036,2037,2040,2042,2044,2046,2049,2051],{"class":528,"line":605},[526,2038,2039],{"class":536},"    networkMode",[526,2041,557],{"class":540},[526,2043,589],{"class":544},[526,2045,592],{"class":540},[526,2047,2048],{"class":536},"always",[526,2050,598],{"class":540},[526,2052,2053],{"class":601}," // never pauses, never waits for connectivity\n",[526,2055,2056,2059,2061,2063,2066,2068,2071,2073],{"class":528,"line":631},[526,2057,2058],{"class":536},"    staleTime",[526,2060,557],{"class":540},[526,2062,613],{"class":544},[526,2064,2065],{"class":536},"(hours",[526,2067,557],{"class":540},[526,2069,2070],{"class":621}," 1",[526,2072,625],{"class":536},[526,2074,628],{"class":540},[526,2076,2077,2079],{"class":528,"line":639},[526,2078,717],{"class":536},[526,2080,628],{"class":540},[526,2082,2083,2085,2087,2089,2091,2093,2095,2098,2101,2104],{"class":528,"line":654},[526,2084,1052],{"class":536},[526,2086,557],{"class":540},[526,2088,1057],{"class":536},[526,2090,598],{"class":540},[526,2092,1062],{"class":536},[526,2094,598],{"class":540},[526,2096,2097],{"class":536}," _) { ",[526,2099,2100],{"class":601},"/* ... */",[526,2102,2103],{"class":536}," }",[526,2105,628],{"class":540},[526,2107,2108],{"class":528,"line":669},[526,2109,912],{"class":536},[353,2111,2112],{},"This snippet is not part of the example app, which only talks to a remote API.",[353,2114,2115,2116,2118,2119,2121],{},"Mix ",[395,2117,417],{}," (local) and ",[395,2120,397],{}," (remote) queries freely in the same screen: Qora handles them independently.",[380,2123],{},[348,2125,2127],{"id":2126},"source-code","Source Code",[499,2129,2132],{"className":2130,"code":2131,"language":504,"meta":505},[502],"examples/ex_05_network_aware/\n├── lib/\n│   ├── main.dart                     ← QoraClient + ReconnectStrategy + QoraScope\n│   ├── features/\n│   │   └── feed/\n│   │       ├── data/feed_api.dart    ← HTTP layer\n│   │       ├── models/post.dart      ← Post model\n│   │       └── ui/\n│   │           ├── feed_screen.dart  ← FetchStatus.paused handling\n│   │           └── compose_screen.dart ← OfflineMutationQueue + isOptimistic\n│   └── shared/\n│       ├── connectivity/simulated_connectivity_manager.dart ← online/offline toggle for the demo\n│       └── widgets/\n│           └── offline_banner.dart   ← custom banner wrapped around NetworkStatusIndicator\n└── pubspec.yaml\n",[395,2133,2131],{"__ignoreMap":505},[353,2135,2136],{},[2137,2138,2142],"a",{"href":2139,"rel":2140},"https://github.com/meragix/qora/tree/main/examples/ex_05_network_aware",[2141],"nofollow","View full source code",[380,2144],{},[348,2146,2148],{"id":2147},"related","Related",[387,2150,2151,2168,2181,2188],{},[390,2152,2153,441,2157,1577,2160,1577,2162,2164,2165,2167],{},[2137,2154,2156],{"href":2155},"../recipes/network-aware","Network Aware Recipe",[395,2158,2159],{},"NetworkMode",[395,2161,492],{},[395,2163,432],{},", and ",[395,2166,440],{}," in depth",[390,2169,2170,441,2174,2176,2177,2180],{},[2137,2171,2173],{"href":2172},"../flutter-integration/network-status","Network Status",[395,2175,456],{}," and ",[395,2178,2179],{},"NetworkStatusBuilder"," widgets",[390,2182,2183,2187],{},[2137,2184,2186],{"href":2185},"./offline-first","Offline-First Case Study",": persistence across restarts (different concern from network awareness)",[390,2189,2190,441,2194,1577,2197],{},[2137,2191,2193],{"href":2192},"../api-reference/qora-options","QoraOptions API",[395,2195,2196],{},"networkMode",[395,2198,2199],{},"refetchOnReconnect",[2201,2202,2203],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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}",{"title":505,"searchDepth":551,"depth":551,"links":2205},[2206,2207,2208,2209,2218,2219],{"id":350,"depth":551,"text":351},{"id":384,"depth":551,"text":385},{"id":477,"depth":551,"text":478},{"id":846,"depth":551,"text":847,"children":2210},[2211,2213,2215,2216],{"id":851,"depth":565,"text":2212},"ReconnectStrategy: thundering-herd prevention",{"id":960,"depth":565,"text":2214},"FetchStatus.paused: accurate UI state without custom flags",{"id":1548,"depth":565,"text":1549},{"id":1963,"depth":565,"text":2217},"NetworkMode.always for local-database queries",{"id":2126,"depth":551,"text":2127},{"id":2147,"depth":551,"text":2148},"Queries pause automatically when offline, mutations queue for later, and everything replays on reconnect: with thundering-herd prevention built in.","md",null,{},{"icon":161},{"title":2226,"description":2227},"Case Study: Network Awareness - Qora","Production-grade offline/online handling with NetworkMode, FetchStatus, OfflineMutationQueue, and ReconnectStrategy. Zero user intervention on reconnect.","qQ1y6LU2hjzUCfNTSBeTlbvuQXFWM3LccI1eA7pP3ZQ",[2230,2232],{"title":311,"path":312,"stem":313,"description":2231,"icon":90,"children":-1},"A todo app that keeps working without a network: saved data on start, queries that pause offline, and writes queued and replayed in order on reconnect.",{"title":319,"path":320,"stem":321,"description":2233,"icon":126,"children":-1},"Replace QoraBuilder widget nesting with flat, composable hook calls: useQuery, useMutation, useInfiniteQuery, and global fetch indicators in a HookWidget",1794040402943]