[{"data":1,"prerenderedAt":4413},["ShallowReactive",2],{"navigation_docs_en":3,"-en-recipes-network-aware":342,"-en-recipes-network-aware-surround":4408},[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":158,"body":344,"description":4399,"extension":4400,"links":4401,"meta":4402,"navigation":4403,"path":159,"seo":4404,"stem":160,"__hash__":4407},"docs_en/en/04.recipes/05.network-aware.md",{"type":345,"value":346,"toc":4362},"minimark",[347,351,354,358,361,412,423,425,428,433,546,555,682,688,769,773,842,849,851,855,871,933,936,1063,1070,1202,1208,1216,1522,1524,1528,1534,1538,1550,1718,1722,1729,1737,1743,1749,1756,1766,2182,2186,2395,2399,2410,2416,2422,2424,2428,2435,2534,2538,2596,2598,2602,2609,2635,2641,2931,2938,2944,3016,3023,3028,3274,3278,3292,3526,3528,3532,4306,4308,4312,4358],[348,349,350],"p",{},"Qora provides network-aware behavior for queries and mutations. When connectivity is lost, Qora can pause fetches, queue mutations, and replay operations after reconnect.",[352,353],"hr",{},[355,356,243],"h2",{"id":357},"overview",[348,359,360],{},"Network awareness in Qora is built on three orthogonal primitives:",[362,363,364,377],"table",{},[365,366,367],"thead",{},[368,369,370,374],"tr",{},[371,372,373],"th",{},"Primitive",[371,375,376],{},"What it controls",[378,379,380,392,402],"tbody",{},[368,381,382,389],{},[383,384,385],"td",{},[386,387,388],"code",{},"NetworkMode",[383,390,391],{},"How a query or mutation behaves when offline",[368,393,394,399],{},[383,395,396],{},[386,397,398],{},"FetchStatus",[383,400,401],{},"Whether a fetch is actively running, paused, or idle",[368,403,404,409],{},[383,405,406],{},[386,407,408],{},"OfflineMutationQueue",[383,410,411],{},"FIFO queue that replays queued writes on reconnect",[348,413,414,415,418,419,422],{},"They are fully independent from each other. You can use ",[386,416,417],{},"NetworkMode.online"," (pause queries) without enabling the offline mutation queue, or use the queue on mutations while letting queries use ",[386,420,421],{},"NetworkMode.always",".",[352,424],{},[355,426,388],{"id":427},"networkmode",[348,429,430,432],{},[386,431,388],{}," is a per-query / per-mutation enum that tells Qora what to do when the device has no connectivity:",[434,435,441],"pre",{"className":436,"code":437,"filename":438,"language":439,"meta":440,"style":440},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","enum NetworkMode {\n  /// Default. Pause the fetch while offline and replay it on reconnect.\n  /// The state becomes Loading(previousData: \u003Ccached data or null>) and\n  /// FetchStatus becomes paused until connectivity returns.\n  online,\n\n  /// Always execute regardless of connectivity.\n  /// Useful when the fetcher uses a local database or cache.\n  always,\n\n  /// Serve cached data immediately, then schedule a background revalidation\n  /// when the device is back online.\n  offlineFirst,\n}\n","lib/core/qora.dart","dart","",[386,442,443,460,467,473,479,488,495,501,507,515,520,526,532,540],{"__ignoreMap":440},[444,445,448,452,456],"span",{"class":446,"line":447},"line",1,[444,449,451],{"class":450},"sMK4o","enum",[444,453,455],{"class":454},"sBMFI"," NetworkMode",[444,457,459],{"class":458},"sTEyZ"," {\n",[444,461,463],{"class":446,"line":462},2,[444,464,466],{"class":465},"sHwdD","  /// Default. Pause the fetch while offline and replay it on reconnect.\n",[444,468,470],{"class":446,"line":469},3,[444,471,472],{"class":465},"  /// The state becomes Loading(previousData: \u003Ccached data or null>) and\n",[444,474,476],{"class":446,"line":475},4,[444,477,478],{"class":465},"  /// FetchStatus becomes paused until connectivity returns.\n",[444,480,482,485],{"class":446,"line":481},5,[444,483,484],{"class":458},"  online",[444,486,487],{"class":450},",\n",[444,489,491],{"class":446,"line":490},6,[444,492,494],{"emptyLinePlaceholder":493},true,"\n",[444,496,498],{"class":446,"line":497},7,[444,499,500],{"class":465},"  /// Always execute regardless of connectivity.\n",[444,502,504],{"class":446,"line":503},8,[444,505,506],{"class":465},"  /// Useful when the fetcher uses a local database or cache.\n",[444,508,510,513],{"class":446,"line":509},9,[444,511,512],{"class":458},"  always",[444,514,487],{"class":450},[444,516,518],{"class":446,"line":517},10,[444,519,494],{"emptyLinePlaceholder":493},[444,521,523],{"class":446,"line":522},11,[444,524,525],{"class":465},"  /// Serve cached data immediately, then schedule a background revalidation\n",[444,527,529],{"class":446,"line":528},12,[444,530,531],{"class":465},"  /// when the device is back online.\n",[444,533,535,538],{"class":446,"line":534},13,[444,536,537],{"class":458},"  offlineFirst",[444,539,487],{"class":450},[444,541,543],{"class":446,"line":542},14,[444,544,545],{"class":458},"}\n",[547,548,550,551,554],"h3",{"id":549},"setting-networkmode-per-query","Setting ",[386,552,553],{},"networkMode"," per query",[434,556,559],{"className":436,"code":557,"filename":558,"language":439,"meta":440,"style":440},"final user = await client.fetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: const QoraOptions(networkMode: NetworkMode.online), // default\n);\n","lib/data/user_repository.dart",[386,560,561,595,618,644,674],{"__ignoreMap":440},[444,562,563,567,570,573,577,580,582,586,589,592],{"class":446,"line":447},[444,564,566],{"class":565},"spNyl","final",[444,568,569],{"class":458}," user ",[444,571,572],{"class":450},"=",[444,574,576],{"class":575},"s7zQu"," await",[444,578,579],{"class":458}," client",[444,581,422],{"class":450},[444,583,585],{"class":584},"s2Zo4","fetchQuery",[444,587,588],{"class":458},"\u003C",[444,590,591],{"class":454},"User",[444,593,594],{"class":458},">(\n",[444,596,597,600,603,606,610,613,616],{"class":446,"line":462},[444,598,599],{"class":458},"  key",[444,601,602],{"class":450},":",[444,604,605],{"class":458}," [",[444,607,609],{"class":608},"sfazB","'users'",[444,611,612],{"class":450},",",[444,614,615],{"class":458}," userId]",[444,617,487],{"class":450},[444,619,620,623,625,628,631,634,636,639,642],{"class":446,"line":469},[444,621,622],{"class":458},"  fetcher",[444,624,602],{"class":450},[444,626,627],{"class":458}," () ",[444,629,630],{"class":450},"=>",[444,632,633],{"class":458}," api",[444,635,422],{"class":450},[444,637,638],{"class":584},"getUser",[444,640,641],{"class":458},"(userId)",[444,643,487],{"class":450},[444,645,646,649,651,654,657,660,662,664,666,669,671],{"class":446,"line":475},[444,647,648],{"class":458},"  options",[444,650,602],{"class":450},[444,652,653],{"class":565}," const",[444,655,656],{"class":454}," QoraOptions",[444,658,659],{"class":458},"(networkMode",[444,661,602],{"class":450},[444,663,455],{"class":454},[444,665,422],{"class":450},[444,667,668],{"class":458},"online)",[444,670,612],{"class":450},[444,672,673],{"class":465}," // default\n",[444,675,676,679],{"class":446,"line":481},[444,677,678],{"class":458},")",[444,680,681],{"class":450},";\n",[547,683,550,685,687],{"id":684},"setting-networkmode-globally",[386,686,553],{}," globally",[434,689,691],{"className":436,"code":690,"filename":438,"language":439,"meta":440,"style":440},"final client = QoraClient(\n  config: const QoraClientConfig(\n    defaultOptions: QoraOptions(\n      networkMode: NetworkMode.online,\n    ),\n  ),\n);\n",[386,692,693,708,722,733,749,756,763],{"__ignoreMap":440},[444,694,695,697,700,702,705],{"class":446,"line":447},[444,696,566],{"class":565},[444,698,699],{"class":458}," client ",[444,701,572],{"class":450},[444,703,704],{"class":454}," QoraClient",[444,706,707],{"class":458},"(\n",[444,709,710,713,715,717,720],{"class":446,"line":462},[444,711,712],{"class":458},"  config",[444,714,602],{"class":450},[444,716,653],{"class":565},[444,718,719],{"class":454}," QoraClientConfig",[444,721,707],{"class":458},[444,723,724,727,729,731],{"class":446,"line":469},[444,725,726],{"class":458},"    defaultOptions",[444,728,602],{"class":450},[444,730,656],{"class":454},[444,732,707],{"class":458},[444,734,735,738,740,742,744,747],{"class":446,"line":475},[444,736,737],{"class":458},"      networkMode",[444,739,602],{"class":450},[444,741,455],{"class":454},[444,743,422],{"class":450},[444,745,746],{"class":458},"online",[444,748,487],{"class":450},[444,750,751,754],{"class":446,"line":481},[444,752,753],{"class":458},"    )",[444,755,487],{"class":450},[444,757,758,761],{"class":446,"line":490},[444,759,760],{"class":458},"  )",[444,762,487],{"class":450},[444,764,765,767],{"class":446,"line":497},[444,766,678],{"class":458},[444,768,681],{"class":450},[547,770,772],{"id":771},"behaviour-by-mode","Behaviour by mode",[362,774,775,788],{},[365,776,777],{},[368,778,779,782,785],{},[371,780,781],{},"Mode",[371,783,784],{},"Offline behaviour",[371,786,787],{},"On reconnect",[378,789,790,812,829],{},[368,791,792,797,809],{},[383,793,794,796],{},[386,795,746],{}," (default)",[383,798,799,800,804,805,808],{},"Fetch is ",[801,802,803],"strong",{},"paused",", ",[386,806,807],{},"FetchStatus.paused"," emitted",[383,810,811],{},"Replayed automatically",[368,813,814,819,826],{},[383,815,816],{},[386,817,818],{},"always",[383,820,821,822,825],{},"Fetch ",[801,823,824],{},"runs",": fails if no connectivity",[383,827,828],{},"Not retried on reconnect",[368,830,831,836,839],{},[383,832,833],{},[386,834,835],{},"offlineFirst",[383,837,838],{},"Cached data returned immediately",[383,840,841],{},"Background revalidation queued",[843,844,845,846,848],"tip",{},"Use ",[386,847,421],{}," for queries backed by a local SQLite database or Hive box: they never need connectivity and should never be paused.",[352,850],{},[355,852,854],{"id":853},"fetchstatus-the-second-axis","FetchStatus: the second axis",[348,856,857,860,861,864,865,860,867,870],{},[386,858,859],{},"QoraState\u003CT>"," describes ",[801,862,863],{},"what you have"," (initial / loading / success / failure). ",[386,866,398],{},[801,868,869],{},"what Qora is currently doing"," to get it:",[434,872,874],{"className":436,"code":873,"language":439,"meta":440,"style":440},"enum FetchStatus {\n  /// A network request is in flight.\n  fetching,\n\n  /// Queued for fetch but offline: will resume on reconnect.\n  paused,\n\n  /// No active fetch (data is fresh or no fetch has started yet).\n  idle,\n}\n",[386,875,876,885,890,897,901,906,913,917,922,929],{"__ignoreMap":440},[444,877,878,880,883],{"class":446,"line":447},[444,879,451],{"class":450},[444,881,882],{"class":454}," FetchStatus",[444,884,459],{"class":458},[444,886,887],{"class":446,"line":462},[444,888,889],{"class":465},"  /// A network request is in flight.\n",[444,891,892,895],{"class":446,"line":469},[444,893,894],{"class":458},"  fetching",[444,896,487],{"class":450},[444,898,899],{"class":446,"line":475},[444,900,494],{"emptyLinePlaceholder":493},[444,902,903],{"class":446,"line":481},[444,904,905],{"class":465},"  /// Queued for fetch but offline: will resume on reconnect.\n",[444,907,908,911],{"class":446,"line":490},[444,909,910],{"class":458},"  paused",[444,912,487],{"class":450},[444,914,915],{"class":446,"line":497},[444,916,494],{"emptyLinePlaceholder":493},[444,918,919],{"class":446,"line":503},[444,920,921],{"class":465},"  /// No active fetch (data is fresh or no fetch has started yet).\n",[444,923,924,927],{"class":446,"line":509},[444,925,926],{"class":458},"  idle",[444,928,487],{"class":450},[444,930,931],{"class":446,"line":517},[444,932,545],{"class":458},[348,934,935],{},"These two values form a two-dimensional grid. The most useful combinations are:",[362,937,938,953],{},[365,939,940],{},[368,941,942,946,950],{},[371,943,944],{},[386,945,211],{},[371,947,948],{},[386,949,398],{},[371,951,952],{},"Meaning",[378,954,955,970,987,1006,1020,1035,1049],{},[368,956,957,962,967],{},[383,958,959],{},[386,960,961],{},"Loading",[383,963,964],{},[386,965,966],{},"fetching",[383,968,969],{},"First fetch running",[368,971,972,980,984],{},[383,973,974,976,977,678],{},[386,975,961],{}," (no ",[386,978,979],{},"previousData",[383,981,982],{},[386,983,803],{},[383,985,986],{},"Offline, nothing cached: the fetch waits for the network",[368,988,989,996,1000],{},[383,990,991,993,994,678],{},[386,992,961],{}," (with ",[386,995,979],{},[383,997,998],{},[386,999,803],{},[383,1001,1002,1003,1005],{},"Offline, ",[386,1004,746],{}," mode: refetch waiting, cached data still available",[368,1007,1008,1013,1017],{},[383,1009,1010],{},[386,1011,1012],{},"Success",[383,1014,1015],{},[386,1016,966],{},[383,1018,1019],{},"Background revalidation running",[368,1021,1022,1026,1030],{},[383,1023,1024],{},[386,1025,1012],{},[383,1027,1028],{},[386,1029,803],{},[383,1031,1002,1032,1034],{},[386,1033,835],{}," mode: cached data served, refetch queued",[368,1036,1037,1041,1046],{},[383,1038,1039],{},[386,1040,1012],{},[383,1042,1043],{},[386,1044,1045],{},"idle",[383,1047,1048],{},"Data is fresh: nothing running",[368,1050,1051,1056,1060],{},[383,1052,1053],{},[386,1054,1055],{},"Failure",[383,1057,1058],{},[386,1059,1045],{},[383,1061,1062],{},"Last fetch failed, not retrying",[547,1064,1066,1067,1069],{"id":1065},"observing-fetchstatus-in-dart","Observing ",[386,1068,398],{}," in Dart",[434,1071,1073],{"className":436,"code":1072,"filename":558,"language":439,"meta":440,"style":440},"client.watchFetchStatus(['users', userId]).listen((status) {\n  switch (status) {\n    case FetchStatus.fetching:\n      print('Fetching…');\n    case FetchStatus.paused:\n      print('Offline: will retry when back online');\n    case FetchStatus.idle:\n      print('Done');\n  }\n});\n",[386,1074,1075,1103,1111,1125,1140,1152,1165,1177,1190,1195],{"__ignoreMap":440},[444,1076,1077,1080,1082,1085,1088,1090,1092,1095,1097,1100],{"class":446,"line":447},[444,1078,1079],{"class":458},"client",[444,1081,422],{"class":450},[444,1083,1084],{"class":584},"watchFetchStatus",[444,1086,1087],{"class":458},"([",[444,1089,609],{"class":608},[444,1091,612],{"class":450},[444,1093,1094],{"class":458}," userId])",[444,1096,422],{"class":450},[444,1098,1099],{"class":584},"listen",[444,1101,1102],{"class":458},"((status) {\n",[444,1104,1105,1108],{"class":446,"line":462},[444,1106,1107],{"class":575},"  switch",[444,1109,1110],{"class":458}," (status) {\n",[444,1112,1113,1116,1118,1120,1122],{"class":446,"line":469},[444,1114,1115],{"class":575},"    case",[444,1117,882],{"class":454},[444,1119,422],{"class":450},[444,1121,966],{"class":458},[444,1123,1124],{"class":450},":\n",[444,1126,1127,1130,1133,1136,1138],{"class":446,"line":475},[444,1128,1129],{"class":584},"      print",[444,1131,1132],{"class":458},"(",[444,1134,1135],{"class":608},"'Fetching…'",[444,1137,678],{"class":458},[444,1139,681],{"class":450},[444,1141,1142,1144,1146,1148,1150],{"class":446,"line":481},[444,1143,1115],{"class":575},[444,1145,882],{"class":454},[444,1147,422],{"class":450},[444,1149,803],{"class":458},[444,1151,1124],{"class":450},[444,1153,1154,1156,1158,1161,1163],{"class":446,"line":490},[444,1155,1129],{"class":584},[444,1157,1132],{"class":458},[444,1159,1160],{"class":608},"'Offline: will retry when back online'",[444,1162,678],{"class":458},[444,1164,681],{"class":450},[444,1166,1167,1169,1171,1173,1175],{"class":446,"line":497},[444,1168,1115],{"class":575},[444,1170,882],{"class":454},[444,1172,422],{"class":450},[444,1174,1045],{"class":458},[444,1176,1124],{"class":450},[444,1178,1179,1181,1183,1186,1188],{"class":446,"line":503},[444,1180,1129],{"class":584},[444,1182,1132],{"class":458},[444,1184,1185],{"class":608},"'Done'",[444,1187,678],{"class":458},[444,1189,681],{"class":450},[444,1191,1192],{"class":446,"line":509},[444,1193,1194],{"class":458},"  }\n",[444,1196,1197,1200],{"class":446,"line":517},[444,1198,1199],{"class":458},"})",[444,1201,681],{"class":450},[547,1203,1066,1205,1207],{"id":1204},"observing-fetchstatus-in-flutter",[386,1206,398],{}," in Flutter",[348,1209,1210,1212,1213,1215],{},[386,1211,108],{}," receives ",[386,1214,398],{}," as its third builder argument:",[434,1217,1220],{"className":436,"code":1218,"filename":1219,"language":439,"meta":440,"style":440},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  builder: (context, state, fetchStatus) {\n    // Show a \"paused\" chip when offline and waiting to fetch\n    final isPaused = fetchStatus == FetchStatus.paused;\n\n    return switch (state) {\n      Initial() => const SizedBox.shrink(),\n      Loading()  => isPaused\n          ? const OfflineWaitingIndicator()\n          : const CircularProgressIndicator(),\n      Success(:final data) => Column(\n          children: [\n            UserCard(data),\n            if (isPaused) const RefreshingOfflineChip(),\n          ],\n        ),\n      Failure(:final error) => ErrorBanner(error),\n    };\n  },\n)\n","lib/ui/screens/user_screen.dart",[386,1221,1222,1232,1249,1269,1289,1294,1318,1322,1333,1358,1371,1384,1398,1419,1429,1440,1459,1467,1475,1500,1508,1516],{"__ignoreMap":440},[444,1223,1224,1226,1228,1230],{"class":446,"line":447},[444,1225,108],{"class":454},[444,1227,588],{"class":458},[444,1229,591],{"class":454},[444,1231,594],{"class":458},[444,1233,1234,1237,1239,1241,1243,1245,1247],{"class":446,"line":462},[444,1235,1236],{"class":458},"  queryKey",[444,1238,602],{"class":450},[444,1240,605],{"class":458},[444,1242,609],{"class":608},[444,1244,612],{"class":450},[444,1246,615],{"class":458},[444,1248,487],{"class":450},[444,1250,1251,1253,1255,1257,1259,1261,1263,1265,1267],{"class":446,"line":469},[444,1252,622],{"class":458},[444,1254,602],{"class":450},[444,1256,627],{"class":458},[444,1258,630],{"class":450},[444,1260,633],{"class":458},[444,1262,422],{"class":450},[444,1264,638],{"class":584},[444,1266,641],{"class":458},[444,1268,487],{"class":450},[444,1270,1271,1274,1276,1279,1281,1284,1286],{"class":446,"line":475},[444,1272,1273],{"class":458},"  builder",[444,1275,602],{"class":450},[444,1277,1278],{"class":458}," (context",[444,1280,612],{"class":450},[444,1282,1283],{"class":458}," state",[444,1285,612],{"class":450},[444,1287,1288],{"class":458}," fetchStatus) {\n",[444,1290,1291],{"class":446,"line":481},[444,1292,1293],{"class":465},"    // Show a \"paused\" chip when offline and waiting to fetch\n",[444,1295,1296,1299,1302,1304,1307,1310,1312,1314,1316],{"class":446,"line":490},[444,1297,1298],{"class":565},"    final",[444,1300,1301],{"class":458}," isPaused ",[444,1303,572],{"class":450},[444,1305,1306],{"class":458}," fetchStatus ",[444,1308,1309],{"class":450},"==",[444,1311,882],{"class":454},[444,1313,422],{"class":450},[444,1315,803],{"class":458},[444,1317,681],{"class":450},[444,1319,1320],{"class":446,"line":497},[444,1321,494],{"emptyLinePlaceholder":493},[444,1323,1324,1327,1330],{"class":446,"line":503},[444,1325,1326],{"class":575},"    return",[444,1328,1329],{"class":575}," switch",[444,1331,1332],{"class":458}," (state) {\n",[444,1334,1335,1338,1341,1343,1345,1348,1350,1353,1356],{"class":446,"line":509},[444,1336,1337],{"class":454},"      Initial",[444,1339,1340],{"class":458},"() ",[444,1342,630],{"class":450},[444,1344,653],{"class":565},[444,1346,1347],{"class":454}," SizedBox",[444,1349,422],{"class":450},[444,1351,1352],{"class":584},"shrink",[444,1354,1355],{"class":458},"()",[444,1357,487],{"class":450},[444,1359,1360,1363,1366,1368],{"class":446,"line":517},[444,1361,1362],{"class":454},"      Loading",[444,1364,1365],{"class":458},"()  ",[444,1367,630],{"class":450},[444,1369,1370],{"class":458}," isPaused\n",[444,1372,1373,1376,1378,1381],{"class":446,"line":522},[444,1374,1375],{"class":450},"          ?",[444,1377,653],{"class":565},[444,1379,1380],{"class":454}," OfflineWaitingIndicator",[444,1382,1383],{"class":458},"()\n",[444,1385,1386,1389,1391,1394,1396],{"class":446,"line":528},[444,1387,1388],{"class":450},"          :",[444,1390,653],{"class":565},[444,1392,1393],{"class":454}," CircularProgressIndicator",[444,1395,1355],{"class":458},[444,1397,487],{"class":450},[444,1399,1400,1403,1405,1407,1409,1412,1414,1417],{"class":446,"line":534},[444,1401,1402],{"class":454},"      Success",[444,1404,1132],{"class":458},[444,1406,602],{"class":450},[444,1408,566],{"class":565},[444,1410,1411],{"class":458}," data) ",[444,1413,630],{"class":450},[444,1415,1416],{"class":454}," Column",[444,1418,707],{"class":458},[444,1420,1421,1424,1426],{"class":446,"line":542},[444,1422,1423],{"class":458},"          children",[444,1425,602],{"class":450},[444,1427,1428],{"class":458}," [\n",[444,1430,1432,1435,1438],{"class":446,"line":1431},15,[444,1433,1434],{"class":454},"            UserCard",[444,1436,1437],{"class":458},"(data)",[444,1439,487],{"class":450},[444,1441,1443,1446,1449,1452,1455,1457],{"class":446,"line":1442},16,[444,1444,1445],{"class":575},"            if",[444,1447,1448],{"class":458}," (isPaused) ",[444,1450,1451],{"class":565},"const",[444,1453,1454],{"class":454}," RefreshingOfflineChip",[444,1456,1355],{"class":458},[444,1458,487],{"class":450},[444,1460,1462,1465],{"class":446,"line":1461},17,[444,1463,1464],{"class":458},"          ]",[444,1466,487],{"class":450},[444,1468,1470,1473],{"class":446,"line":1469},18,[444,1471,1472],{"class":458},"        )",[444,1474,487],{"class":450},[444,1476,1478,1481,1483,1485,1487,1490,1492,1495,1498],{"class":446,"line":1477},19,[444,1479,1480],{"class":454},"      Failure",[444,1482,1132],{"class":458},[444,1484,602],{"class":450},[444,1486,566],{"class":565},[444,1488,1489],{"class":458}," error) ",[444,1491,630],{"class":450},[444,1493,1494],{"class":454}," ErrorBanner",[444,1496,1497],{"class":458},"(error)",[444,1499,487],{"class":450},[444,1501,1503,1506],{"class":446,"line":1502},20,[444,1504,1505],{"class":458},"    }",[444,1507,681],{"class":450},[444,1509,1511,1514],{"class":446,"line":1510},21,[444,1512,1513],{"class":458},"  }",[444,1515,487],{"class":450},[444,1517,1519],{"class":446,"line":1518},22,[444,1520,1521],{"class":458},")\n",[352,1523],{},[355,1525,1527],{"id":1526},"offline-mutation-queue","Offline Mutation Queue",[348,1529,1530,1531,1533],{},"The ",[386,1532,408],{}," holds write operations that could not be sent while offline and replays them in FIFO order when the device reconnects.",[547,1535,1537],{"id":1536},"enabling-the-queue","Enabling the queue",[348,1539,1540,1541,1543,1544,1546,1547,602],{},"The queue is automatically created and attached to ",[386,1542,202],{},". In Flutter, ",[386,1545,113],{}," injects it automatically. You only need to opt-in per mutation via ",[386,1548,1549],{},"MutationOptions",[434,1551,1554],{"className":436,"code":1552,"filename":1553,"language":439,"meta":440,"style":440},"QoraMutationBuilder\u003Cvoid, Todo, void>(\n  mutator: (todo) => api.createTodo(todo),\n  options: MutationOptions(\n    // Opt this mutation into the offline queue\n    offlineQueue: true,\n\n    // Provide an optimistic response so the UI updates immediately\n    optimisticResponse: (todo) => todo,\n  ),\n  builder: (context, state, mutate) {\n    return AddTodoButton(\n      onTap: () => mutate(newTodo),\n    );\n  },\n)\n","lib/ui/todo_screen.dart",[386,1555,1556,1576,1600,1611,1616,1626,1630,1635,1651,1657,1674,1683,1702,1708,1714],{"__ignoreMap":440},[444,1557,1558,1560,1562,1565,1567,1570,1572,1574],{"class":446,"line":447},[444,1559,113],{"class":454},[444,1561,588],{"class":458},[444,1563,1564],{"class":565},"void",[444,1566,804],{"class":458},[444,1568,1569],{"class":454},"Todo",[444,1571,804],{"class":458},[444,1573,1564],{"class":565},[444,1575,594],{"class":458},[444,1577,1578,1581,1583,1586,1588,1590,1592,1595,1598],{"class":446,"line":462},[444,1579,1580],{"class":458},"  mutator",[444,1582,602],{"class":450},[444,1584,1585],{"class":458}," (todo) ",[444,1587,630],{"class":450},[444,1589,633],{"class":458},[444,1591,422],{"class":450},[444,1593,1594],{"class":584},"createTodo",[444,1596,1597],{"class":458},"(todo)",[444,1599,487],{"class":450},[444,1601,1602,1604,1606,1609],{"class":446,"line":469},[444,1603,648],{"class":458},[444,1605,602],{"class":450},[444,1607,1608],{"class":454}," MutationOptions",[444,1610,707],{"class":458},[444,1612,1613],{"class":446,"line":475},[444,1614,1615],{"class":465},"    // Opt this mutation into the offline queue\n",[444,1617,1618,1621,1623],{"class":446,"line":481},[444,1619,1620],{"class":458},"    offlineQueue",[444,1622,602],{"class":450},[444,1624,1625],{"class":450}," true,\n",[444,1627,1628],{"class":446,"line":490},[444,1629,494],{"emptyLinePlaceholder":493},[444,1631,1632],{"class":446,"line":497},[444,1633,1634],{"class":465},"    // Provide an optimistic response so the UI updates immediately\n",[444,1636,1637,1640,1642,1644,1646,1649],{"class":446,"line":503},[444,1638,1639],{"class":458},"    optimisticResponse",[444,1641,602],{"class":450},[444,1643,1585],{"class":458},[444,1645,630],{"class":450},[444,1647,1648],{"class":458}," todo",[444,1650,487],{"class":450},[444,1652,1653,1655],{"class":446,"line":509},[444,1654,760],{"class":458},[444,1656,487],{"class":450},[444,1658,1659,1661,1663,1665,1667,1669,1671],{"class":446,"line":517},[444,1660,1273],{"class":458},[444,1662,602],{"class":450},[444,1664,1278],{"class":458},[444,1666,612],{"class":450},[444,1668,1283],{"class":458},[444,1670,612],{"class":450},[444,1672,1673],{"class":458}," mutate) {\n",[444,1675,1676,1678,1681],{"class":446,"line":522},[444,1677,1326],{"class":575},[444,1679,1680],{"class":454}," AddTodoButton",[444,1682,707],{"class":458},[444,1684,1685,1688,1690,1692,1694,1697,1700],{"class":446,"line":528},[444,1686,1687],{"class":458},"      onTap",[444,1689,602],{"class":450},[444,1691,627],{"class":458},[444,1693,630],{"class":450},[444,1695,1696],{"class":584}," mutate",[444,1698,1699],{"class":458},"(newTodo)",[444,1701,487],{"class":450},[444,1703,1704,1706],{"class":446,"line":534},[444,1705,753],{"class":458},[444,1707,681],{"class":450},[444,1709,1710,1712],{"class":446,"line":542},[444,1711,1513],{"class":458},[444,1713,487],{"class":450},[444,1715,1716],{"class":446,"line":1431},[444,1717,1521],{"class":458},[547,1719,1721],{"id":1720},"offline-flow-step-by-step","Offline flow: step by step",[348,1723,1724,1725,1728],{},"When ",[386,1726,1727],{},"offlineQueue: true"," and the device is offline:",[434,1730,1735],{"className":1731,"code":1733,"language":1734,"meta":440},[1732],"language-text","mutate(variables)\n      │\n      ├── offlineQueue: true & offline?\n      │       YES\n      │       ├── Enqueue PendingMutation (FIFO)\n      │       ├── optimisticResponse provided?\n      │       │       YES → emit MutationSuccess(isOptimistic: true)\n      │       │       NO  → stay MutationPending\n      │       └── ← return to caller\n      │\n      └── NO (online) → execute normally → MutationSuccess(isOptimistic: false)\n","text",[386,1736,1733],{"__ignoreMap":440},[348,1738,1739,1740,1742],{},"On reconnect, ",[386,1741,202],{}," replays the queue:",[434,1744,1747],{"className":1745,"code":1746,"language":1734,"meta":440},[1732],"reconnect detected\n      │\n      ├── Replay paused queries (batched, with jitter)\n      └── Replay OfflineMutationQueue (FIFO)\n              │\n              ├── each mutation runs once, in order\n              ├── success → onSuccess, invalidates, onSettled\n              └── failure → onError (rollback), onSettled, next mutation\n",[386,1748,1746],{"__ignoreMap":440},[547,1750,1752,1755],{"id":1751},"isoptimistic-styling-unconfirmed-mutations",[386,1753,1754],{},"isOptimistic",": styling unconfirmed mutations",[348,1757,1724,1758,1761,1762,1765],{},[386,1759,1760],{},"optimisticResponse"," is provided, the mutation emits ",[386,1763,1764],{},"MutationSuccess(isOptimistic: true)",". Use this flag in the UI to render a \"pending\" visual state (greyed out, clock icon, strikethrough) for items that have not yet been confirmed by the server:",[434,1767,1770],{"className":436,"code":1768,"filename":1769,"language":439,"meta":440,"style":440},"QoraMutationBuilder\u003Cvoid, Todo, void>(\n  mutator: api.createTodo,\n  options: MutationOptions(\n    offlineQueue: true,\n    optimisticResponse: (todo) => todo,\n\n    onSuccess: (_, todo, __) async {\n      // Runs for REAL success (isOptimistic: false) only after server confirms\n      context.qora.invalidate(['todos']);\n    },\n  ),\n  builder: (context, state, mutate) {\n    // Check isOptimistic on the MutationSuccess state\n    final isOptimistic = switch (state) {\n      MutationSuccess(:final isOptimistic) => isOptimistic,\n      _ => false,\n    };\n\n    return Column(\n      children: [\n        if (isOptimistic)\n          const Row(\n            children: [\n              Icon(Icons.schedule, size: 14),\n              SizedBox(width: 4),\n              Text('Queued: will sync when online'),\n            ],\n          ),\n        SubmitButton(\n          onTap: state.isPending ? null : () => mutate(newTodo),\n        ),\n      ],\n    );\n  },\n)\n","lib/ui/todo_list.dart",[386,1771,1772,1790,1804,1814,1822,1836,1840,1864,1869,1894,1900,1906,1922,1927,1940,1961,1971,1977,1981,1989,1998,2006,2016,2026,2057,2075,2090,2098,2106,2114,2148,2155,2163,2170,2177],{"__ignoreMap":440},[444,1773,1774,1776,1778,1780,1782,1784,1786,1788],{"class":446,"line":447},[444,1775,113],{"class":454},[444,1777,588],{"class":458},[444,1779,1564],{"class":565},[444,1781,804],{"class":458},[444,1783,1569],{"class":454},[444,1785,804],{"class":458},[444,1787,1564],{"class":565},[444,1789,594],{"class":458},[444,1791,1792,1794,1796,1798,1800,1802],{"class":446,"line":462},[444,1793,1580],{"class":458},[444,1795,602],{"class":450},[444,1797,633],{"class":458},[444,1799,422],{"class":450},[444,1801,1594],{"class":458},[444,1803,487],{"class":450},[444,1805,1806,1808,1810,1812],{"class":446,"line":469},[444,1807,648],{"class":458},[444,1809,602],{"class":450},[444,1811,1608],{"class":454},[444,1813,707],{"class":458},[444,1815,1816,1818,1820],{"class":446,"line":475},[444,1817,1620],{"class":458},[444,1819,602],{"class":450},[444,1821,1625],{"class":450},[444,1823,1824,1826,1828,1830,1832,1834],{"class":446,"line":481},[444,1825,1639],{"class":458},[444,1827,602],{"class":450},[444,1829,1585],{"class":458},[444,1831,630],{"class":450},[444,1833,1648],{"class":458},[444,1835,487],{"class":450},[444,1837,1838],{"class":446,"line":490},[444,1839,494],{"emptyLinePlaceholder":493},[444,1841,1842,1845,1847,1850,1852,1854,1856,1859,1862],{"class":446,"line":497},[444,1843,1844],{"class":458},"    onSuccess",[444,1846,602],{"class":450},[444,1848,1849],{"class":458}," (_",[444,1851,612],{"class":450},[444,1853,1648],{"class":458},[444,1855,612],{"class":450},[444,1857,1858],{"class":458}," __) ",[444,1860,1861],{"class":575},"async",[444,1863,459],{"class":458},[444,1865,1866],{"class":446,"line":503},[444,1867,1868],{"class":465},"      // Runs for REAL success (isOptimistic: false) only after server confirms\n",[444,1870,1871,1874,1876,1879,1881,1884,1886,1889,1892],{"class":446,"line":509},[444,1872,1873],{"class":458},"      context",[444,1875,422],{"class":450},[444,1877,1878],{"class":458},"qora",[444,1880,422],{"class":450},[444,1882,1883],{"class":584},"invalidate",[444,1885,1087],{"class":458},[444,1887,1888],{"class":608},"'todos'",[444,1890,1891],{"class":458},"])",[444,1893,681],{"class":450},[444,1895,1896,1898],{"class":446,"line":517},[444,1897,1505],{"class":458},[444,1899,487],{"class":450},[444,1901,1902,1904],{"class":446,"line":522},[444,1903,760],{"class":458},[444,1905,487],{"class":450},[444,1907,1908,1910,1912,1914,1916,1918,1920],{"class":446,"line":528},[444,1909,1273],{"class":458},[444,1911,602],{"class":450},[444,1913,1278],{"class":458},[444,1915,612],{"class":450},[444,1917,1283],{"class":458},[444,1919,612],{"class":450},[444,1921,1673],{"class":458},[444,1923,1924],{"class":446,"line":534},[444,1925,1926],{"class":465},"    // Check isOptimistic on the MutationSuccess state\n",[444,1928,1929,1931,1934,1936,1938],{"class":446,"line":542},[444,1930,1298],{"class":565},[444,1932,1933],{"class":458}," isOptimistic ",[444,1935,572],{"class":450},[444,1937,1329],{"class":575},[444,1939,1332],{"class":458},[444,1941,1942,1945,1947,1949,1951,1954,1956,1959],{"class":446,"line":1431},[444,1943,1944],{"class":454},"      MutationSuccess",[444,1946,1132],{"class":458},[444,1948,602],{"class":450},[444,1950,566],{"class":565},[444,1952,1953],{"class":458}," isOptimistic) ",[444,1955,630],{"class":450},[444,1957,1958],{"class":458}," isOptimistic",[444,1960,487],{"class":450},[444,1962,1963,1966,1968],{"class":446,"line":1442},[444,1964,1965],{"class":458},"      _ ",[444,1967,630],{"class":450},[444,1969,1970],{"class":450}," false,\n",[444,1972,1973,1975],{"class":446,"line":1461},[444,1974,1505],{"class":458},[444,1976,681],{"class":450},[444,1978,1979],{"class":446,"line":1469},[444,1980,494],{"emptyLinePlaceholder":493},[444,1982,1983,1985,1987],{"class":446,"line":1477},[444,1984,1326],{"class":575},[444,1986,1416],{"class":454},[444,1988,707],{"class":458},[444,1990,1991,1994,1996],{"class":446,"line":1502},[444,1992,1993],{"class":458},"      children",[444,1995,602],{"class":450},[444,1997,1428],{"class":458},[444,1999,2000,2003],{"class":446,"line":1510},[444,2001,2002],{"class":575},"        if",[444,2004,2005],{"class":458}," (isOptimistic)\n",[444,2007,2008,2011,2014],{"class":446,"line":1518},[444,2009,2010],{"class":565},"          const",[444,2012,2013],{"class":454}," Row",[444,2015,707],{"class":458},[444,2017,2019,2022,2024],{"class":446,"line":2018},23,[444,2020,2021],{"class":458},"            children",[444,2023,602],{"class":450},[444,2025,1428],{"class":458},[444,2027,2029,2032,2034,2037,2039,2042,2044,2047,2049,2053,2055],{"class":446,"line":2028},24,[444,2030,2031],{"class":454},"              Icon",[444,2033,1132],{"class":458},[444,2035,2036],{"class":454},"Icons",[444,2038,422],{"class":450},[444,2040,2041],{"class":458},"schedule",[444,2043,612],{"class":450},[444,2045,2046],{"class":458}," size",[444,2048,602],{"class":450},[444,2050,2052],{"class":2051},"sbssI"," 14",[444,2054,678],{"class":458},[444,2056,487],{"class":450},[444,2058,2060,2063,2066,2068,2071,2073],{"class":446,"line":2059},25,[444,2061,2062],{"class":454},"              SizedBox",[444,2064,2065],{"class":458},"(width",[444,2067,602],{"class":450},[444,2069,2070],{"class":2051}," 4",[444,2072,678],{"class":458},[444,2074,487],{"class":450},[444,2076,2078,2081,2083,2086,2088],{"class":446,"line":2077},26,[444,2079,2080],{"class":454},"              Text",[444,2082,1132],{"class":458},[444,2084,2085],{"class":608},"'Queued: will sync when online'",[444,2087,678],{"class":458},[444,2089,487],{"class":450},[444,2091,2093,2096],{"class":446,"line":2092},27,[444,2094,2095],{"class":458},"            ]",[444,2097,487],{"class":450},[444,2099,2101,2104],{"class":446,"line":2100},28,[444,2102,2103],{"class":458},"          )",[444,2105,487],{"class":450},[444,2107,2109,2112],{"class":446,"line":2108},29,[444,2110,2111],{"class":454},"        SubmitButton",[444,2113,707],{"class":458},[444,2115,2117,2120,2122,2124,2126,2129,2132,2135,2138,2140,2142,2144,2146],{"class":446,"line":2116},30,[444,2118,2119],{"class":458},"          onTap",[444,2121,602],{"class":450},[444,2123,1283],{"class":458},[444,2125,422],{"class":450},[444,2127,2128],{"class":458},"isPending ",[444,2130,2131],{"class":450},"?",[444,2133,2134],{"class":450}," null",[444,2136,2137],{"class":450}," :",[444,2139,627],{"class":458},[444,2141,630],{"class":450},[444,2143,1696],{"class":584},[444,2145,1699],{"class":458},[444,2147,487],{"class":450},[444,2149,2151,2153],{"class":446,"line":2150},31,[444,2152,1472],{"class":458},[444,2154,487],{"class":450},[444,2156,2158,2161],{"class":446,"line":2157},32,[444,2159,2160],{"class":458},"      ]",[444,2162,487],{"class":450},[444,2164,2166,2168],{"class":446,"line":2165},33,[444,2167,753],{"class":458},[444,2169,681],{"class":450},[444,2171,2173,2175],{"class":446,"line":2172},34,[444,2174,1513],{"class":458},[444,2176,487],{"class":450},[444,2178,2180],{"class":446,"line":2179},35,[444,2181,1521],{"class":458},[547,2183,2185],{"id":2184},"accessing-the-queue-directly","Accessing the queue directly",[434,2187,2190],{"className":436,"code":2188,"filename":2189,"language":439,"meta":440,"style":440},"// How many mutations are pending replay?\nfinal count = context.qora.offlineMutationQueue.length;\n\n// Inspect the pending mutations\nfor (final pending in context.qora.offlineMutationQueue.snapshot) {\n  print('${pending.mutatorId} enqueued at ${pending.enqueuedAt}');\n}\n\n// Manually trigger a replay (normally done automatically on reconnect)\nfinal result = await context.qora.offlineMutationQueue.replay();\nprint('Succeeded: ${result.succeeded}, Failed: ${result.failed}');\n","lib/ui/offline_indicator.dart",[386,2191,2192,2197,2225,2229,2234,2265,2310,2314,2318,2323,2353],{"__ignoreMap":440},[444,2193,2194],{"class":446,"line":447},[444,2195,2196],{"class":465},"// How many mutations are pending replay?\n",[444,2198,2199,2201,2204,2206,2209,2211,2213,2215,2218,2220,2223],{"class":446,"line":462},[444,2200,566],{"class":565},[444,2202,2203],{"class":458}," count ",[444,2205,572],{"class":450},[444,2207,2208],{"class":458}," context",[444,2210,422],{"class":450},[444,2212,1878],{"class":458},[444,2214,422],{"class":450},[444,2216,2217],{"class":458},"offlineMutationQueue",[444,2219,422],{"class":450},[444,2221,2222],{"class":458},"length",[444,2224,681],{"class":450},[444,2226,2227],{"class":446,"line":469},[444,2228,494],{"emptyLinePlaceholder":493},[444,2230,2231],{"class":446,"line":475},[444,2232,2233],{"class":465},"// Inspect the pending mutations\n",[444,2235,2236,2239,2242,2244,2247,2250,2252,2254,2256,2258,2260,2262],{"class":446,"line":481},[444,2237,2238],{"class":575},"for",[444,2240,2241],{"class":458}," (",[444,2243,566],{"class":565},[444,2245,2246],{"class":458}," pending ",[444,2248,2249],{"class":575},"in",[444,2251,2208],{"class":458},[444,2253,422],{"class":450},[444,2255,1878],{"class":458},[444,2257,422],{"class":450},[444,2259,2217],{"class":458},[444,2261,422],{"class":450},[444,2263,2264],{"class":458},"snapshot) {\n",[444,2266,2267,2270,2272,2275,2278,2282,2284,2287,2290,2293,2295,2297,2299,2302,2304,2306,2308],{"class":446,"line":490},[444,2268,2269],{"class":584},"  print",[444,2271,1132],{"class":458},[444,2273,2274],{"class":608},"'",[444,2276,2277],{"class":458},"${",[444,2279,2281],{"class":2280},"sHdIc","pending",[444,2283,422],{"class":458},[444,2285,2286],{"class":2280},"mutatorId",[444,2288,2289],{"class":458},"}",[444,2291,2292],{"class":608}," enqueued at ",[444,2294,2277],{"class":458},[444,2296,2281],{"class":2280},[444,2298,422],{"class":458},[444,2300,2301],{"class":2280},"enqueuedAt",[444,2303,2289],{"class":458},[444,2305,2274],{"class":608},[444,2307,678],{"class":458},[444,2309,681],{"class":450},[444,2311,2312],{"class":446,"line":497},[444,2313,545],{"class":458},[444,2315,2316],{"class":446,"line":503},[444,2317,494],{"emptyLinePlaceholder":493},[444,2319,2320],{"class":446,"line":509},[444,2321,2322],{"class":465},"// Manually trigger a replay (normally done automatically on reconnect)\n",[444,2324,2325,2327,2330,2332,2334,2336,2338,2340,2342,2344,2346,2349,2351],{"class":446,"line":517},[444,2326,566],{"class":565},[444,2328,2329],{"class":458}," result ",[444,2331,572],{"class":450},[444,2333,576],{"class":575},[444,2335,2208],{"class":458},[444,2337,422],{"class":450},[444,2339,1878],{"class":458},[444,2341,422],{"class":450},[444,2343,2217],{"class":458},[444,2345,422],{"class":450},[444,2347,2348],{"class":584},"replay",[444,2350,1355],{"class":458},[444,2352,681],{"class":450},[444,2354,2355,2358,2360,2363,2365,2368,2370,2373,2375,2378,2380,2382,2384,2387,2389,2391,2393],{"class":446,"line":522},[444,2356,2357],{"class":584},"print",[444,2359,1132],{"class":458},[444,2361,2362],{"class":608},"'Succeeded: ",[444,2364,2277],{"class":458},[444,2366,2367],{"class":2280},"result",[444,2369,422],{"class":458},[444,2371,2372],{"class":2280},"succeeded",[444,2374,2289],{"class":458},[444,2376,2377],{"class":608},", Failed: ",[444,2379,2277],{"class":458},[444,2381,2367],{"class":2280},[444,2383,422],{"class":458},[444,2385,2386],{"class":2280},"failed",[444,2388,2289],{"class":458},[444,2390,2274],{"class":608},[444,2392,678],{"class":458},[444,2394,681],{"class":450},[547,2396,2398],{"id":2397},"when-a-replayed-mutation-fails","When a replayed mutation fails",[348,2400,2401,2402,2405,2406,2409],{},"Each queued mutation is sent once, in order, through the same path as an online call. When the server rejects one, ",[386,2403,2404],{},"onError"," receives the context returned by ",[386,2407,2408],{},"onMutate"," at enqueue time, so the rollback you wrote for the online case also covers the offline one. Replay then continues with the next mutation.",[348,2411,2412,2413,2415],{},"A failed replay is not re-enqueued. Surface it from ",[386,2414,2404],{}," (a snackbar, a retry button) rather than relying on the next reconnect.",[348,2417,2418,2419,2421],{},"Keep queued mutations independent where you can. When one depends on another (create a todo, then complete it), the second one fails if the first was rejected, and its own ",[386,2420,2404],{}," rolls it back.",[352,2423],{},[355,2425,2427],{"id":2426},"reconnectstrategy-thundering-herd-prevention","ReconnectStrategy: thundering herd prevention",[348,2429,2430,2431,2434],{},"When connectivity returns and dozens of queries are paused, replaying them simultaneously floods the server. ",[386,2432,2433],{},"ReconnectStrategy"," introduces controlled concurrency and jitter:",[434,2436,2438],{"className":436,"code":2437,"filename":438,"language":439,"meta":440,"style":440},"final client = QoraClient(\n  config: QoraClientConfig(\n    reconnectStrategy: const ReconnectStrategy(\n      maxConcurrent: 5,              // Replay 5 queries at a time\n      jitter: Duration(milliseconds: 200), // Random delay between batches\n    ),\n  ),\n);\n",[386,2439,2440,2452,2462,2476,2491,2516,2522,2528],{"__ignoreMap":440},[444,2441,2442,2444,2446,2448,2450],{"class":446,"line":447},[444,2443,566],{"class":565},[444,2445,699],{"class":458},[444,2447,572],{"class":450},[444,2449,704],{"class":454},[444,2451,707],{"class":458},[444,2453,2454,2456,2458,2460],{"class":446,"line":462},[444,2455,712],{"class":458},[444,2457,602],{"class":450},[444,2459,719],{"class":454},[444,2461,707],{"class":458},[444,2463,2464,2467,2469,2471,2474],{"class":446,"line":469},[444,2465,2466],{"class":458},"    reconnectStrategy",[444,2468,602],{"class":450},[444,2470,653],{"class":565},[444,2472,2473],{"class":454}," ReconnectStrategy",[444,2475,707],{"class":458},[444,2477,2478,2481,2483,2486,2488],{"class":446,"line":475},[444,2479,2480],{"class":458},"      maxConcurrent",[444,2482,602],{"class":450},[444,2484,2485],{"class":2051}," 5",[444,2487,612],{"class":450},[444,2489,2490],{"class":465},"              // Replay 5 queries at a time\n",[444,2492,2493,2496,2498,2501,2504,2506,2509,2511,2513],{"class":446,"line":481},[444,2494,2495],{"class":458},"      jitter",[444,2497,602],{"class":450},[444,2499,2500],{"class":454}," Duration",[444,2502,2503],{"class":458},"(milliseconds",[444,2505,602],{"class":450},[444,2507,2508],{"class":2051}," 200",[444,2510,678],{"class":458},[444,2512,612],{"class":450},[444,2514,2515],{"class":465}," // Random delay between batches\n",[444,2517,2518,2520],{"class":446,"line":490},[444,2519,753],{"class":458},[444,2521,487],{"class":450},[444,2523,2524,2526],{"class":446,"line":497},[444,2525,760],{"class":458},[444,2527,487],{"class":450},[444,2529,2530,2532],{"class":446,"line":503},[444,2531,678],{"class":458},[444,2533,681],{"class":450},[547,2535,2537],{"id":2536},"named-constructors","Named constructors",[434,2539,2541],{"className":436,"code":2540,"language":439,"meta":440,"style":440},"// Default: 5 concurrent, 100 ms jitter\nconst ReconnectStrategy()\n\n// All queries replay simultaneously (useful for testing)\nReconnectStrategy.instant()\n\n// Conservative: 2 concurrent, 500 ms jitter\nReconnectStrategy.conservative()\n",[386,2542,2543,2548,2556,2560,2565,2576,2580,2585],{"__ignoreMap":440},[444,2544,2545],{"class":446,"line":447},[444,2546,2547],{"class":465},"// Default: 5 concurrent, 100 ms jitter\n",[444,2549,2550,2552,2554],{"class":446,"line":462},[444,2551,1451],{"class":565},[444,2553,2473],{"class":454},[444,2555,1383],{"class":458},[444,2557,2558],{"class":446,"line":469},[444,2559,494],{"emptyLinePlaceholder":493},[444,2561,2562],{"class":446,"line":475},[444,2563,2564],{"class":465},"// All queries replay simultaneously (useful for testing)\n",[444,2566,2567,2569,2571,2574],{"class":446,"line":481},[444,2568,2433],{"class":454},[444,2570,422],{"class":450},[444,2572,2573],{"class":584},"instant",[444,2575,1383],{"class":458},[444,2577,2578],{"class":446,"line":490},[444,2579,494],{"emptyLinePlaceholder":493},[444,2581,2582],{"class":446,"line":497},[444,2583,2584],{"class":465},"// Conservative: 2 concurrent, 500 ms jitter\n",[444,2586,2587,2589,2591,2594],{"class":446,"line":503},[444,2588,2433],{"class":454},[444,2590,422],{"class":450},[444,2592,2593],{"class":584},"conservative",[444,2595,1383],{"class":458},[352,2597],{},[355,2599,2601],{"id":2600},"flutter-setup","Flutter Setup",[547,2603,2605,2606],{"id":2604},"_1-install-connectivity_plus","1. Install ",[386,2607,2608],{},"connectivity_plus",[434,2610,2615],{"className":2611,"code":2612,"filename":2613,"language":2614,"meta":440,"style":440},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependencies:\n  connectivity_plus: ^6.0.0\n","pubspec.yaml","yaml",[386,2616,2617,2625],{"__ignoreMap":440},[444,2618,2619,2623],{"class":446,"line":447},[444,2620,2622],{"class":2621},"swJcz","dependencies",[444,2624,1124],{"class":450},[444,2626,2627,2630,2632],{"class":446,"line":462},[444,2628,2629],{"class":2621},"  connectivity_plus",[444,2631,602],{"class":450},[444,2633,2634],{"class":608}," ^6.0.0\n",[547,2636,2638,2639],{"id":2637},"_2-wire-up-qorascope","2. Wire up ",[386,2640,103],{},[434,2642,2645],{"className":436,"code":2643,"filename":2644,"language":439,"meta":440,"style":440},"import 'package:flutter/foundation.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nvoid main() {\n  final client = QoraClient(\n    config: const QoraClientConfig(\n      defaultOptions: QoraOptions(\n        staleTime: Duration(minutes: 5),\n        networkMode: NetworkMode.online,\n      ),\n      reconnectStrategy: ReconnectStrategy(\n        maxConcurrent: 5,\n        jitter: Duration(milliseconds: 100),\n      ),\n      debugMode: kDebugMode,\n    ),\n  );\n\n  runApp(\n    QoraScope(\n      client: client,\n      lifecycleManager: FlutterLifecycleManager(qoraClient: client),\n      // No QoraClient reference needed: pure signal provider\n      connectivityManager: FlutterConnectivityManager(),\n      child: const MyApp(),\n    ),\n  );\n}\n","lib/main.dart",[386,2646,2647,2657,2666,2670,2680,2693,2706,2717,2737,2752,2759,2770,2781,2801,2807,2819,2825,2831,2835,2842,2849,2860,2880,2885,2899,2915,2921,2927],{"__ignoreMap":440},[444,2648,2649,2652,2655],{"class":446,"line":447},[444,2650,2651],{"class":2051},"import",[444,2653,2654],{"class":608}," 'package:flutter/foundation.dart'",[444,2656,681],{"class":450},[444,2658,2659,2661,2664],{"class":446,"line":462},[444,2660,2651],{"class":2051},[444,2662,2663],{"class":608}," 'package:qora_flutter/qora_flutter.dart'",[444,2665,681],{"class":450},[444,2667,2668],{"class":446,"line":469},[444,2669,494],{"emptyLinePlaceholder":493},[444,2671,2672,2674,2677],{"class":446,"line":475},[444,2673,1564],{"class":565},[444,2675,2676],{"class":584}," main",[444,2678,2679],{"class":458},"() {\n",[444,2681,2682,2685,2687,2689,2691],{"class":446,"line":481},[444,2683,2684],{"class":565},"  final",[444,2686,699],{"class":458},[444,2688,572],{"class":450},[444,2690,704],{"class":454},[444,2692,707],{"class":458},[444,2694,2695,2698,2700,2702,2704],{"class":446,"line":490},[444,2696,2697],{"class":458},"    config",[444,2699,602],{"class":450},[444,2701,653],{"class":565},[444,2703,719],{"class":454},[444,2705,707],{"class":458},[444,2707,2708,2711,2713,2715],{"class":446,"line":497},[444,2709,2710],{"class":458},"      defaultOptions",[444,2712,602],{"class":450},[444,2714,656],{"class":454},[444,2716,707],{"class":458},[444,2718,2719,2722,2724,2726,2729,2731,2733,2735],{"class":446,"line":503},[444,2720,2721],{"class":458},"        staleTime",[444,2723,602],{"class":450},[444,2725,2500],{"class":454},[444,2727,2728],{"class":458},"(minutes",[444,2730,602],{"class":450},[444,2732,2485],{"class":2051},[444,2734,678],{"class":458},[444,2736,487],{"class":450},[444,2738,2739,2742,2744,2746,2748,2750],{"class":446,"line":509},[444,2740,2741],{"class":458},"        networkMode",[444,2743,602],{"class":450},[444,2745,455],{"class":454},[444,2747,422],{"class":450},[444,2749,746],{"class":458},[444,2751,487],{"class":450},[444,2753,2754,2757],{"class":446,"line":517},[444,2755,2756],{"class":458},"      )",[444,2758,487],{"class":450},[444,2760,2761,2764,2766,2768],{"class":446,"line":522},[444,2762,2763],{"class":458},"      reconnectStrategy",[444,2765,602],{"class":450},[444,2767,2473],{"class":454},[444,2769,707],{"class":458},[444,2771,2772,2775,2777,2779],{"class":446,"line":528},[444,2773,2774],{"class":458},"        maxConcurrent",[444,2776,602],{"class":450},[444,2778,2485],{"class":2051},[444,2780,487],{"class":450},[444,2782,2783,2786,2788,2790,2792,2794,2797,2799],{"class":446,"line":534},[444,2784,2785],{"class":458},"        jitter",[444,2787,602],{"class":450},[444,2789,2500],{"class":454},[444,2791,2503],{"class":458},[444,2793,602],{"class":450},[444,2795,2796],{"class":2051}," 100",[444,2798,678],{"class":458},[444,2800,487],{"class":450},[444,2802,2803,2805],{"class":446,"line":542},[444,2804,2756],{"class":458},[444,2806,487],{"class":450},[444,2808,2809,2812,2814,2817],{"class":446,"line":1431},[444,2810,2811],{"class":458},"      debugMode",[444,2813,602],{"class":450},[444,2815,2816],{"class":458}," kDebugMode",[444,2818,487],{"class":450},[444,2820,2821,2823],{"class":446,"line":1442},[444,2822,753],{"class":458},[444,2824,487],{"class":450},[444,2826,2827,2829],{"class":446,"line":1461},[444,2828,760],{"class":458},[444,2830,681],{"class":450},[444,2832,2833],{"class":446,"line":1469},[444,2834,494],{"emptyLinePlaceholder":493},[444,2836,2837,2840],{"class":446,"line":1477},[444,2838,2839],{"class":584},"  runApp",[444,2841,707],{"class":458},[444,2843,2844,2847],{"class":446,"line":1502},[444,2845,2846],{"class":454},"    QoraScope",[444,2848,707],{"class":458},[444,2850,2851,2854,2856,2858],{"class":446,"line":1510},[444,2852,2853],{"class":458},"      client",[444,2855,602],{"class":450},[444,2857,579],{"class":458},[444,2859,487],{"class":450},[444,2861,2862,2865,2867,2870,2873,2875,2878],{"class":446,"line":1518},[444,2863,2864],{"class":458},"      lifecycleManager",[444,2866,602],{"class":450},[444,2868,2869],{"class":454}," FlutterLifecycleManager",[444,2871,2872],{"class":458},"(qoraClient",[444,2874,602],{"class":450},[444,2876,2877],{"class":458}," client)",[444,2879,487],{"class":450},[444,2881,2882],{"class":446,"line":2018},[444,2883,2884],{"class":465},"      // No QoraClient reference needed: pure signal provider\n",[444,2886,2887,2890,2892,2895,2897],{"class":446,"line":2028},[444,2888,2889],{"class":458},"      connectivityManager",[444,2891,602],{"class":450},[444,2893,2894],{"class":454}," FlutterConnectivityManager",[444,2896,1355],{"class":458},[444,2898,487],{"class":450},[444,2900,2901,2904,2906,2908,2911,2913],{"class":446,"line":2059},[444,2902,2903],{"class":458},"      child",[444,2905,602],{"class":450},[444,2907,653],{"class":565},[444,2909,2910],{"class":454}," MyApp",[444,2912,1355],{"class":458},[444,2914,487],{"class":450},[444,2916,2917,2919],{"class":446,"line":2077},[444,2918,753],{"class":458},[444,2920,487],{"class":450},[444,2922,2923,2925],{"class":446,"line":2092},[444,2924,760],{"class":458},[444,2926,681],{"class":450},[444,2928,2929],{"class":446,"line":2100},[444,2930,545],{"class":458},[547,2932,2934,2935],{"id":2933},"_3-add-networkstatusindicator","3. Add ",[386,2936,2937],{},"NetworkStatusIndicator",[348,2939,2940,2941,2943],{},"Wrap your app (or any sub-tree) with ",[386,2942,2937],{}," to show an offline banner automatically:",[434,2945,2947],{"className":436,"code":2946,"filename":2644,"language":439,"meta":440,"style":440},"QoraScope(\n  client: client,\n  connectivityManager: FlutterConnectivityManager(),\n  child: NetworkStatusIndicator(\n    child: const MyApp(),\n  ),\n)\n",[386,2948,2949,2955,2966,2979,2991,3006,3012],{"__ignoreMap":440},[444,2950,2951,2953],{"class":446,"line":447},[444,2952,103],{"class":454},[444,2954,707],{"class":458},[444,2956,2957,2960,2962,2964],{"class":446,"line":462},[444,2958,2959],{"class":458},"  client",[444,2961,602],{"class":450},[444,2963,579],{"class":458},[444,2965,487],{"class":450},[444,2967,2968,2971,2973,2975,2977],{"class":446,"line":469},[444,2969,2970],{"class":458},"  connectivityManager",[444,2972,602],{"class":450},[444,2974,2894],{"class":454},[444,2976,1355],{"class":458},[444,2978,487],{"class":450},[444,2980,2981,2984,2986,2989],{"class":446,"line":475},[444,2982,2983],{"class":458},"  child",[444,2985,602],{"class":450},[444,2987,2988],{"class":454}," NetworkStatusIndicator",[444,2990,707],{"class":458},[444,2992,2993,2996,2998,3000,3002,3004],{"class":446,"line":481},[444,2994,2995],{"class":458},"    child",[444,2997,602],{"class":450},[444,2999,653],{"class":565},[444,3001,2910],{"class":454},[444,3003,1355],{"class":458},[444,3005,487],{"class":450},[444,3007,3008,3010],{"class":446,"line":490},[444,3009,760],{"class":458},[444,3011,487],{"class":450},[444,3013,3014],{"class":446,"line":497},[444,3015,1521],{"class":458},[348,3017,3018,3019,3022],{},"This renders a thin dark bar at the bottom of the screen saying \"Offline mode\" whenever ",[386,3020,3021],{},"NetworkStatus.offline"," is detected.",[3024,3025,3027],"h4",{"id":3026},"custom-offline-banner","Custom offline banner",[434,3029,3031],{"className":436,"code":3030,"filename":2644,"language":439,"meta":440,"style":440},"NetworkStatusIndicator(\n  offlineBanner: (context) => Container(\n    color: Colors.orange,\n    padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),\n    child: const Row(\n      mainAxisAlignment: MainAxisAlignment.center,\n      children: [\n        Icon(Icons.wifi_off, color: Colors.white, size: 16),\n        SizedBox(width: 8),\n        Text('No connection', style: TextStyle(color: Colors.white)),\n      ],\n    ),\n  ),\n  child: const MyApp(),\n)\n",[386,3032,3033,3039,3056,3073,3112,3124,3141,3149,3189,3204,3238,3244,3250,3256,3270],{"__ignoreMap":440},[444,3034,3035,3037],{"class":446,"line":447},[444,3036,2937],{"class":454},[444,3038,707],{"class":458},[444,3040,3041,3044,3046,3049,3051,3054],{"class":446,"line":462},[444,3042,3043],{"class":458},"  offlineBanner",[444,3045,602],{"class":450},[444,3047,3048],{"class":458}," (context) ",[444,3050,630],{"class":450},[444,3052,3053],{"class":454}," Container",[444,3055,707],{"class":458},[444,3057,3058,3061,3063,3066,3068,3071],{"class":446,"line":469},[444,3059,3060],{"class":458},"    color",[444,3062,602],{"class":450},[444,3064,3065],{"class":454}," Colors",[444,3067,422],{"class":450},[444,3069,3070],{"class":458},"orange",[444,3072,487],{"class":450},[444,3074,3075,3078,3080,3082,3085,3087,3090,3093,3095,3098,3100,3103,3105,3108,3110],{"class":446,"line":475},[444,3076,3077],{"class":458},"    padding",[444,3079,602],{"class":450},[444,3081,653],{"class":565},[444,3083,3084],{"class":454}," EdgeInsets",[444,3086,422],{"class":450},[444,3088,3089],{"class":584},"symmetric",[444,3091,3092],{"class":458},"(vertical",[444,3094,602],{"class":450},[444,3096,3097],{"class":2051}," 8",[444,3099,612],{"class":450},[444,3101,3102],{"class":458}," horizontal",[444,3104,602],{"class":450},[444,3106,3107],{"class":2051}," 16",[444,3109,678],{"class":458},[444,3111,487],{"class":450},[444,3113,3114,3116,3118,3120,3122],{"class":446,"line":481},[444,3115,2995],{"class":458},[444,3117,602],{"class":450},[444,3119,653],{"class":565},[444,3121,2013],{"class":454},[444,3123,707],{"class":458},[444,3125,3126,3129,3131,3134,3136,3139],{"class":446,"line":490},[444,3127,3128],{"class":458},"      mainAxisAlignment",[444,3130,602],{"class":450},[444,3132,3133],{"class":454}," MainAxisAlignment",[444,3135,422],{"class":450},[444,3137,3138],{"class":458},"center",[444,3140,487],{"class":450},[444,3142,3143,3145,3147],{"class":446,"line":497},[444,3144,1993],{"class":458},[444,3146,602],{"class":450},[444,3148,1428],{"class":458},[444,3150,3151,3154,3156,3158,3160,3163,3165,3168,3170,3172,3174,3177,3179,3181,3183,3185,3187],{"class":446,"line":503},[444,3152,3153],{"class":454},"        Icon",[444,3155,1132],{"class":458},[444,3157,2036],{"class":454},[444,3159,422],{"class":450},[444,3161,3162],{"class":458},"wifi_off",[444,3164,612],{"class":450},[444,3166,3167],{"class":458}," color",[444,3169,602],{"class":450},[444,3171,3065],{"class":454},[444,3173,422],{"class":450},[444,3175,3176],{"class":458},"white",[444,3178,612],{"class":450},[444,3180,2046],{"class":458},[444,3182,602],{"class":450},[444,3184,3107],{"class":2051},[444,3186,678],{"class":458},[444,3188,487],{"class":450},[444,3190,3191,3194,3196,3198,3200,3202],{"class":446,"line":509},[444,3192,3193],{"class":454},"        SizedBox",[444,3195,2065],{"class":458},[444,3197,602],{"class":450},[444,3199,3097],{"class":2051},[444,3201,678],{"class":458},[444,3203,487],{"class":450},[444,3205,3206,3209,3211,3214,3216,3219,3221,3224,3227,3229,3231,3233,3236],{"class":446,"line":517},[444,3207,3208],{"class":454},"        Text",[444,3210,1132],{"class":458},[444,3212,3213],{"class":608},"'No connection'",[444,3215,612],{"class":450},[444,3217,3218],{"class":458}," style",[444,3220,602],{"class":450},[444,3222,3223],{"class":454}," TextStyle",[444,3225,3226],{"class":458},"(color",[444,3228,602],{"class":450},[444,3230,3065],{"class":454},[444,3232,422],{"class":450},[444,3234,3235],{"class":458},"white))",[444,3237,487],{"class":450},[444,3239,3240,3242],{"class":446,"line":522},[444,3241,2160],{"class":458},[444,3243,487],{"class":450},[444,3245,3246,3248],{"class":446,"line":528},[444,3247,753],{"class":458},[444,3249,487],{"class":450},[444,3251,3252,3254],{"class":446,"line":534},[444,3253,760],{"class":458},[444,3255,487],{"class":450},[444,3257,3258,3260,3262,3264,3266,3268],{"class":446,"line":542},[444,3259,2983],{"class":458},[444,3261,602],{"class":450},[444,3263,653],{"class":565},[444,3265,2910],{"class":454},[444,3267,1355],{"class":458},[444,3269,487],{"class":450},[444,3271,3272],{"class":446,"line":1431},[444,3273,1521],{"class":458},[3024,3275,3277],{"id":3276},"full-builder-control","Full builder control",[348,3279,845,3280,3283,3284,3287,3288,3291],{},[386,3281,3282],{},"builder"," when you need to react to ",[386,3285,3286],{},"NetworkStatus.online"," or ",[386,3289,3290],{},"NetworkStatus.unknown"," as well:",[434,3293,3295],{"className":436,"code":3294,"filename":2644,"language":439,"meta":440,"style":440},"NetworkStatusIndicator(\n  builder: (context, status, child) {\n    return Stack(\n      children: [\n        child!,\n        if (status == NetworkStatus.offline)\n          const Positioned(\n            bottom: 0, left: 0, right: 0,\n            child: MyOfflineBanner(),\n          ),\n        if (status == NetworkStatus.unknown)\n          const Positioned(\n            bottom: 0, left: 0, right: 0,\n            child: MyCheckingBanner(),\n          ),\n      ],\n    );\n  },\n  child: const MyApp(),\n)\n",[386,3296,3297,3303,3321,3330,3338,3346,3363,3372,3402,3416,3422,3437,3445,3471,3484,3490,3496,3502,3508,3522],{"__ignoreMap":440},[444,3298,3299,3301],{"class":446,"line":447},[444,3300,2937],{"class":454},[444,3302,707],{"class":458},[444,3304,3305,3307,3309,3311,3313,3316,3318],{"class":446,"line":462},[444,3306,1273],{"class":458},[444,3308,602],{"class":450},[444,3310,1278],{"class":458},[444,3312,612],{"class":450},[444,3314,3315],{"class":458}," status",[444,3317,612],{"class":450},[444,3319,3320],{"class":458}," child) {\n",[444,3322,3323,3325,3328],{"class":446,"line":469},[444,3324,1326],{"class":575},[444,3326,3327],{"class":454}," Stack",[444,3329,707],{"class":458},[444,3331,3332,3334,3336],{"class":446,"line":475},[444,3333,1993],{"class":458},[444,3335,602],{"class":450},[444,3337,1428],{"class":458},[444,3339,3340,3343],{"class":446,"line":481},[444,3341,3342],{"class":458},"        child",[444,3344,3345],{"class":450},"!,\n",[444,3347,3348,3350,3353,3355,3358,3360],{"class":446,"line":490},[444,3349,2002],{"class":575},[444,3351,3352],{"class":458}," (status ",[444,3354,1309],{"class":450},[444,3356,3357],{"class":454}," NetworkStatus",[444,3359,422],{"class":450},[444,3361,3362],{"class":458},"offline)\n",[444,3364,3365,3367,3370],{"class":446,"line":497},[444,3366,2010],{"class":565},[444,3368,3369],{"class":454}," Positioned",[444,3371,707],{"class":458},[444,3373,3374,3377,3379,3382,3384,3387,3389,3391,3393,3396,3398,3400],{"class":446,"line":503},[444,3375,3376],{"class":458},"            bottom",[444,3378,602],{"class":450},[444,3380,3381],{"class":2051}," 0",[444,3383,612],{"class":450},[444,3385,3386],{"class":458}," left",[444,3388,602],{"class":450},[444,3390,3381],{"class":2051},[444,3392,612],{"class":450},[444,3394,3395],{"class":458}," right",[444,3397,602],{"class":450},[444,3399,3381],{"class":2051},[444,3401,487],{"class":450},[444,3403,3404,3407,3409,3412,3414],{"class":446,"line":509},[444,3405,3406],{"class":458},"            child",[444,3408,602],{"class":450},[444,3410,3411],{"class":454}," MyOfflineBanner",[444,3413,1355],{"class":458},[444,3415,487],{"class":450},[444,3417,3418,3420],{"class":446,"line":517},[444,3419,2103],{"class":458},[444,3421,487],{"class":450},[444,3423,3424,3426,3428,3430,3432,3434],{"class":446,"line":522},[444,3425,2002],{"class":575},[444,3427,3352],{"class":458},[444,3429,1309],{"class":450},[444,3431,3357],{"class":454},[444,3433,422],{"class":450},[444,3435,3436],{"class":458},"unknown)\n",[444,3438,3439,3441,3443],{"class":446,"line":528},[444,3440,2010],{"class":565},[444,3442,3369],{"class":454},[444,3444,707],{"class":458},[444,3446,3447,3449,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469],{"class":446,"line":534},[444,3448,3376],{"class":458},[444,3450,602],{"class":450},[444,3452,3381],{"class":2051},[444,3454,612],{"class":450},[444,3456,3386],{"class":458},[444,3458,602],{"class":450},[444,3460,3381],{"class":2051},[444,3462,612],{"class":450},[444,3464,3395],{"class":458},[444,3466,602],{"class":450},[444,3468,3381],{"class":2051},[444,3470,487],{"class":450},[444,3472,3473,3475,3477,3480,3482],{"class":446,"line":542},[444,3474,3406],{"class":458},[444,3476,602],{"class":450},[444,3478,3479],{"class":454}," MyCheckingBanner",[444,3481,1355],{"class":458},[444,3483,487],{"class":450},[444,3485,3486,3488],{"class":446,"line":1431},[444,3487,2103],{"class":458},[444,3489,487],{"class":450},[444,3491,3492,3494],{"class":446,"line":1442},[444,3493,2160],{"class":458},[444,3495,487],{"class":450},[444,3497,3498,3500],{"class":446,"line":1461},[444,3499,753],{"class":458},[444,3501,681],{"class":450},[444,3503,3504,3506],{"class":446,"line":1469},[444,3505,1513],{"class":458},[444,3507,487],{"class":450},[444,3509,3510,3512,3514,3516,3518,3520],{"class":446,"line":1477},[444,3511,2983],{"class":458},[444,3513,602],{"class":450},[444,3515,653],{"class":565},[444,3517,2910],{"class":454},[444,3519,1355],{"class":458},[444,3521,487],{"class":450},[444,3523,3524],{"class":446,"line":1502},[444,3525,1521],{"class":458},[352,3527],{},[355,3529,3531],{"id":3530},"complete-example-offline-first-todo-app","Complete Example: Offline-First Todo App",[434,3533,3535],{"className":436,"code":3534,"filename":1553,"language":439,"meta":440,"style":440},"import 'package:flutter/material.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nclass TodoScreen extends StatelessWidget {\n  const TodoScreen({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: QoraBuilder\u003CList\u003CTodo>>(\n        queryKey: const ['todos'],\n        fetcher: api.getTodos,\n        builder: (context, state, fetchStatus) {\n          // Paused → offline, waiting to load for the first time\n          if (fetchStatus == FetchStatus.paused && state.dataOrNull == null) {\n            return const Center(child: Text('Offline: connect to load todos'));\n          }\n\n          return switch (state) {\n            Initial()  => const SizedBox.shrink(),\n            Loading()  => const CircularProgressIndicator(),\n            Failure(:final error) => ErrorScreen(error),\n            Success(:final data)  => TodoList(\n                todos: data,\n                isRefreshing: fetchStatus == FetchStatus.fetching,\n                isStale: fetchStatus == FetchStatus.paused,\n              ),\n          };\n        },\n      ),\n      floatingActionButton: QoraMutationBuilder\u003Cvoid, String, void>(\n        mutator: (title) => api.createTodo(title),\n        options: MutationOptions(\n          offlineQueue: true,\n          optimisticResponse: (title) => null,\n          onSuccess: (_, __, ___) async =>\n              context.qora.invalidate(const ['todos']),\n        ),\n        builder: (context, state, mutate) {\n          final isOptimistic = state is MutationSuccess && state.isOptimistic;\n          return FloatingActionButton.extended(\n            onPressed: state.isPending ? null : () => mutate('New Todo'),\n            icon: isOptimistic\n                ? const Icon(Icons.schedule)\n                : const Icon(Icons.add),\n            label: Text(\n              isOptimistic ? 'Queued offline' : 'Add Todo',\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n",[386,3536,3537,3546,3554,3558,3574,3591,3595,3600,3616,3625,3647,3665,3681,3698,3703,3737,3765,3770,3774,3783,3804,3821,3843,3864,3876,3895,3914,3921,3928,3935,3941,3966,3989,4000,4009,4023,4048,4074,4081,4098,4128,4143,4178,4189,4209,4230,4242,4260,4268,4275,4282,4289,4296,4301],{"__ignoreMap":440},[444,3538,3539,3541,3544],{"class":446,"line":447},[444,3540,2651],{"class":2051},[444,3542,3543],{"class":608}," 'package:flutter/material.dart'",[444,3545,681],{"class":450},[444,3547,3548,3550,3552],{"class":446,"line":462},[444,3549,2651],{"class":2051},[444,3551,2663],{"class":608},[444,3553,681],{"class":450},[444,3555,3556],{"class":446,"line":469},[444,3557,494],{"emptyLinePlaceholder":493},[444,3559,3560,3563,3566,3569,3572],{"class":446,"line":475},[444,3561,3562],{"class":450},"class",[444,3564,3565],{"class":454}," TodoScreen",[444,3567,3568],{"class":450}," extends",[444,3570,3571],{"class":454}," StatelessWidget",[444,3573,459],{"class":458},[444,3575,3576,3579,3581,3584,3586,3589],{"class":446,"line":481},[444,3577,3578],{"class":565},"  const",[444,3580,3565],{"class":454},[444,3582,3583],{"class":458},"({super",[444,3585,422],{"class":450},[444,3587,3588],{"class":458},"key})",[444,3590,681],{"class":450},[444,3592,3593],{"class":446,"line":490},[444,3594,494],{"emptyLinePlaceholder":493},[444,3596,3597],{"class":446,"line":497},[444,3598,3599],{"class":565},"  @override\n",[444,3601,3602,3605,3608,3610,3613],{"class":446,"line":503},[444,3603,3604],{"class":454},"  Widget",[444,3606,3607],{"class":584}," build",[444,3609,1132],{"class":458},[444,3611,3612],{"class":454},"BuildContext",[444,3614,3615],{"class":458}," context) {\n",[444,3617,3618,3620,3623],{"class":446,"line":509},[444,3619,1326],{"class":575},[444,3621,3622],{"class":454}," Scaffold",[444,3624,707],{"class":458},[444,3626,3627,3630,3632,3635,3637,3640,3642,3644],{"class":446,"line":517},[444,3628,3629],{"class":458},"      body",[444,3631,602],{"class":450},[444,3633,3634],{"class":454}," QoraBuilder",[444,3636,588],{"class":458},[444,3638,3639],{"class":454},"List",[444,3641,588],{"class":458},[444,3643,1569],{"class":454},[444,3645,3646],{"class":458},">>(\n",[444,3648,3649,3652,3654,3656,3658,3660,3663],{"class":446,"line":522},[444,3650,3651],{"class":458},"        queryKey",[444,3653,602],{"class":450},[444,3655,653],{"class":565},[444,3657,605],{"class":458},[444,3659,1888],{"class":608},[444,3661,3662],{"class":458},"]",[444,3664,487],{"class":450},[444,3666,3667,3670,3672,3674,3676,3679],{"class":446,"line":528},[444,3668,3669],{"class":458},"        fetcher",[444,3671,602],{"class":450},[444,3673,633],{"class":458},[444,3675,422],{"class":450},[444,3677,3678],{"class":458},"getTodos",[444,3680,487],{"class":450},[444,3682,3683,3686,3688,3690,3692,3694,3696],{"class":446,"line":534},[444,3684,3685],{"class":458},"        builder",[444,3687,602],{"class":450},[444,3689,1278],{"class":458},[444,3691,612],{"class":450},[444,3693,1283],{"class":458},[444,3695,612],{"class":450},[444,3697,1288],{"class":458},[444,3699,3700],{"class":446,"line":542},[444,3701,3702],{"class":465},"          // Paused → offline, waiting to load for the first time\n",[444,3704,3705,3708,3711,3713,3715,3717,3720,3723,3725,3727,3730,3732,3734],{"class":446,"line":1431},[444,3706,3707],{"class":575},"          if",[444,3709,3710],{"class":458}," (fetchStatus ",[444,3712,1309],{"class":450},[444,3714,882],{"class":454},[444,3716,422],{"class":450},[444,3718,3719],{"class":458},"paused ",[444,3721,3722],{"class":450},"&&",[444,3724,1283],{"class":458},[444,3726,422],{"class":450},[444,3728,3729],{"class":458},"dataOrNull ",[444,3731,1309],{"class":450},[444,3733,2134],{"class":450},[444,3735,3736],{"class":458},") {\n",[444,3738,3739,3742,3744,3747,3750,3752,3755,3757,3760,3763],{"class":446,"line":1442},[444,3740,3741],{"class":575},"            return",[444,3743,653],{"class":565},[444,3745,3746],{"class":454}," Center",[444,3748,3749],{"class":458},"(child",[444,3751,602],{"class":450},[444,3753,3754],{"class":454}," Text",[444,3756,1132],{"class":458},[444,3758,3759],{"class":608},"'Offline: connect to load todos'",[444,3761,3762],{"class":458},"))",[444,3764,681],{"class":450},[444,3766,3767],{"class":446,"line":1461},[444,3768,3769],{"class":458},"          }\n",[444,3771,3772],{"class":446,"line":1469},[444,3773,494],{"emptyLinePlaceholder":493},[444,3775,3776,3779,3781],{"class":446,"line":1477},[444,3777,3778],{"class":575},"          return",[444,3780,1329],{"class":575},[444,3782,1332],{"class":458},[444,3784,3785,3788,3790,3792,3794,3796,3798,3800,3802],{"class":446,"line":1502},[444,3786,3787],{"class":454},"            Initial",[444,3789,1365],{"class":458},[444,3791,630],{"class":450},[444,3793,653],{"class":565},[444,3795,1347],{"class":454},[444,3797,422],{"class":450},[444,3799,1352],{"class":584},[444,3801,1355],{"class":458},[444,3803,487],{"class":450},[444,3805,3806,3809,3811,3813,3815,3817,3819],{"class":446,"line":1510},[444,3807,3808],{"class":454},"            Loading",[444,3810,1365],{"class":458},[444,3812,630],{"class":450},[444,3814,653],{"class":565},[444,3816,1393],{"class":454},[444,3818,1355],{"class":458},[444,3820,487],{"class":450},[444,3822,3823,3826,3828,3830,3832,3834,3836,3839,3841],{"class":446,"line":1518},[444,3824,3825],{"class":454},"            Failure",[444,3827,1132],{"class":458},[444,3829,602],{"class":450},[444,3831,566],{"class":565},[444,3833,1489],{"class":458},[444,3835,630],{"class":450},[444,3837,3838],{"class":454}," ErrorScreen",[444,3840,1497],{"class":458},[444,3842,487],{"class":450},[444,3844,3845,3848,3850,3852,3854,3857,3859,3862],{"class":446,"line":2018},[444,3846,3847],{"class":454},"            Success",[444,3849,1132],{"class":458},[444,3851,602],{"class":450},[444,3853,566],{"class":565},[444,3855,3856],{"class":458}," data)  ",[444,3858,630],{"class":450},[444,3860,3861],{"class":454}," TodoList",[444,3863,707],{"class":458},[444,3865,3866,3869,3871,3874],{"class":446,"line":2028},[444,3867,3868],{"class":458},"                todos",[444,3870,602],{"class":450},[444,3872,3873],{"class":458}," data",[444,3875,487],{"class":450},[444,3877,3878,3881,3883,3885,3887,3889,3891,3893],{"class":446,"line":2059},[444,3879,3880],{"class":458},"                isRefreshing",[444,3882,602],{"class":450},[444,3884,1306],{"class":458},[444,3886,1309],{"class":450},[444,3888,882],{"class":454},[444,3890,422],{"class":450},[444,3892,966],{"class":458},[444,3894,487],{"class":450},[444,3896,3897,3900,3902,3904,3906,3908,3910,3912],{"class":446,"line":2077},[444,3898,3899],{"class":458},"                isStale",[444,3901,602],{"class":450},[444,3903,1306],{"class":458},[444,3905,1309],{"class":450},[444,3907,882],{"class":454},[444,3909,422],{"class":450},[444,3911,803],{"class":458},[444,3913,487],{"class":450},[444,3915,3916,3919],{"class":446,"line":2092},[444,3917,3918],{"class":458},"              )",[444,3920,487],{"class":450},[444,3922,3923,3926],{"class":446,"line":2100},[444,3924,3925],{"class":458},"          }",[444,3927,681],{"class":450},[444,3929,3930,3933],{"class":446,"line":2108},[444,3931,3932],{"class":458},"        }",[444,3934,487],{"class":450},[444,3936,3937,3939],{"class":446,"line":2116},[444,3938,2756],{"class":458},[444,3940,487],{"class":450},[444,3942,3943,3946,3948,3951,3953,3955,3957,3960,3962,3964],{"class":446,"line":2150},[444,3944,3945],{"class":458},"      floatingActionButton",[444,3947,602],{"class":450},[444,3949,3950],{"class":454}," QoraMutationBuilder",[444,3952,588],{"class":458},[444,3954,1564],{"class":565},[444,3956,804],{"class":458},[444,3958,3959],{"class":454},"String",[444,3961,804],{"class":458},[444,3963,1564],{"class":565},[444,3965,594],{"class":458},[444,3967,3968,3971,3973,3976,3978,3980,3982,3984,3987],{"class":446,"line":2157},[444,3969,3970],{"class":458},"        mutator",[444,3972,602],{"class":450},[444,3974,3975],{"class":458}," (title) ",[444,3977,630],{"class":450},[444,3979,633],{"class":458},[444,3981,422],{"class":450},[444,3983,1594],{"class":584},[444,3985,3986],{"class":458},"(title)",[444,3988,487],{"class":450},[444,3990,3991,3994,3996,3998],{"class":446,"line":2165},[444,3992,3993],{"class":458},"        options",[444,3995,602],{"class":450},[444,3997,1608],{"class":454},[444,3999,707],{"class":458},[444,4001,4002,4005,4007],{"class":446,"line":2172},[444,4003,4004],{"class":458},"          offlineQueue",[444,4006,602],{"class":450},[444,4008,1625],{"class":450},[444,4010,4011,4014,4016,4018,4020],{"class":446,"line":2179},[444,4012,4013],{"class":458},"          optimisticResponse",[444,4015,602],{"class":450},[444,4017,3975],{"class":458},[444,4019,630],{"class":450},[444,4021,4022],{"class":450}," null,\n",[444,4024,4026,4029,4031,4033,4035,4038,4040,4043,4045],{"class":446,"line":4025},36,[444,4027,4028],{"class":458},"          onSuccess",[444,4030,602],{"class":450},[444,4032,1849],{"class":458},[444,4034,612],{"class":450},[444,4036,4037],{"class":458}," __",[444,4039,612],{"class":450},[444,4041,4042],{"class":458}," ___) ",[444,4044,1861],{"class":575},[444,4046,4047],{"class":450}," =>\n",[444,4049,4051,4054,4056,4058,4060,4062,4064,4066,4068,4070,4072],{"class":446,"line":4050},37,[444,4052,4053],{"class":458},"              context",[444,4055,422],{"class":450},[444,4057,1878],{"class":458},[444,4059,422],{"class":450},[444,4061,1883],{"class":584},[444,4063,1132],{"class":458},[444,4065,1451],{"class":565},[444,4067,605],{"class":458},[444,4069,1888],{"class":608},[444,4071,1891],{"class":458},[444,4073,487],{"class":450},[444,4075,4077,4079],{"class":446,"line":4076},38,[444,4078,1472],{"class":458},[444,4080,487],{"class":450},[444,4082,4084,4086,4088,4090,4092,4094,4096],{"class":446,"line":4083},39,[444,4085,3685],{"class":458},[444,4087,602],{"class":450},[444,4089,1278],{"class":458},[444,4091,612],{"class":450},[444,4093,1283],{"class":458},[444,4095,612],{"class":450},[444,4097,1673],{"class":458},[444,4099,4101,4104,4106,4108,4111,4114,4117,4120,4122,4124,4126],{"class":446,"line":4100},40,[444,4102,4103],{"class":565},"          final",[444,4105,1933],{"class":458},[444,4107,572],{"class":450},[444,4109,4110],{"class":458}," state ",[444,4112,4113],{"class":450},"is",[444,4115,4116],{"class":454}," MutationSuccess",[444,4118,4119],{"class":450}," &&",[444,4121,1283],{"class":458},[444,4123,422],{"class":450},[444,4125,1754],{"class":458},[444,4127,681],{"class":450},[444,4129,4131,4133,4136,4138,4141],{"class":446,"line":4130},41,[444,4132,3778],{"class":575},[444,4134,4135],{"class":454}," FloatingActionButton",[444,4137,422],{"class":450},[444,4139,4140],{"class":584},"extended",[444,4142,707],{"class":458},[444,4144,4146,4149,4151,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4174,4176],{"class":446,"line":4145},42,[444,4147,4148],{"class":458},"            onPressed",[444,4150,602],{"class":450},[444,4152,1283],{"class":458},[444,4154,422],{"class":450},[444,4156,2128],{"class":458},[444,4158,2131],{"class":450},[444,4160,2134],{"class":450},[444,4162,2137],{"class":450},[444,4164,627],{"class":458},[444,4166,630],{"class":450},[444,4168,1696],{"class":584},[444,4170,1132],{"class":458},[444,4172,4173],{"class":608},"'New Todo'",[444,4175,678],{"class":458},[444,4177,487],{"class":450},[444,4179,4181,4184,4186],{"class":446,"line":4180},43,[444,4182,4183],{"class":458},"            icon",[444,4185,602],{"class":450},[444,4187,4188],{"class":458}," isOptimistic\n",[444,4190,4192,4195,4197,4200,4202,4204,4206],{"class":446,"line":4191},44,[444,4193,4194],{"class":450},"                ?",[444,4196,653],{"class":565},[444,4198,4199],{"class":454}," Icon",[444,4201,1132],{"class":458},[444,4203,2036],{"class":454},[444,4205,422],{"class":450},[444,4207,4208],{"class":458},"schedule)\n",[444,4210,4212,4215,4217,4219,4221,4223,4225,4228],{"class":446,"line":4211},45,[444,4213,4214],{"class":450},"                :",[444,4216,653],{"class":565},[444,4218,4199],{"class":454},[444,4220,1132],{"class":458},[444,4222,2036],{"class":454},[444,4224,422],{"class":450},[444,4226,4227],{"class":458},"add)",[444,4229,487],{"class":450},[444,4231,4233,4236,4238,4240],{"class":446,"line":4232},46,[444,4234,4235],{"class":458},"            label",[444,4237,602],{"class":450},[444,4239,3754],{"class":454},[444,4241,707],{"class":458},[444,4243,4245,4248,4250,4253,4255,4258],{"class":446,"line":4244},47,[444,4246,4247],{"class":458},"              isOptimistic ",[444,4249,2131],{"class":450},[444,4251,4252],{"class":608}," 'Queued offline'",[444,4254,2137],{"class":450},[444,4256,4257],{"class":608}," 'Add Todo'",[444,4259,487],{"class":450},[444,4261,4263,4266],{"class":446,"line":4262},48,[444,4264,4265],{"class":458},"            )",[444,4267,487],{"class":450},[444,4269,4271,4273],{"class":446,"line":4270},49,[444,4272,2103],{"class":458},[444,4274,681],{"class":450},[444,4276,4278,4280],{"class":446,"line":4277},50,[444,4279,3932],{"class":458},[444,4281,487],{"class":450},[444,4283,4285,4287],{"class":446,"line":4284},51,[444,4286,2756],{"class":458},[444,4288,487],{"class":450},[444,4290,4292,4294],{"class":446,"line":4291},52,[444,4293,753],{"class":458},[444,4295,681],{"class":450},[444,4297,4299],{"class":446,"line":4298},53,[444,4300,1194],{"class":458},[444,4302,4304],{"class":446,"line":4303},54,[444,4305,545],{"class":458},[352,4307],{},[355,4309,4311],{"id":4310},"next-steps","Next Steps",[4313,4314,4315,4324,4333,4341,4350],"ul",{},[4316,4317,4318,4323],"li",{},[4319,4320,4322],"a",{"href":4321},"../flutter-integration/network-status","NetworkStatusBuilder / Indicator",": Widgets for connectivity UI",[4316,4325,4326,4329,4330,4332],{},[4319,4327,108],{"href":4328},"../flutter-integration/qora-builder",": Full ",[386,4331,398],{}," builder API",[4316,4334,4335,4338,4339],{},[4319,4336,113],{"href":4337},"../flutter-integration/qora-mutation-builder",": Offline queue and ",[386,4340,1754],{},[4316,4342,4343,4346,4347,4349],{},[4319,4344,215],{"href":4345},"../api-reference/qora-options",": ",[386,4348,553],{}," field reference",[4316,4351,4352,4346,4355,4349],{},[4319,4353,220],{"href":4354},"../api-reference/qora-client-config",[386,4356,4357],{},"reconnectStrategy",[4359,4360,4361],"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 .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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":440,"searchDepth":462,"depth":462,"links":4363},[4364,4365,4372,4378,4386,4389,4397,4398],{"id":357,"depth":462,"text":243},{"id":427,"depth":462,"text":388,"children":4366},[4367,4369,4371],{"id":549,"depth":469,"text":4368},"Setting networkMode per query",{"id":684,"depth":469,"text":4370},"Setting networkMode globally",{"id":771,"depth":469,"text":772},{"id":853,"depth":462,"text":854,"children":4373},[4374,4376],{"id":1065,"depth":469,"text":4375},"Observing FetchStatus in Dart",{"id":1204,"depth":469,"text":4377},"Observing FetchStatus in Flutter",{"id":1526,"depth":462,"text":1527,"children":4379},[4380,4381,4382,4384,4385],{"id":1536,"depth":469,"text":1537},{"id":1720,"depth":469,"text":1721},{"id":1751,"depth":469,"text":4383},"isOptimistic: styling unconfirmed mutations",{"id":2184,"depth":469,"text":2185},{"id":2397,"depth":469,"text":2398},{"id":2426,"depth":462,"text":2427,"children":4387},[4388],{"id":2536,"depth":469,"text":2537},{"id":2600,"depth":462,"text":2601,"children":4390},[4391,4393,4395],{"id":2604,"depth":469,"text":4392},"1. Install connectivity_plus",{"id":2637,"depth":469,"text":4394},"2. Wire up QoraScope",{"id":2933,"depth":469,"text":4396},"3. Add NetworkStatusIndicator",{"id":3530,"depth":462,"text":3531},{"id":4310,"depth":462,"text":4311},"Handle offline mode, paused queries, offline mutation queuing, and reconnect replay with Qora's network-aware layer.","md",null,{},{"icon":161},{"title":4405,"description":4406},"Network Aware - Qora","Full offline support for Dart and Flutter apps using Qora. NetworkMode, FetchStatus, OfflineMutationQueue, and optimistic success for unconfirmed mutations.","oukcHCFJ7mJaVa3cPFFmvx4hhs52GL1cC-pcgAsIWYg",[4409,4411],{"title":153,"path":154,"stem":155,"description":4410,"icon":156,"children":-1},"Persist query results to disk and restore them on startup: giving your app an instant data layer that works fully offline.",{"title":163,"path":164,"stem":165,"description":4412,"icon":121,"children":-1},"Implement forward and bi-directional pagination with InfiniteQueryObserver: load more on scroll, pull-to-refresh, windowed paging, and cursor-based APIs.",1794040399152]