[{"data":1,"prerenderedAt":3376},["ShallowReactive",2],{"navigation_docs_en":3,"-en-flutter-integration-qora-mutation-builder":342,"-en-flutter-integration-qora-mutation-builder-surround":3371},[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":113,"body":344,"description":3361,"extension":3362,"links":3363,"meta":3364,"navigation":3365,"path":114,"seo":3366,"stem":115,"__hash__":3370},"docs_en/en/03.flutter-integration/4.qora-mutation-builder.md",{"type":345,"value":346,"toc":3342},"minimark",[347,371,380,383,388,612,623,625,629,635,929,931,935,1042,1044,1051,1124,1167,1169,1173,1179,1511,1535,1537,1541,1552,1733,1741,1754,2184,2192,2296,2317,2319,2322,2332,2718,2730,2732,2736,2747,2753,3001,3021,3023,3029,3035,3138,3152,3154,3158,3173,3245,3247,3251,3257,3294,3299,3301,3305,3338],[348,349,350,354,355,358,359,362,363,366,367,370],"p",{},[351,352,353],"code",{},"QoraMutationBuilder\u003CTData, TVariables, TContext>"," creates a ",[351,356,357],{},"MutationController"," on mount, disposes it on unmount, and rebuilds whenever the mutation state changes. The ",[351,360,361],{},"builder"," callback receives the current ",[351,364,365],{},"MutationState"," and a ",[351,368,369],{},"mutate(variables)"," callback to trigger the write from the UI.",[372,373,374,376,377,379],"tip",{},[351,375,113],{}," does not require a ",[351,378,103],{}," ancestor. It wires itself to the client automatically when one is present, and falls back to standalone mode gracefully when one is not.",[381,382],"hr",{},[384,385,387],"h2",{"id":386},"basic-usage","Basic Usage",[389,390,396],"pre",{"className":391,"code":392,"filename":393,"language":394,"meta":395,"style":395},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraMutationBuilder\u003CPost, String, void>(\n  mutator: (title) => api.createPost(title),\n  builder: (context, state, mutate) {\n    return ElevatedButton(\n      onPressed: state.isPending ? null : () => mutate('New Post'),\n      child: state.isPending\n          ? const CircularProgressIndicator()\n          : const Text('Create'),\n    );\n  },\n)\n","create_post_screen.dart","dart","",[351,397,398,428,460,482,495,539,554,569,589,598,606],{"__ignoreMap":395},[399,400,403,406,410,413,416,419,421,425],"span",{"class":401,"line":402},"line",1,[399,404,113],{"class":405},"sBMFI",[399,407,409],{"class":408},"sTEyZ","\u003C",[399,411,412],{"class":405},"Post",[399,414,415],{"class":408},", ",[399,417,418],{"class":405},"String",[399,420,415],{"class":408},[399,422,424],{"class":423},"spNyl","void",[399,426,427],{"class":408},">(\n",[399,429,431,434,438,441,444,447,450,454,457],{"class":401,"line":430},2,[399,432,433],{"class":408},"  mutator",[399,435,437],{"class":436},"sMK4o",":",[399,439,440],{"class":408}," (title) ",[399,442,443],{"class":436},"=>",[399,445,446],{"class":408}," api",[399,448,449],{"class":436},".",[399,451,453],{"class":452},"s2Zo4","createPost",[399,455,456],{"class":408},"(title)",[399,458,459],{"class":436},",\n",[399,461,463,466,468,471,474,477,479],{"class":401,"line":462},3,[399,464,465],{"class":408},"  builder",[399,467,437],{"class":436},[399,469,470],{"class":408}," (context",[399,472,473],{"class":436},",",[399,475,476],{"class":408}," state",[399,478,473],{"class":436},[399,480,481],{"class":408}," mutate) {\n",[399,483,485,489,492],{"class":401,"line":484},4,[399,486,488],{"class":487},"s7zQu","    return",[399,490,491],{"class":405}," ElevatedButton",[399,493,494],{"class":408},"(\n",[399,496,498,501,503,505,507,510,513,516,519,522,524,527,530,534,537],{"class":401,"line":497},5,[399,499,500],{"class":408},"      onPressed",[399,502,437],{"class":436},[399,504,476],{"class":408},[399,506,449],{"class":436},[399,508,509],{"class":408},"isPending ",[399,511,512],{"class":436},"?",[399,514,515],{"class":436}," null",[399,517,518],{"class":436}," :",[399,520,521],{"class":408}," () ",[399,523,443],{"class":436},[399,525,526],{"class":452}," mutate",[399,528,529],{"class":408},"(",[399,531,533],{"class":532},"sfazB","'New Post'",[399,535,536],{"class":408},")",[399,538,459],{"class":436},[399,540,542,545,547,549,551],{"class":401,"line":541},6,[399,543,544],{"class":408},"      child",[399,546,437],{"class":436},[399,548,476],{"class":408},[399,550,449],{"class":436},[399,552,553],{"class":408},"isPending\n",[399,555,557,560,563,566],{"class":401,"line":556},7,[399,558,559],{"class":436},"          ?",[399,561,562],{"class":423}," const",[399,564,565],{"class":405}," CircularProgressIndicator",[399,567,568],{"class":408},"()\n",[399,570,572,575,577,580,582,585,587],{"class":401,"line":571},8,[399,573,574],{"class":436},"          :",[399,576,562],{"class":423},[399,578,579],{"class":405}," Text",[399,581,529],{"class":408},[399,583,584],{"class":532},"'Create'",[399,586,536],{"class":408},[399,588,459],{"class":436},[399,590,592,595],{"class":401,"line":591},9,[399,593,594],{"class":408},"    )",[399,596,597],{"class":436},";\n",[399,599,601,604],{"class":401,"line":600},10,[399,602,603],{"class":408},"  }",[399,605,459],{"class":436},[399,607,609],{"class":401,"line":608},11,[399,610,611],{"class":408},")\n",[348,613,614,615,618,619,622],{},"The button is disabled while the mutation is running. Pass ",[351,616,617],{},"null"," to ",[351,620,621],{},"onPressed",": Flutter disables the button automatically.",[381,624],{},[384,626,628],{"id":627},"state-driven-ui","State-Driven UI",[348,630,631,632,634],{},"Pattern-match directly on the sealed ",[351,633,365],{}," for exhaustive UI coverage:",[389,636,638],{"className":391,"code":637,"filename":393,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003CPost, String, void>(\n  mutator: (title) => api.createPost(title),\n  builder: (context, state, mutate) {\n    return switch (state) {\n      MutationIdle() => SubmitButton(onTap: () => mutate('Post')),\n      MutationPending() => const CircularProgressIndicator(),\n      MutationSuccess(:final data) => SuccessBanner('Created: ${data.title}'),\n      MutationFailure(:final error) => Column(children: [\n          ErrorBanner(error),\n          TextButton(\n            onPressed: () => mutate('Post'), // Retry\n            child: const Text('Try again'),\n          ),\n        ]),\n    };\n  },\n)\n",[351,639,640,658,678,694,704,738,756,803,830,840,847,872,893,901,909,917,924],{"__ignoreMap":395},[399,641,642,644,646,648,650,652,654,656],{"class":401,"line":402},[399,643,113],{"class":405},[399,645,409],{"class":408},[399,647,412],{"class":405},[399,649,415],{"class":408},[399,651,418],{"class":405},[399,653,415],{"class":408},[399,655,424],{"class":423},[399,657,427],{"class":408},[399,659,660,662,664,666,668,670,672,674,676],{"class":401,"line":430},[399,661,433],{"class":408},[399,663,437],{"class":436},[399,665,440],{"class":408},[399,667,443],{"class":436},[399,669,446],{"class":408},[399,671,449],{"class":436},[399,673,453],{"class":452},[399,675,456],{"class":408},[399,677,459],{"class":436},[399,679,680,682,684,686,688,690,692],{"class":401,"line":462},[399,681,465],{"class":408},[399,683,437],{"class":436},[399,685,470],{"class":408},[399,687,473],{"class":436},[399,689,476],{"class":408},[399,691,473],{"class":436},[399,693,481],{"class":408},[399,695,696,698,701],{"class":401,"line":484},[399,697,488],{"class":487},[399,699,700],{"class":487}," switch",[399,702,703],{"class":408}," (state) {\n",[399,705,706,709,712,714,717,720,722,724,726,728,730,733,736],{"class":401,"line":497},[399,707,708],{"class":405},"      MutationIdle",[399,710,711],{"class":408},"() ",[399,713,443],{"class":436},[399,715,716],{"class":405}," SubmitButton",[399,718,719],{"class":408},"(onTap",[399,721,437],{"class":436},[399,723,521],{"class":408},[399,725,443],{"class":436},[399,727,526],{"class":452},[399,729,529],{"class":408},[399,731,732],{"class":532},"'Post'",[399,734,735],{"class":408},"))",[399,737,459],{"class":436},[399,739,740,743,745,747,749,751,754],{"class":401,"line":541},[399,741,742],{"class":405},"      MutationPending",[399,744,711],{"class":408},[399,746,443],{"class":436},[399,748,562],{"class":423},[399,750,565],{"class":405},[399,752,753],{"class":408},"()",[399,755,459],{"class":436},[399,757,758,761,763,765,768,771,773,776,778,781,784,788,790,793,796,799,801],{"class":401,"line":556},[399,759,760],{"class":405},"      MutationSuccess",[399,762,529],{"class":408},[399,764,437],{"class":436},[399,766,767],{"class":423},"final",[399,769,770],{"class":408}," data) ",[399,772,443],{"class":436},[399,774,775],{"class":405}," SuccessBanner",[399,777,529],{"class":408},[399,779,780],{"class":532},"'Created: ",[399,782,783],{"class":408},"${",[399,785,787],{"class":786},"sHdIc","data",[399,789,449],{"class":408},[399,791,792],{"class":786},"title",[399,794,795],{"class":408},"}",[399,797,798],{"class":532},"'",[399,800,536],{"class":408},[399,802,459],{"class":436},[399,804,805,808,810,812,814,817,819,822,825,827],{"class":401,"line":571},[399,806,807],{"class":405},"      MutationFailure",[399,809,529],{"class":408},[399,811,437],{"class":436},[399,813,767],{"class":423},[399,815,816],{"class":408}," error) ",[399,818,443],{"class":436},[399,820,821],{"class":405}," Column",[399,823,824],{"class":408},"(children",[399,826,437],{"class":436},[399,828,829],{"class":408}," [\n",[399,831,832,835,838],{"class":401,"line":591},[399,833,834],{"class":405},"          ErrorBanner",[399,836,837],{"class":408},"(error)",[399,839,459],{"class":436},[399,841,842,845],{"class":401,"line":600},[399,843,844],{"class":405},"          TextButton",[399,846,494],{"class":408},[399,848,849,852,854,856,858,860,862,864,866,868],{"class":401,"line":608},[399,850,851],{"class":408},"            onPressed",[399,853,437],{"class":436},[399,855,521],{"class":408},[399,857,443],{"class":436},[399,859,526],{"class":452},[399,861,529],{"class":408},[399,863,732],{"class":532},[399,865,536],{"class":408},[399,867,473],{"class":436},[399,869,871],{"class":870},"sHwdD"," // Retry\n",[399,873,875,878,880,882,884,886,889,891],{"class":401,"line":874},12,[399,876,877],{"class":408},"            child",[399,879,437],{"class":436},[399,881,562],{"class":423},[399,883,579],{"class":405},[399,885,529],{"class":408},[399,887,888],{"class":532},"'Try again'",[399,890,536],{"class":408},[399,892,459],{"class":436},[399,894,896,899],{"class":401,"line":895},13,[399,897,898],{"class":408},"          )",[399,900,459],{"class":436},[399,902,904,907],{"class":401,"line":903},14,[399,905,906],{"class":408},"        ])",[399,908,459],{"class":436},[399,910,912,915],{"class":401,"line":911},15,[399,913,914],{"class":408},"    }",[399,916,597],{"class":436},[399,918,920,922],{"class":401,"line":919},16,[399,921,603],{"class":408},[399,923,459],{"class":436},[399,925,927],{"class":401,"line":926},17,[399,928,611],{"class":408},[381,930],{},[384,932,934],{"id":933},"props","Props",[936,937,938,957],"table",{},[939,940,941],"thead",{},[942,943,944,948,951,954],"tr",{},[945,946,947],"th",{},"Prop",[945,949,950],{},"Type",[945,952,953],{},"Default",[945,955,956],{},"Description",[958,959,960,985,1001,1020],"tbody",{},[942,961,962,968,973,976],{},[963,964,965],"td",{},[351,966,967],{},"mutator",[963,969,970],{},[351,971,972],{},"Future\u003CTData> Function(TVariables)",[963,974,975],{},"required",[963,977,978,979,981,982,449],{},"Async write function. Named ",[351,980,967],{}," to mirror ",[351,983,984],{},"fetcher",[942,986,987,991,996,998],{},[963,988,989],{},[351,990,361],{},[963,992,993],{},[351,994,995],{},"Widget Function(context, MutationState, mutate)",[963,997,975],{},[963,999,1000],{},"Builds the widget tree from the current state.",[942,1002,1003,1008,1013,1017],{},[963,1004,1005],{},[351,1006,1007],{},"options",[963,1009,1010],{},[351,1011,1012],{},"MutationOptions\u003CTData, TVariables, TContext>?",[963,1014,1015],{},[351,1016,617],{},[963,1018,1019],{},"Hooks, retry, offline queue, and optimistic response config.",[942,1021,1022,1027,1032,1036],{},[963,1023,1024],{},[351,1025,1026],{},"metadata",[963,1028,1029],{},[351,1030,1031],{},"Map\u003CString, Object?>?",[963,1033,1034],{},[351,1035,617],{},[963,1037,1038,1039,449],{},"Key-value pairs forwarded to every ",[351,1040,1041],{},"MutationEvent",[381,1043],{},[384,1045,1047,1048,1050],{"id":1046},"the-builder-callback","The ",[351,1049,361],{}," Callback",[389,1052,1054],{"className":391,"code":1053,"language":394,"meta":395,"style":395},"Widget Function(\n  BuildContext context,\n  MutationState\u003CTData, TVariables> state,\n  Future\u003CTData?> Function(TVariables variables) mutate,\n)\n",[351,1055,1056,1066,1076,1096,1120],{"__ignoreMap":395},[399,1057,1058,1061,1064],{"class":401,"line":402},[399,1059,1060],{"class":405},"Widget",[399,1062,1063],{"class":405}," Function",[399,1065,494],{"class":408},[399,1067,1068,1071,1074],{"class":401,"line":430},[399,1069,1070],{"class":405},"  BuildContext",[399,1072,1073],{"class":408}," context",[399,1075,459],{"class":436},[399,1077,1078,1081,1083,1086,1088,1091,1094],{"class":401,"line":462},[399,1079,1080],{"class":405},"  MutationState",[399,1082,409],{"class":408},[399,1084,1085],{"class":405},"TData",[399,1087,415],{"class":408},[399,1089,1090],{"class":405},"TVariables",[399,1092,1093],{"class":408},"> state",[399,1095,459],{"class":436},[399,1097,1098,1101,1103,1105,1108,1111,1113,1115,1118],{"class":401,"line":484},[399,1099,1100],{"class":405},"  Future",[399,1102,409],{"class":408},[399,1104,1085],{"class":405},[399,1106,1107],{"class":408},"?> ",[399,1109,1110],{"class":405},"Function",[399,1112,529],{"class":408},[399,1114,1090],{"class":405},[399,1116,1117],{"class":408}," variables) mutate",[399,1119,459],{"class":436},[399,1121,1122],{"class":401,"line":497},[399,1123,611],{"class":408},[1125,1126,1127,1150],"ul",{},[1128,1129,1130,1136,1137,1139,1140,415,1143,415,1146,1149],"li",{},[1131,1132,1133],"strong",{},[351,1134,1135],{},"state",": the current sealed ",[351,1138,365],{},". Pattern-match or use ",[351,1141,1142],{},".isPending",[351,1144,1145],{},".isSuccess",[351,1147,1148],{},".isError"," helpers.",[1128,1151,1152,1156,1157,1159,1160,1162,1163,1166],{},[1131,1153,1154],{},[351,1155,369],{},": triggers the mutation. Returns ",[351,1158,1085],{}," on success or ",[351,1161,617],{}," on failure. Errors never propagate to the caller; they appear as ",[351,1164,1165],{},"MutationFailure"," state instead.",[381,1168],{},[384,1170,1172],{"id":1171},"lifecycle-hooks","Lifecycle Hooks",[348,1174,1175,1176,1178],{},"Use ",[351,1177,1007],{}," to perform side-effects around the mutation:",[389,1180,1183],{"className":391,"code":1181,"filename":1182,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003Cvoid, UserUpdate, void>(\n  mutator: (update) => api.updateUser(update),\n  options: MutationOptions(\n    invalidates: [['users', currentUserId]], // Auto-refresh on success\n    onSuccess: (_, update, __) async {\n      ScaffoldMessenger.of(context).showSnackBar(\n        const SnackBar(content: Text('Settings saved')),\n      );\n    },\n    onError: (error, _, __) async {\n      ScaffoldMessenger.of(context).showSnackBar(\n        SnackBar(content: Text('Error: $error')),\n      );\n    },\n  ),\n  builder: (context, state, mutate) {\n    return SaveButton(\n      isLoading: state.isPending,\n      onTap: () => mutate(formData),\n    );\n  },\n)\n","settings_screen.dart",[351,1184,1185,1204,1227,1239,1262,1288,1308,1332,1339,1345,1368,1384,1412,1418,1424,1431,1447,1456,1473,1492,1499,1506],{"__ignoreMap":395},[399,1186,1187,1189,1191,1193,1195,1198,1200,1202],{"class":401,"line":402},[399,1188,113],{"class":405},[399,1190,409],{"class":408},[399,1192,424],{"class":423},[399,1194,415],{"class":408},[399,1196,1197],{"class":405},"UserUpdate",[399,1199,415],{"class":408},[399,1201,424],{"class":423},[399,1203,427],{"class":408},[399,1205,1206,1208,1210,1213,1215,1217,1219,1222,1225],{"class":401,"line":430},[399,1207,433],{"class":408},[399,1209,437],{"class":436},[399,1211,1212],{"class":408}," (update) ",[399,1214,443],{"class":436},[399,1216,446],{"class":408},[399,1218,449],{"class":436},[399,1220,1221],{"class":452},"updateUser",[399,1223,1224],{"class":408},"(update)",[399,1226,459],{"class":436},[399,1228,1229,1232,1234,1237],{"class":401,"line":462},[399,1230,1231],{"class":408},"  options",[399,1233,437],{"class":436},[399,1235,1236],{"class":405}," MutationOptions",[399,1238,494],{"class":408},[399,1240,1241,1244,1246,1249,1252,1254,1257,1259],{"class":401,"line":484},[399,1242,1243],{"class":408},"    invalidates",[399,1245,437],{"class":436},[399,1247,1248],{"class":408}," [[",[399,1250,1251],{"class":532},"'users'",[399,1253,473],{"class":436},[399,1255,1256],{"class":408}," currentUserId]]",[399,1258,473],{"class":436},[399,1260,1261],{"class":870}," // Auto-refresh on success\n",[399,1263,1264,1267,1269,1272,1274,1277,1279,1282,1285],{"class":401,"line":497},[399,1265,1266],{"class":408},"    onSuccess",[399,1268,437],{"class":436},[399,1270,1271],{"class":408}," (_",[399,1273,473],{"class":436},[399,1275,1276],{"class":408}," update",[399,1278,473],{"class":436},[399,1280,1281],{"class":408}," __) ",[399,1283,1284],{"class":487},"async",[399,1286,1287],{"class":408}," {\n",[399,1289,1290,1293,1295,1298,1301,1303,1306],{"class":401,"line":541},[399,1291,1292],{"class":405},"      ScaffoldMessenger",[399,1294,449],{"class":436},[399,1296,1297],{"class":452},"of",[399,1299,1300],{"class":408},"(context)",[399,1302,449],{"class":436},[399,1304,1305],{"class":452},"showSnackBar",[399,1307,494],{"class":408},[399,1309,1310,1313,1316,1319,1321,1323,1325,1328,1330],{"class":401,"line":556},[399,1311,1312],{"class":423},"        const",[399,1314,1315],{"class":405}," SnackBar",[399,1317,1318],{"class":408},"(content",[399,1320,437],{"class":436},[399,1322,579],{"class":405},[399,1324,529],{"class":408},[399,1326,1327],{"class":532},"'Settings saved'",[399,1329,735],{"class":408},[399,1331,459],{"class":436},[399,1333,1334,1337],{"class":401,"line":571},[399,1335,1336],{"class":408},"      )",[399,1338,597],{"class":436},[399,1340,1341,1343],{"class":401,"line":591},[399,1342,914],{"class":408},[399,1344,459],{"class":436},[399,1346,1347,1350,1352,1355,1357,1360,1362,1364,1366],{"class":401,"line":600},[399,1348,1349],{"class":408},"    onError",[399,1351,437],{"class":436},[399,1353,1354],{"class":408}," (error",[399,1356,473],{"class":436},[399,1358,1359],{"class":408}," _",[399,1361,473],{"class":436},[399,1363,1281],{"class":408},[399,1365,1284],{"class":487},[399,1367,1287],{"class":408},[399,1369,1370,1372,1374,1376,1378,1380,1382],{"class":401,"line":608},[399,1371,1292],{"class":405},[399,1373,449],{"class":436},[399,1375,1297],{"class":452},[399,1377,1300],{"class":408},[399,1379,449],{"class":436},[399,1381,1305],{"class":452},[399,1383,494],{"class":408},[399,1385,1386,1389,1391,1393,1395,1397,1400,1403,1406,1408,1410],{"class":401,"line":874},[399,1387,1388],{"class":405},"        SnackBar",[399,1390,1318],{"class":408},[399,1392,437],{"class":436},[399,1394,579],{"class":405},[399,1396,529],{"class":408},[399,1398,1399],{"class":532},"'Error: ",[399,1401,1402],{"class":408},"$",[399,1404,1405],{"class":786},"error",[399,1407,798],{"class":532},[399,1409,735],{"class":408},[399,1411,459],{"class":436},[399,1413,1414,1416],{"class":401,"line":895},[399,1415,1336],{"class":408},[399,1417,597],{"class":436},[399,1419,1420,1422],{"class":401,"line":903},[399,1421,914],{"class":408},[399,1423,459],{"class":436},[399,1425,1426,1429],{"class":401,"line":911},[399,1427,1428],{"class":408},"  )",[399,1430,459],{"class":436},[399,1432,1433,1435,1437,1439,1441,1443,1445],{"class":401,"line":919},[399,1434,465],{"class":408},[399,1436,437],{"class":436},[399,1438,470],{"class":408},[399,1440,473],{"class":436},[399,1442,476],{"class":408},[399,1444,473],{"class":436},[399,1446,481],{"class":408},[399,1448,1449,1451,1454],{"class":401,"line":926},[399,1450,488],{"class":487},[399,1452,1453],{"class":405}," SaveButton",[399,1455,494],{"class":408},[399,1457,1459,1462,1464,1466,1468,1471],{"class":401,"line":1458},18,[399,1460,1461],{"class":408},"      isLoading",[399,1463,437],{"class":436},[399,1465,476],{"class":408},[399,1467,449],{"class":436},[399,1469,1470],{"class":408},"isPending",[399,1472,459],{"class":436},[399,1474,1476,1479,1481,1483,1485,1487,1490],{"class":401,"line":1475},19,[399,1477,1478],{"class":408},"      onTap",[399,1480,437],{"class":436},[399,1482,521],{"class":408},[399,1484,443],{"class":436},[399,1486,526],{"class":452},[399,1488,1489],{"class":408},"(formData)",[399,1491,459],{"class":436},[399,1493,1495,1497],{"class":401,"line":1494},20,[399,1496,594],{"class":408},[399,1498,597],{"class":436},[399,1500,1502,1504],{"class":401,"line":1501},21,[399,1503,603],{"class":408},[399,1505,459],{"class":436},[399,1507,1509],{"class":401,"line":1508},22,[399,1510,611],{"class":408},[1512,1513,1514,1515,1518,1519,1522,1523,1526,1527,1530,1531,1534],"warning",{},"Capturing ",[351,1516,1517],{},"context"," inside ",[351,1520,1521],{},"onSuccess","/",[351,1524,1525],{},"onError"," is safe as long as the widget is still mounted. Prefer using ",[351,1528,1529],{},"ScaffoldMessenger.of(context)",": it is resilient to widget tree changes. Avoid ",[351,1532,1533],{},"Navigator.of(context)"," in async callbacks without a mounted check.",[381,1536],{},[384,1538,1540],{"id":1539},"offline-mutation-queue","Offline Mutation Queue",[348,1542,1543,1544,1547,1548,1551],{},"When the device is offline, mutations with ",[351,1545,1546],{},"offlineQueue: true"," are enqueued in FIFO order and replayed automatically when connectivity returns. Provide ",[351,1549,1550],{},"optimisticResponse"," to give instant feedback even without a server response:",[389,1553,1556],{"className":391,"code":1554,"filename":1555,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003Cvoid, Todo, void>(\n  mutator: (todo) => api.createTodo(todo),\n  options: MutationOptions(\n    invalidates: [['todos']], // Auto-refresh on success or offline replay\n    // Opt into the offline queue\n    offlineQueue: true,\n\n    // Provide an optimistic TData so the UI updates immediately\n    optimisticResponse: (todo) => null,\n  ),\n  builder: (context, state, mutate) {\n    return AddTodoButton(\n      onTap: () => mutate(newTodo),\n    );\n  },\n)\n","lib/ui/todo_screen.dart",[351,1557,1558,1577,1600,1610,1629,1634,1644,1650,1655,1669,1675,1691,1700,1717,1723,1729],{"__ignoreMap":395},[399,1559,1560,1562,1564,1566,1568,1571,1573,1575],{"class":401,"line":402},[399,1561,113],{"class":405},[399,1563,409],{"class":408},[399,1565,424],{"class":423},[399,1567,415],{"class":408},[399,1569,1570],{"class":405},"Todo",[399,1572,415],{"class":408},[399,1574,424],{"class":423},[399,1576,427],{"class":408},[399,1578,1579,1581,1583,1586,1588,1590,1592,1595,1598],{"class":401,"line":430},[399,1580,433],{"class":408},[399,1582,437],{"class":436},[399,1584,1585],{"class":408}," (todo) ",[399,1587,443],{"class":436},[399,1589,446],{"class":408},[399,1591,449],{"class":436},[399,1593,1594],{"class":452},"createTodo",[399,1596,1597],{"class":408},"(todo)",[399,1599,459],{"class":436},[399,1601,1602,1604,1606,1608],{"class":401,"line":462},[399,1603,1231],{"class":408},[399,1605,437],{"class":436},[399,1607,1236],{"class":405},[399,1609,494],{"class":408},[399,1611,1612,1614,1616,1618,1621,1624,1626],{"class":401,"line":484},[399,1613,1243],{"class":408},[399,1615,437],{"class":436},[399,1617,1248],{"class":408},[399,1619,1620],{"class":532},"'todos'",[399,1622,1623],{"class":408},"]]",[399,1625,473],{"class":436},[399,1627,1628],{"class":870}," // Auto-refresh on success or offline replay\n",[399,1630,1631],{"class":401,"line":497},[399,1632,1633],{"class":870},"    // Opt into the offline queue\n",[399,1635,1636,1639,1641],{"class":401,"line":541},[399,1637,1638],{"class":408},"    offlineQueue",[399,1640,437],{"class":436},[399,1642,1643],{"class":436}," true,\n",[399,1645,1646],{"class":401,"line":556},[399,1647,1649],{"emptyLinePlaceholder":1648},true,"\n",[399,1651,1652],{"class":401,"line":571},[399,1653,1654],{"class":870},"    // Provide an optimistic TData so the UI updates immediately\n",[399,1656,1657,1660,1662,1664,1666],{"class":401,"line":591},[399,1658,1659],{"class":408},"    optimisticResponse",[399,1661,437],{"class":436},[399,1663,1585],{"class":408},[399,1665,443],{"class":436},[399,1667,1668],{"class":436}," null,\n",[399,1670,1671,1673],{"class":401,"line":600},[399,1672,1428],{"class":408},[399,1674,459],{"class":436},[399,1676,1677,1679,1681,1683,1685,1687,1689],{"class":401,"line":608},[399,1678,465],{"class":408},[399,1680,437],{"class":436},[399,1682,470],{"class":408},[399,1684,473],{"class":436},[399,1686,476],{"class":408},[399,1688,473],{"class":436},[399,1690,481],{"class":408},[399,1692,1693,1695,1698],{"class":401,"line":874},[399,1694,488],{"class":487},[399,1696,1697],{"class":405}," AddTodoButton",[399,1699,494],{"class":408},[399,1701,1702,1704,1706,1708,1710,1712,1715],{"class":401,"line":895},[399,1703,1478],{"class":408},[399,1705,437],{"class":436},[399,1707,521],{"class":408},[399,1709,443],{"class":436},[399,1711,526],{"class":452},[399,1713,1714],{"class":408},"(newTodo)",[399,1716,459],{"class":436},[399,1718,1719,1721],{"class":401,"line":903},[399,1720,594],{"class":408},[399,1722,597],{"class":436},[399,1724,1725,1727],{"class":401,"line":911},[399,1726,603],{"class":408},[399,1728,459],{"class":436},[399,1730,1731],{"class":401,"line":919},[399,1732,611],{"class":408},[1734,1735,1737,1740],"h3",{"id":1736},"isoptimistic-styling-unconfirmed-items",[351,1738,1739],{},"isOptimistic",": styling unconfirmed items",[348,1742,1743,1744,1746,1747,1750,1751,1753],{},"When a mutation is queued offline and ",[351,1745,1550],{}," is provided, the state transitions to ",[351,1748,1749],{},"MutationSuccess(isOptimistic: true)",". Use the ",[351,1752,1739],{}," flag to apply a pending visual (greyed out, clock icon, strikethrough) so users know the item is not yet confirmed by the server:",[389,1755,1758],{"className":391,"code":1756,"filename":1757,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003CPost, String, void>(\n  mutator: api.createPost,\n  options: MutationOptions(\n    offlineQueue: true,\n    optimisticResponse: (title) => Post.optimistic(title),\n  ),\n  builder: (context, state, mutate) {\n    // Extract isOptimistic from the success 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            mainAxisSize: MainAxisSize.min,\n            children: [\n              Icon(Icons.schedule, size: 14, color: Colors.grey),\n              SizedBox(width: 4),\n              Text('Queued: syncing when online',\n                  style: TextStyle(color: Colors.grey)),\n            ],\n          ),\n        ElevatedButton(\n          onPressed: state.isPending ? null : () => mutate('New Post'),\n          child: const Text('Create'),\n        ),\n      ],\n    );\n  },\n)\n","lib/ui/create_post_screen.dart",[351,1759,1760,1778,1792,1802,1810,1832,1838,1854,1859,1874,1894,1904,1910,1914,1922,1931,1939,1949,1966,1975,2018,2035,2047,2072,2080,2087,2095,2129,2149,2157,2165,2172,2179],{"__ignoreMap":395},[399,1761,1762,1764,1766,1768,1770,1772,1774,1776],{"class":401,"line":402},[399,1763,113],{"class":405},[399,1765,409],{"class":408},[399,1767,412],{"class":405},[399,1769,415],{"class":408},[399,1771,418],{"class":405},[399,1773,415],{"class":408},[399,1775,424],{"class":423},[399,1777,427],{"class":408},[399,1779,1780,1782,1784,1786,1788,1790],{"class":401,"line":430},[399,1781,433],{"class":408},[399,1783,437],{"class":436},[399,1785,446],{"class":408},[399,1787,449],{"class":436},[399,1789,453],{"class":408},[399,1791,459],{"class":436},[399,1793,1794,1796,1798,1800],{"class":401,"line":462},[399,1795,1231],{"class":408},[399,1797,437],{"class":436},[399,1799,1236],{"class":405},[399,1801,494],{"class":408},[399,1803,1804,1806,1808],{"class":401,"line":484},[399,1805,1638],{"class":408},[399,1807,437],{"class":436},[399,1809,1643],{"class":436},[399,1811,1812,1814,1816,1818,1820,1823,1825,1828,1830],{"class":401,"line":497},[399,1813,1659],{"class":408},[399,1815,437],{"class":436},[399,1817,440],{"class":408},[399,1819,443],{"class":436},[399,1821,1822],{"class":405}," Post",[399,1824,449],{"class":436},[399,1826,1827],{"class":452},"optimistic",[399,1829,456],{"class":408},[399,1831,459],{"class":436},[399,1833,1834,1836],{"class":401,"line":541},[399,1835,1428],{"class":408},[399,1837,459],{"class":436},[399,1839,1840,1842,1844,1846,1848,1850,1852],{"class":401,"line":556},[399,1841,465],{"class":408},[399,1843,437],{"class":436},[399,1845,470],{"class":408},[399,1847,473],{"class":436},[399,1849,476],{"class":408},[399,1851,473],{"class":436},[399,1853,481],{"class":408},[399,1855,1856],{"class":401,"line":571},[399,1857,1858],{"class":870},"    // Extract isOptimistic from the success state\n",[399,1860,1861,1864,1867,1870,1872],{"class":401,"line":591},[399,1862,1863],{"class":423},"    final",[399,1865,1866],{"class":408}," isOptimistic ",[399,1868,1869],{"class":436},"=",[399,1871,700],{"class":487},[399,1873,703],{"class":408},[399,1875,1876,1878,1880,1882,1884,1887,1889,1892],{"class":401,"line":600},[399,1877,760],{"class":405},[399,1879,529],{"class":408},[399,1881,437],{"class":436},[399,1883,767],{"class":423},[399,1885,1886],{"class":408}," isOptimistic) ",[399,1888,443],{"class":436},[399,1890,1891],{"class":408}," isOptimistic",[399,1893,459],{"class":436},[399,1895,1896,1899,1901],{"class":401,"line":608},[399,1897,1898],{"class":408},"      _ ",[399,1900,443],{"class":436},[399,1902,1903],{"class":436}," false,\n",[399,1905,1906,1908],{"class":401,"line":874},[399,1907,914],{"class":408},[399,1909,597],{"class":436},[399,1911,1912],{"class":401,"line":895},[399,1913,1649],{"emptyLinePlaceholder":1648},[399,1915,1916,1918,1920],{"class":401,"line":903},[399,1917,488],{"class":487},[399,1919,821],{"class":405},[399,1921,494],{"class":408},[399,1923,1924,1927,1929],{"class":401,"line":911},[399,1925,1926],{"class":408},"      children",[399,1928,437],{"class":436},[399,1930,829],{"class":408},[399,1932,1933,1936],{"class":401,"line":919},[399,1934,1935],{"class":487},"        if",[399,1937,1938],{"class":408}," (isOptimistic)\n",[399,1940,1941,1944,1947],{"class":401,"line":926},[399,1942,1943],{"class":423},"          const",[399,1945,1946],{"class":405}," Row",[399,1948,494],{"class":408},[399,1950,1951,1954,1956,1959,1961,1964],{"class":401,"line":1458},[399,1952,1953],{"class":408},"            mainAxisSize",[399,1955,437],{"class":436},[399,1957,1958],{"class":405}," MainAxisSize",[399,1960,449],{"class":436},[399,1962,1963],{"class":408},"min",[399,1965,459],{"class":436},[399,1967,1968,1971,1973],{"class":401,"line":1475},[399,1969,1970],{"class":408},"            children",[399,1972,437],{"class":436},[399,1974,829],{"class":408},[399,1976,1977,1980,1982,1985,1987,1990,1992,1995,1997,2001,2003,2006,2008,2011,2013,2016],{"class":401,"line":1494},[399,1978,1979],{"class":405},"              Icon",[399,1981,529],{"class":408},[399,1983,1984],{"class":405},"Icons",[399,1986,449],{"class":436},[399,1988,1989],{"class":408},"schedule",[399,1991,473],{"class":436},[399,1993,1994],{"class":408}," size",[399,1996,437],{"class":436},[399,1998,2000],{"class":1999},"sbssI"," 14",[399,2002,473],{"class":436},[399,2004,2005],{"class":408}," color",[399,2007,437],{"class":436},[399,2009,2010],{"class":405}," Colors",[399,2012,449],{"class":436},[399,2014,2015],{"class":408},"grey)",[399,2017,459],{"class":436},[399,2019,2020,2023,2026,2028,2031,2033],{"class":401,"line":1501},[399,2021,2022],{"class":405},"              SizedBox",[399,2024,2025],{"class":408},"(width",[399,2027,437],{"class":436},[399,2029,2030],{"class":1999}," 4",[399,2032,536],{"class":408},[399,2034,459],{"class":436},[399,2036,2037,2040,2042,2045],{"class":401,"line":1508},[399,2038,2039],{"class":405},"              Text",[399,2041,529],{"class":408},[399,2043,2044],{"class":532},"'Queued: syncing when online'",[399,2046,459],{"class":436},[399,2048,2050,2053,2055,2058,2061,2063,2065,2067,2070],{"class":401,"line":2049},23,[399,2051,2052],{"class":408},"                  style",[399,2054,437],{"class":436},[399,2056,2057],{"class":405}," TextStyle",[399,2059,2060],{"class":408},"(color",[399,2062,437],{"class":436},[399,2064,2010],{"class":405},[399,2066,449],{"class":436},[399,2068,2069],{"class":408},"grey))",[399,2071,459],{"class":436},[399,2073,2075,2078],{"class":401,"line":2074},24,[399,2076,2077],{"class":408},"            ]",[399,2079,459],{"class":436},[399,2081,2083,2085],{"class":401,"line":2082},25,[399,2084,898],{"class":408},[399,2086,459],{"class":436},[399,2088,2090,2093],{"class":401,"line":2089},26,[399,2091,2092],{"class":405},"        ElevatedButton",[399,2094,494],{"class":408},[399,2096,2098,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127],{"class":401,"line":2097},27,[399,2099,2100],{"class":408},"          onPressed",[399,2102,437],{"class":436},[399,2104,476],{"class":408},[399,2106,449],{"class":436},[399,2108,509],{"class":408},[399,2110,512],{"class":436},[399,2112,515],{"class":436},[399,2114,518],{"class":436},[399,2116,521],{"class":408},[399,2118,443],{"class":436},[399,2120,526],{"class":452},[399,2122,529],{"class":408},[399,2124,533],{"class":532},[399,2126,536],{"class":408},[399,2128,459],{"class":436},[399,2130,2132,2135,2137,2139,2141,2143,2145,2147],{"class":401,"line":2131},28,[399,2133,2134],{"class":408},"          child",[399,2136,437],{"class":436},[399,2138,562],{"class":423},[399,2140,579],{"class":405},[399,2142,529],{"class":408},[399,2144,584],{"class":532},[399,2146,536],{"class":408},[399,2148,459],{"class":436},[399,2150,2152,2155],{"class":401,"line":2151},29,[399,2153,2154],{"class":408},"        )",[399,2156,459],{"class":436},[399,2158,2160,2163],{"class":401,"line":2159},30,[399,2161,2162],{"class":408},"      ]",[399,2164,459],{"class":436},[399,2166,2168,2170],{"class":401,"line":2167},31,[399,2169,594],{"class":408},[399,2171,597],{"class":436},[399,2173,2175,2177],{"class":401,"line":2174},32,[399,2176,603],{"class":408},[399,2178,459],{"class":436},[399,2180,2182],{"class":401,"line":2181},33,[399,2183,611],{"class":408},[348,2185,2186,2188,2189,2191],{},[351,2187,1739],{}," is also available on ",[351,2190,365],{}," directly:",[389,2193,2195],{"className":391,"code":2194,"language":394,"meta":395,"style":395},"// On the sealed class\nstate.isOptimistic  // false for all states except MutationSuccess with isOptimistic: true\n\n// Inside when()\nstate.when(\n  onSuccess: (data, variables, isOptimistic) {\n    if (isOptimistic) showPendingIndicator();\n    else showConfirmedBadge();\n  },\n  ...\n)\n",[351,2196,2197,2202,2214,2218,2223,2234,2254,2269,2281,2287,2292],{"__ignoreMap":395},[399,2198,2199],{"class":401,"line":402},[399,2200,2201],{"class":870},"// On the sealed class\n",[399,2203,2204,2206,2208,2211],{"class":401,"line":430},[399,2205,1135],{"class":408},[399,2207,449],{"class":436},[399,2209,2210],{"class":408},"isOptimistic  ",[399,2212,2213],{"class":870},"// false for all states except MutationSuccess with isOptimistic: true\n",[399,2215,2216],{"class":401,"line":462},[399,2217,1649],{"emptyLinePlaceholder":1648},[399,2219,2220],{"class":401,"line":484},[399,2221,2222],{"class":870},"// Inside when()\n",[399,2224,2225,2227,2229,2232],{"class":401,"line":497},[399,2226,1135],{"class":408},[399,2228,449],{"class":436},[399,2230,2231],{"class":487},"when",[399,2233,494],{"class":408},[399,2235,2236,2239,2241,2244,2246,2249,2251],{"class":401,"line":541},[399,2237,2238],{"class":408},"  onSuccess",[399,2240,437],{"class":436},[399,2242,2243],{"class":408}," (data",[399,2245,473],{"class":436},[399,2247,2248],{"class":408}," variables",[399,2250,473],{"class":436},[399,2252,2253],{"class":408}," isOptimistic) {\n",[399,2255,2256,2259,2262,2265,2267],{"class":401,"line":556},[399,2257,2258],{"class":487},"    if",[399,2260,2261],{"class":408}," (isOptimistic) ",[399,2263,2264],{"class":452},"showPendingIndicator",[399,2266,753],{"class":408},[399,2268,597],{"class":436},[399,2270,2271,2274,2277,2279],{"class":401,"line":571},[399,2272,2273],{"class":487},"    else",[399,2275,2276],{"class":452}," showConfirmedBadge",[399,2278,753],{"class":408},[399,2280,597],{"class":436},[399,2282,2283,2285],{"class":401,"line":591},[399,2284,603],{"class":408},[399,2286,459],{"class":436},[399,2288,2289],{"class":401,"line":600},[399,2290,2291],{"class":436},"  ...\n",[399,2293,2294],{"class":401,"line":608},[399,2295,611],{"class":408},[372,2297,2298,2301,2302,2304,2305,2304,2308,2310,2311,2313,2314,449],{},[351,2299,2300],{},"isOptimistic: true"," is emitted only when ",[351,2303,1546],{}," ",[1131,2306,2307],{},"and",[351,2309,1550],{}," is provided ",[1131,2312,2307],{}," the device is offline. A real server success always produces ",[351,2315,2316],{},"isOptimistic: false",[381,2318],{},[384,2320,148],{"id":2321},"optimistic-updates",[348,2323,2324,2325,2328,2329,2331],{},"Combine ",[351,2326,2327],{},"onMutate"," (optimistic write) and ",[351,2330,1525],{}," (rollback) to give instant feedback while the server confirms the change:",[389,2333,2336],{"className":391,"code":2334,"filename":2335,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003Cvoid, Todo, List\u003CTodo>?>(\n  // TContext = List\u003CTodo>?: the snapshot for rollback\n  mutator: (todo) => api.addTodo(todo),\n  options: MutationOptions(\n    invalidates: [['todos']], // 4️⃣ Pull confirmed data from server\n    onMutate: (todo) async {\n      // 1️⃣ Snapshot current list\n      final prev = context.qora.getQueryData\u003CList\u003CTodo>>(['todos']);\n\n      // 2️⃣ Apply optimistically: UI updates before the network call\n      context.qora.setQueryData\u003CList\u003CTodo>>(\n        ['todos'],\n        [...?prev, todo.copyWith(isOptimistic: true)],\n      );\n\n      return prev; // Returned as TContext\n    },\n    onError: (_, __, prev) async {\n      // 3️⃣ Rollback on failure\n      context.qora.restoreQueryData(['todos'], prev);\n    },\n  ),\n  builder: (context, state, mutate) {\n    return AddTodoButton(\n      isLoading: state.isPending,\n      onTap: () => mutate(newTodo),\n    );\n  },\n)\n","todo_list_screen.dart",[351,2337,2338,2362,2367,2388,2398,2415,2428,2433,2473,2477,2482,2507,2519,2552,2558,2562,2576,2582,2604,2609,2636,2642,2648,2664,2672,2686,2702,2708,2714],{"__ignoreMap":395},[399,2339,2340,2342,2344,2346,2348,2350,2352,2355,2357,2359],{"class":401,"line":402},[399,2341,113],{"class":405},[399,2343,409],{"class":408},[399,2345,424],{"class":423},[399,2347,415],{"class":408},[399,2349,1570],{"class":405},[399,2351,415],{"class":408},[399,2353,2354],{"class":405},"List",[399,2356,409],{"class":408},[399,2358,1570],{"class":405},[399,2360,2361],{"class":408},">?>(\n",[399,2363,2364],{"class":401,"line":430},[399,2365,2366],{"class":870},"  // TContext = List\u003CTodo>?: the snapshot for rollback\n",[399,2368,2369,2371,2373,2375,2377,2379,2381,2384,2386],{"class":401,"line":462},[399,2370,433],{"class":408},[399,2372,437],{"class":436},[399,2374,1585],{"class":408},[399,2376,443],{"class":436},[399,2378,446],{"class":408},[399,2380,449],{"class":436},[399,2382,2383],{"class":452},"addTodo",[399,2385,1597],{"class":408},[399,2387,459],{"class":436},[399,2389,2390,2392,2394,2396],{"class":401,"line":484},[399,2391,1231],{"class":408},[399,2393,437],{"class":436},[399,2395,1236],{"class":405},[399,2397,494],{"class":408},[399,2399,2400,2402,2404,2406,2408,2410,2412],{"class":401,"line":497},[399,2401,1243],{"class":408},[399,2403,437],{"class":436},[399,2405,1248],{"class":408},[399,2407,1620],{"class":532},[399,2409,1623],{"class":408},[399,2411,473],{"class":436},[399,2413,2414],{"class":870}," // 4️⃣ Pull confirmed data from server\n",[399,2416,2417,2420,2422,2424,2426],{"class":401,"line":541},[399,2418,2419],{"class":408},"    onMutate",[399,2421,437],{"class":436},[399,2423,1585],{"class":408},[399,2425,1284],{"class":487},[399,2427,1287],{"class":408},[399,2429,2430],{"class":401,"line":556},[399,2431,2432],{"class":870},"      // 1️⃣ Snapshot current list\n",[399,2434,2435,2438,2441,2443,2445,2447,2450,2452,2455,2457,2459,2461,2463,2466,2468,2471],{"class":401,"line":571},[399,2436,2437],{"class":423},"      final",[399,2439,2440],{"class":408}," prev ",[399,2442,1869],{"class":436},[399,2444,1073],{"class":408},[399,2446,449],{"class":436},[399,2448,2449],{"class":408},"qora",[399,2451,449],{"class":436},[399,2453,2454],{"class":452},"getQueryData",[399,2456,409],{"class":408},[399,2458,2354],{"class":405},[399,2460,409],{"class":408},[399,2462,1570],{"class":405},[399,2464,2465],{"class":408},">>([",[399,2467,1620],{"class":532},[399,2469,2470],{"class":408},"])",[399,2472,597],{"class":436},[399,2474,2475],{"class":401,"line":591},[399,2476,1649],{"emptyLinePlaceholder":1648},[399,2478,2479],{"class":401,"line":600},[399,2480,2481],{"class":870},"      // 2️⃣ Apply optimistically: UI updates before the network call\n",[399,2483,2484,2487,2489,2491,2493,2496,2498,2500,2502,2504],{"class":401,"line":608},[399,2485,2486],{"class":408},"      context",[399,2488,449],{"class":436},[399,2490,2449],{"class":408},[399,2492,449],{"class":436},[399,2494,2495],{"class":452},"setQueryData",[399,2497,409],{"class":408},[399,2499,2354],{"class":405},[399,2501,409],{"class":408},[399,2503,1570],{"class":405},[399,2505,2506],{"class":408},">>(\n",[399,2508,2509,2512,2514,2517],{"class":401,"line":874},[399,2510,2511],{"class":408},"        [",[399,2513,1620],{"class":532},[399,2515,2516],{"class":408},"]",[399,2518,459],{"class":436},[399,2520,2521,2523,2526,2529,2531,2534,2536,2539,2542,2544,2547,2550],{"class":401,"line":895},[399,2522,2511],{"class":408},[399,2524,2525],{"class":436},"...?",[399,2527,2528],{"class":408},"prev",[399,2530,473],{"class":436},[399,2532,2533],{"class":408}," todo",[399,2535,449],{"class":436},[399,2537,2538],{"class":452},"copyWith",[399,2540,2541],{"class":408},"(isOptimistic",[399,2543,437],{"class":436},[399,2545,2546],{"class":436}," true",[399,2548,2549],{"class":408},")]",[399,2551,459],{"class":436},[399,2553,2554,2556],{"class":401,"line":903},[399,2555,1336],{"class":408},[399,2557,597],{"class":436},[399,2559,2560],{"class":401,"line":911},[399,2561,1649],{"emptyLinePlaceholder":1648},[399,2563,2564,2567,2570,2573],{"class":401,"line":919},[399,2565,2566],{"class":487},"      return",[399,2568,2569],{"class":408}," prev",[399,2571,2572],{"class":436},";",[399,2574,2575],{"class":870}," // Returned as TContext\n",[399,2577,2578,2580],{"class":401,"line":926},[399,2579,914],{"class":408},[399,2581,459],{"class":436},[399,2583,2584,2586,2588,2590,2592,2595,2597,2600,2602],{"class":401,"line":1458},[399,2585,1349],{"class":408},[399,2587,437],{"class":436},[399,2589,1271],{"class":408},[399,2591,473],{"class":436},[399,2593,2594],{"class":408}," __",[399,2596,473],{"class":436},[399,2598,2599],{"class":408}," prev) ",[399,2601,1284],{"class":487},[399,2603,1287],{"class":408},[399,2605,2606],{"class":401,"line":1475},[399,2607,2608],{"class":870},"      // 3️⃣ Rollback on failure\n",[399,2610,2611,2613,2615,2617,2619,2622,2625,2627,2629,2631,2634],{"class":401,"line":1494},[399,2612,2486],{"class":408},[399,2614,449],{"class":436},[399,2616,2449],{"class":408},[399,2618,449],{"class":436},[399,2620,2621],{"class":452},"restoreQueryData",[399,2623,2624],{"class":408},"([",[399,2626,1620],{"class":532},[399,2628,2516],{"class":408},[399,2630,473],{"class":436},[399,2632,2633],{"class":408}," prev)",[399,2635,597],{"class":436},[399,2637,2638,2640],{"class":401,"line":1501},[399,2639,914],{"class":408},[399,2641,459],{"class":436},[399,2643,2644,2646],{"class":401,"line":1508},[399,2645,1428],{"class":408},[399,2647,459],{"class":436},[399,2649,2650,2652,2654,2656,2658,2660,2662],{"class":401,"line":2049},[399,2651,465],{"class":408},[399,2653,437],{"class":436},[399,2655,470],{"class":408},[399,2657,473],{"class":436},[399,2659,476],{"class":408},[399,2661,473],{"class":436},[399,2663,481],{"class":408},[399,2665,2666,2668,2670],{"class":401,"line":2074},[399,2667,488],{"class":487},[399,2669,1697],{"class":405},[399,2671,494],{"class":408},[399,2673,2674,2676,2678,2680,2682,2684],{"class":401,"line":2082},[399,2675,1461],{"class":408},[399,2677,437],{"class":436},[399,2679,476],{"class":408},[399,2681,449],{"class":436},[399,2683,1470],{"class":408},[399,2685,459],{"class":436},[399,2687,2688,2690,2692,2694,2696,2698,2700],{"class":401,"line":2089},[399,2689,1478],{"class":408},[399,2691,437],{"class":436},[399,2693,521],{"class":408},[399,2695,443],{"class":436},[399,2697,526],{"class":452},[399,2699,1714],{"class":408},[399,2701,459],{"class":436},[399,2703,2704,2706],{"class":401,"line":2097},[399,2705,594],{"class":408},[399,2707,597],{"class":436},[399,2709,2710,2712],{"class":401,"line":2131},[399,2711,603],{"class":408},[399,2713,459],{"class":436},[399,2715,2716],{"class":401,"line":2151},[399,2717,611],{"class":408},[348,2719,2720,2723,2724,2727,2728,449],{},[351,2721,2722],{},"context.qora"," is the shorthand for ",[351,2725,2726],{},"QoraScope.of(context)",": available when the widget is inside a ",[351,2729,103],{},[381,2731],{},[384,2733,2735],{"id":2734},"reset","Reset",[348,2737,2738,2739,2742,2743,2746],{},"After displaying a success or failure result, call ",[351,2740,2741],{},"reset()"," to return to ",[351,2744,2745],{},"MutationIdle"," and allow the user to trigger another mutation.",[348,2748,2749,2750,2752],{},"Because ",[351,2751,113],{}," owns the controller internally, you can drive reset through external widget state:",[389,2754,2756],{"className":391,"code":2755,"filename":393,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003CPost, String, void>(\n  mutator: (title) => api.createPost(title),\n  builder: (context, state, mutate) {\n    if (state is MutationSuccess\u003CPost, String>) {\n      return Column(children: [\n        Text('Created: ${state.data.title}'),\n        TextButton(\n          // Rebuilds with a fresh idle state on next frame\n          onPressed: () => setState(() {}),\n          child: const Text('Create another'),\n        ),\n      ]);\n    }\n    return SubmitButton(\n      onTap: state.isPending ? null : () => mutate('My Post'),\n    );\n  },\n)\n",[351,2757,2758,2776,2796,2812,2836,2848,2877,2884,2889,2907,2926,2932,2939,2944,2952,2985,2991,2997],{"__ignoreMap":395},[399,2759,2760,2762,2764,2766,2768,2770,2772,2774],{"class":401,"line":402},[399,2761,113],{"class":405},[399,2763,409],{"class":408},[399,2765,412],{"class":405},[399,2767,415],{"class":408},[399,2769,418],{"class":405},[399,2771,415],{"class":408},[399,2773,424],{"class":423},[399,2775,427],{"class":408},[399,2777,2778,2780,2782,2784,2786,2788,2790,2792,2794],{"class":401,"line":430},[399,2779,433],{"class":408},[399,2781,437],{"class":436},[399,2783,440],{"class":408},[399,2785,443],{"class":436},[399,2787,446],{"class":408},[399,2789,449],{"class":436},[399,2791,453],{"class":452},[399,2793,456],{"class":408},[399,2795,459],{"class":436},[399,2797,2798,2800,2802,2804,2806,2808,2810],{"class":401,"line":462},[399,2799,465],{"class":408},[399,2801,437],{"class":436},[399,2803,470],{"class":408},[399,2805,473],{"class":436},[399,2807,476],{"class":408},[399,2809,473],{"class":436},[399,2811,481],{"class":408},[399,2813,2814,2816,2819,2822,2825,2827,2829,2831,2833],{"class":401,"line":484},[399,2815,2258],{"class":487},[399,2817,2818],{"class":408}," (state ",[399,2820,2821],{"class":436},"is",[399,2823,2824],{"class":405}," MutationSuccess",[399,2826,409],{"class":408},[399,2828,412],{"class":405},[399,2830,415],{"class":408},[399,2832,418],{"class":405},[399,2834,2835],{"class":408},">) {\n",[399,2837,2838,2840,2842,2844,2846],{"class":401,"line":497},[399,2839,2566],{"class":487},[399,2841,821],{"class":405},[399,2843,824],{"class":408},[399,2845,437],{"class":436},[399,2847,829],{"class":408},[399,2849,2850,2853,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875],{"class":401,"line":541},[399,2851,2852],{"class":405},"        Text",[399,2854,529],{"class":408},[399,2856,780],{"class":532},[399,2858,783],{"class":408},[399,2860,1135],{"class":786},[399,2862,449],{"class":408},[399,2864,787],{"class":786},[399,2866,449],{"class":408},[399,2868,792],{"class":786},[399,2870,795],{"class":408},[399,2872,798],{"class":532},[399,2874,536],{"class":408},[399,2876,459],{"class":436},[399,2878,2879,2882],{"class":401,"line":556},[399,2880,2881],{"class":405},"        TextButton",[399,2883,494],{"class":408},[399,2885,2886],{"class":401,"line":571},[399,2887,2888],{"class":870},"          // Rebuilds with a fresh idle state on next frame\n",[399,2890,2891,2893,2895,2897,2899,2902,2905],{"class":401,"line":591},[399,2892,2100],{"class":408},[399,2894,437],{"class":436},[399,2896,521],{"class":408},[399,2898,443],{"class":436},[399,2900,2901],{"class":452}," setState",[399,2903,2904],{"class":408},"(() {})",[399,2906,459],{"class":436},[399,2908,2909,2911,2913,2915,2917,2919,2922,2924],{"class":401,"line":600},[399,2910,2134],{"class":408},[399,2912,437],{"class":436},[399,2914,562],{"class":423},[399,2916,579],{"class":405},[399,2918,529],{"class":408},[399,2920,2921],{"class":532},"'Create another'",[399,2923,536],{"class":408},[399,2925,459],{"class":436},[399,2927,2928,2930],{"class":401,"line":608},[399,2929,2154],{"class":408},[399,2931,459],{"class":436},[399,2933,2934,2937],{"class":401,"line":874},[399,2935,2936],{"class":408},"      ])",[399,2938,597],{"class":436},[399,2940,2941],{"class":401,"line":895},[399,2942,2943],{"class":408},"    }\n",[399,2945,2946,2948,2950],{"class":401,"line":903},[399,2947,488],{"class":487},[399,2949,716],{"class":405},[399,2951,494],{"class":408},[399,2953,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976,2978,2981,2983],{"class":401,"line":911},[399,2955,1478],{"class":408},[399,2957,437],{"class":436},[399,2959,476],{"class":408},[399,2961,449],{"class":436},[399,2963,509],{"class":408},[399,2965,512],{"class":436},[399,2967,515],{"class":436},[399,2969,518],{"class":436},[399,2971,521],{"class":408},[399,2973,443],{"class":436},[399,2975,526],{"class":452},[399,2977,529],{"class":408},[399,2979,2980],{"class":532},"'My Post'",[399,2982,536],{"class":408},[399,2984,459],{"class":436},[399,2986,2987,2989],{"class":401,"line":919},[399,2988,594],{"class":408},[399,2990,597],{"class":436},[399,2992,2993,2995],{"class":401,"line":926},[399,2994,603],{"class":408},[399,2996,459],{"class":436},[399,2998,2999],{"class":401,"line":1458},[399,3000,611],{"class":408},[372,3002,3003,3004,3006,3007,3010,3011,3013,3014,3017,3018,449],{},"If you need programmatic ",[351,3005,2741],{}," or ",[351,3008,3009],{},"mutate()"," access outside the builder, consider using ",[351,3012,357],{}," directly and subscribing to its ",[351,3015,3016],{},"stream"," in a ",[351,3019,3020],{},"StatefulWidget",[381,3022],{},[384,3024,3026,3027],{"id":3025},"devtools-labelling-with-metadata","DevTools Labelling with ",[351,3028,1026],{},[348,3030,3031,3032,3034],{},"Attach domain context to every ",[351,3033,1041],{}," for easier DevTools filtering:",[389,3036,3039],{"className":391,"code":3037,"filename":3038,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003CUser, LoginCredentials, void>(\n  mutator: authApi.login,\n  metadata: {'category': 'auth', 'screen': 'login'},\n  builder: (context, state, mutate) { ... },\n)\n","auth_screen.dart",[351,3040,3041,3061,3077,3109,3134],{"__ignoreMap":395},[399,3042,3043,3045,3047,3050,3052,3055,3057,3059],{"class":401,"line":402},[399,3044,113],{"class":405},[399,3046,409],{"class":408},[399,3048,3049],{"class":405},"User",[399,3051,415],{"class":408},[399,3053,3054],{"class":405},"LoginCredentials",[399,3056,415],{"class":408},[399,3058,424],{"class":423},[399,3060,427],{"class":408},[399,3062,3063,3065,3067,3070,3072,3075],{"class":401,"line":430},[399,3064,433],{"class":408},[399,3066,437],{"class":436},[399,3068,3069],{"class":408}," authApi",[399,3071,449],{"class":436},[399,3073,3074],{"class":408},"login",[399,3076,459],{"class":436},[399,3078,3079,3082,3084,3087,3090,3092,3095,3097,3100,3102,3105,3107],{"class":401,"line":462},[399,3080,3081],{"class":408},"  metadata",[399,3083,437],{"class":436},[399,3085,3086],{"class":408}," {",[399,3088,3089],{"class":532},"'category'",[399,3091,437],{"class":436},[399,3093,3094],{"class":532}," 'auth'",[399,3096,473],{"class":436},[399,3098,3099],{"class":532}," 'screen'",[399,3101,437],{"class":436},[399,3103,3104],{"class":532}," 'login'",[399,3106,795],{"class":408},[399,3108,459],{"class":436},[399,3110,3111,3113,3115,3117,3119,3121,3123,3126,3129,3132],{"class":401,"line":484},[399,3112,465],{"class":408},[399,3114,437],{"class":436},[399,3116,470],{"class":408},[399,3118,473],{"class":436},[399,3120,476],{"class":408},[399,3122,473],{"class":436},[399,3124,3125],{"class":408}," mutate) { ",[399,3127,3128],{"class":436},"...",[399,3130,3131],{"class":408}," }",[399,3133,459],{"class":436},[399,3135,3136],{"class":401,"line":497},[399,3137,611],{"class":408},[348,3139,3140,3141,3144,3145,3148,3149,449],{},"All events emitted by this controller will include ",[351,3142,3143],{},"metadata: {'category': 'auth', 'screen': 'login'}",", visible in ",[351,3146,3147],{},"client.mutationEvents"," and ",[351,3150,3151],{},"client.activeMutations",[381,3153],{},[384,3155,3157],{"id":3156},"standalone-mode","Standalone Mode",[348,3159,3160,3162,3163,3165,3166,3169,3170,3172],{},[351,3161,113],{}," is safe to use anywhere in the widget tree: even without a ",[351,3164,103],{}," ancestor. In that case, ",[351,3167,3168],{},"tracker"," is ",[351,3171,617],{}," and the controller operates in standalone mode with no global DevTools wiring:",[389,3174,3177],{"className":391,"code":3175,"filename":3176,"language":394,"meta":395,"style":395},"// No QoraScope required\nQoraMutationBuilder\u003Cvoid, OnboardingData, void>(\n  mutator: onboardingApi.submit,\n  builder: (context, state, mutate) { ... },\n)\n","onboarding_screen.dart",[351,3178,3179,3184,3203,3219,3241],{"__ignoreMap":395},[399,3180,3181],{"class":401,"line":402},[399,3182,3183],{"class":870},"// No QoraScope required\n",[399,3185,3186,3188,3190,3192,3194,3197,3199,3201],{"class":401,"line":430},[399,3187,113],{"class":405},[399,3189,409],{"class":408},[399,3191,424],{"class":423},[399,3193,415],{"class":408},[399,3195,3196],{"class":405},"OnboardingData",[399,3198,415],{"class":408},[399,3200,424],{"class":423},[399,3202,427],{"class":408},[399,3204,3205,3207,3209,3212,3214,3217],{"class":401,"line":462},[399,3206,433],{"class":408},[399,3208,437],{"class":436},[399,3210,3211],{"class":408}," onboardingApi",[399,3213,449],{"class":436},[399,3215,3216],{"class":408},"submit",[399,3218,459],{"class":436},[399,3220,3221,3223,3225,3227,3229,3231,3233,3235,3237,3239],{"class":401,"line":484},[399,3222,465],{"class":408},[399,3224,437],{"class":436},[399,3226,470],{"class":408},[399,3228,473],{"class":436},[399,3230,476],{"class":408},[399,3232,473],{"class":436},[399,3234,3125],{"class":408},[399,3236,3128],{"class":436},[399,3238,3131],{"class":408},[399,3240,459],{"class":436},[399,3242,3243],{"class":401,"line":497},[399,3244,611],{"class":408},[381,3246],{},[384,3248,3250],{"id":3249},"controller-lifecycle","Controller Lifecycle",[348,3252,3253,3254,3256],{},"The internal ",[351,3255,357],{}," is:",[1125,3258,3259,3268,3285],{},[1128,3260,3261,3264,3265,536],{},[1131,3262,3263],{},"Created"," on widget mount (",[351,3266,3267],{},"initState",[1128,3269,3270,3273,3274,415,3276,3278,3279,3281,3282,536],{},[1131,3271,3272],{},"Recreated"," when ",[351,3275,967],{},[351,3277,1007],{},", or ",[351,3280,1026],{}," identity changes (",[351,3283,3284],{},"didUpdateWidget",[1128,3286,3287,3290,3291,536],{},[1131,3288,3289],{},"Disposed"," on widget unmount (",[351,3292,3293],{},"dispose",[348,3295,3296,3297,449],{},"When the controller is recreated, the mutation state resets to ",[351,3298,2745],{},[381,3300],{},[384,3302,3304],{"id":3303},"next-steps","Next Steps",[1125,3306,3307,3318,3325,3331],{},[1128,3308,3309,3314,3315,3317],{},[3310,3311,3313],"a",{"href":3312},"../recipes/network-aware","Network Aware Guide",": Offline queue, ",[351,3316,1739],{},", and reconnect replay in full detail",[1128,3319,3320,3324],{},[3310,3321,3323],{"href":3322},"../recipes/mutations","Mutations Guide",": Full conceptual guide with all patterns",[1128,3326,3327,3330],{},[3310,3328,148],{"href":3329},"../recipes/optimistic-updates",": Deep dive into rollback",[1128,3332,3333,3337],{},[3310,3334,3336],{"href":3335},"../api-reference/qora-mutation","Mutation API Reference",": Full API documentation",[3339,3340,3341],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":395,"searchDepth":430,"depth":430,"links":3343},[3344,3345,3346,3347,3349,3350,3354,3355,3356,3358,3359,3360],{"id":386,"depth":430,"text":387},{"id":627,"depth":430,"text":628},{"id":933,"depth":430,"text":934},{"id":1046,"depth":430,"text":3348},"The builder Callback",{"id":1171,"depth":430,"text":1172},{"id":1539,"depth":430,"text":1540,"children":3351},[3352],{"id":1736,"depth":462,"text":3353},"isOptimistic: styling unconfirmed items",{"id":2321,"depth":430,"text":148},{"id":2734,"depth":430,"text":2735},{"id":3025,"depth":430,"text":3357},"DevTools Labelling with metadata",{"id":3156,"depth":430,"text":3157},{"id":3249,"depth":430,"text":3250},{"id":3303,"depth":430,"text":3304},"The widget that manages a MutationController lifecycle and rebuilds your UI on every mutation state transition.","md",null,{},{"icon":116},{"title":3367,"description":3361},{"QoraMutationBuilder":3368,"description":3369},"Flutter Qora","Bind write operations to Flutter UI with QoraMutationBuilder. Automatic controller lifecycle, optimistic updates, and DevTools wiring included.","_mZ_prtcHhkhKE3qvaZbFNYJN3ZK19wiRYhGhv5An2s",[3372,3374],{"title":108,"path":109,"stem":110,"description":3373,"icon":111,"children":-1},"The widget that fetches data, subscribes to state changes, and rebuilds your UI on every state transition.",{"title":118,"path":119,"stem":120,"description":3375,"icon":121,"children":-1},"The widget that manages paginated queries and exposes fetchNextPage, fetchPreviousPage, and refetch through a stable controller interface.",1794040399039]