[{"data":1,"prerenderedAt":3369},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-flutter-integration-qora-mutation-builder":342,"-fr-flutter-integration-qora-mutation-builder-surround":3364},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Prise en main","i-lucide-rocket","/fr/getting-started","fr/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Qu'est-ce que Qora ?","/fr/getting-started/what-is-qora","fr/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/fr/getting-started/installation","fr/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Démarrage rapide","/fr/getting-started/quick-start","fr/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparaison","/fr/getting-started/comparison","fr/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Venant de TanStack Query","/fr/getting-started/coming-from-tanstack-query","fr/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrer depuis d'Autres Librairies","/fr/getting-started/migrating-from-other-libraries","fr/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"Assistants IA","/fr/getting-started/ai-assistants","fr/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Concepts clés","i-lucide-book-open","/fr/core-concepts","fr/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Requêtes","/fr/core-concepts/queries","fr/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Clés de requête","/fr/core-concepts/query-keys","fr/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"États des requêtes","/fr/core-concepts/query-states","fr/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Cache","/fr/core-concepts/caching","fr/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/fr/core-concepts/stale-while-revalidate","fr/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Déduplication","/fr/core-concepts/deduplication","fr/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations et invalidation","/fr/core-concepts/mutations","fr/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Hors-ligne et réseau","/fr/core-concepts/offline","fr/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Usage avec Flutter","i-lucide-smartphone","/fr/flutter-integration","fr/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Configuration","/fr/flutter-integration/setup","fr/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/fr/flutter-integration/qora-scope","fr/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/fr/flutter-integration/qora-builder","fr/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/fr/flutter-integration/qora-mutation-builder","fr/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/fr/flutter-integration/infinite-query-builder","fr/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/fr/flutter-integration/hooks","fr/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Widgets de statut réseau","/fr/flutter-integration/network-status","fr/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Bonnes pratiques","/fr/flutter-integration/best-practices","fr/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Guides Pratiques","i-lucide-chef-hat","/fr/recipes","fr/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/fr/recipes/mutations","fr/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Mises à jour optimistes","/fr/recipes/optimistic-updates","fr/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistance","/fr/recipes/persistence","fr/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Réseau adaptatif","/fr/recipes/network-aware","fr/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Requêtes infinies","/fr/recipes/infinite-queries","fr/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Requêtes dépendantes","/fr/recipes/dependent-queries","fr/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Annulation","/fr/recipes/cancel-token","fr/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"Hydratation SSR","/fr/recipes/ssr-hydration","fr/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Gestion des erreurs","/fr/recipes/error-handling","fr/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Tests","/fr/recipes/testing","fr/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Prefetch au Niveau des Routes","/fr/recipes/prefetch","fr/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"Référence de l'API","i-lucide-file-code","/fr/api-reference","fr/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/fr/api-reference/qora-client","fr/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/fr/api-reference/qora-key","fr/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/fr/api-reference/qora-state","fr/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/fr/api-reference/qora-options","fr/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/fr/api-reference/qora-client-config","fr/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"API Mutation","/fr/api-reference/qora-mutation","fr/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/fr/api-reference/persist-qora-client","fr/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Requête infinie","/fr/api-reference/infinite-query","fr/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"Outils de debug","i-lucide-bug","/fr/devtools","fr/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Vue d'ensemble","/fr/devtools/overview","fr/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"Overlay intégré","/fr/devtools/overlay","fr/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Sérialisation des données","/fr/devtools/data-display","fr/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Intégrations tierces","i-lucide-puzzle","/fr/third-party","fr/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"Avec Provider","/fr/third-party/with-provider","fr/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"Avec BLoC","/fr/third-party/with-bloc","fr/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"Avec Riverpod","/fr/third-party/with-riverpod","fr/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"Avec RxDart","/fr/third-party/with-rxdart","fr/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"Avec Dio","/fr/third-party/with-dio","fr/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"Avec GraphQL","/fr/third-party/with-graphql","fr/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Exemples","/fr/examples","fr/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Étude de cas : Liste et détail utilisateur","/fr/examples/basic-query","fr/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Étude de cas : Mutations optimistes et rollback","/fr/examples/mutations-optimistic","fr/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Étude de cas : Feed à défilement infini","/fr/examples/infinite-scroll","fr/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Étude de cas : Application Todo offline-first","/fr/examples/offline-first","fr/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Étude de cas : Conscience réseau","/fr/examples/network-awareness","fr/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Étude de cas : Intégration des hooks","/fr/examples/hooks-integration","fr/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Étude de cas : Application Todo complète","/fr/examples/complete-todo-app","fr/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Aide","i-lucide-life-buoy","/fr/help","fr/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/fr/help/faq","fr/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Dépannage","/fr/help/troubleshooting","fr/09.help/2.troubleshooting",{"id":343,"title":113,"body":344,"description":3355,"extension":3356,"links":3357,"meta":3358,"navigation":3359,"path":114,"seo":3360,"stem":115,"__hash__":3363},"docs_fr/fr/03.flutter-integration/4.qora-mutation-builder.md",{"type":345,"value":346,"toc":3336},"minimark",[347,371,380,383,388,612,623,625,629,635,929,931,935,1042,1044,1050,1123,1164,1166,1170,1176,1508,1532,1534,1538,1549,1730,1738,1751,2181,2188,2292,2313,2315,2318,2328,2714,2726,2728,2732,2743,2748,2996,3016,3018,3024,3030,3133,3147,3149,3153,3168,3240,3242,3246,3252,3288,3293,3295,3299,3332],[348,349,350,354,355,358,359,362,363,366,367,370],"p",{},[351,352,353],"code",{},"QoraMutationBuilder\u003CTData, TVariables, TContext>"," crée un ",[351,356,357],{},"MutationController"," au montage, le dispose au démontage et reconstruit à chaque changement d'état de mutation. Le callback ",[351,360,361],{},"builder"," reçoit le ",[351,364,365],{},"MutationState"," courant et un callback ",[351,368,369],{},"mutate(variables)"," pour déclencher l'écriture depuis l'UI.",[372,373,374,376,377,379],"tip",{},[351,375,113],{}," ne nécessite pas d'ancêtre ",[351,378,103],{},". Il se câble automatiquement au client quand un scope est présent, et se replie gracieusement en mode autonome dans le cas contraire.",[381,382],"hr",{},[384,385,387],"h2",{"id":386},"utilisation-de-base","Utilisation de base",[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('Nouveau post'),\n      child: state.isPending\n          ? const CircularProgressIndicator()\n          : const Text('Créer'),\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","'Nouveau 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},"'Créer'",[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],{},"Le bouton est désactivé pendant l'exécution de la mutation. Passer ",[351,616,617],{},"null"," à ",[351,620,621],{},"onPressed"," : Flutter désactive le bouton automatiquement.",[381,624],{},[384,626,628],{"id":627},"ui-pilotée-par-létat","UI pilotée par l'état",[348,630,631,632,634],{},"Effectuer une correspondance de motifs directement sur le ",[351,633,365],{}," scellé pour une couverture UI exhaustive :",[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('Créé : ${data.title}'),\n      MutationFailure(:final error) => Column(children: [\n          ErrorBanner(error),\n          TextButton(\n            onPressed: () => mutate('Post'), // Réessayer\n            child: const Text('Réessayer'),\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},"'Créé : ",[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"," // Réessayer\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},"'Réessayer'",[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],{},"Défaut",[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],{},"requis",[963,977,978,979,981,982,449],{},"Fonction d'écriture asynchrone. Nommée ",[351,980,967],{}," en miroir de ",[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],{},"Construit l'arbre de widgets depuis l'état courant.",[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, file hors-ligne et config de réponse optimiste.",[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],{},"Paires clé-valeur transmises à chaque ",[351,1040,1041],{},"MutationEvent",[381,1043],{},[384,1045,1047,1048],{"id":1046},"le-callback-builder","Le callback ",[351,1049,361],{},[389,1051,1053],{"className":391,"code":1052,"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,1054,1055,1065,1075,1095,1119],{"__ignoreMap":395},[399,1056,1057,1060,1063],{"class":401,"line":402},[399,1058,1059],{"class":405},"Widget",[399,1061,1062],{"class":405}," Function",[399,1064,494],{"class":408},[399,1066,1067,1070,1073],{"class":401,"line":430},[399,1068,1069],{"class":405},"  BuildContext",[399,1071,1072],{"class":408}," context",[399,1074,459],{"class":436},[399,1076,1077,1080,1082,1085,1087,1090,1093],{"class":401,"line":462},[399,1078,1079],{"class":405},"  MutationState",[399,1081,409],{"class":408},[399,1083,1084],{"class":405},"TData",[399,1086,415],{"class":408},[399,1088,1089],{"class":405},"TVariables",[399,1091,1092],{"class":408},"> state",[399,1094,459],{"class":436},[399,1096,1097,1100,1102,1104,1107,1110,1112,1114,1117],{"class":401,"line":484},[399,1098,1099],{"class":405},"  Future",[399,1101,409],{"class":408},[399,1103,1084],{"class":405},[399,1105,1106],{"class":408},"?> ",[399,1108,1109],{"class":405},"Function",[399,1111,529],{"class":408},[399,1113,1089],{"class":405},[399,1115,1116],{"class":408}," variables) mutate",[399,1118,459],{"class":436},[399,1120,1121],{"class":401,"line":497},[399,1122,611],{"class":408},[1124,1125,1126,1148],"ul",{},[1127,1128,1129,1135,1136,1138,1139,415,1142,415,1145,449],"li",{},[1130,1131,1132],"strong",{},[351,1133,1134],{},"state"," : le ",[351,1137,365],{}," scellé courant. Effectuer une correspondance de motifs ou utiliser les helpers ",[351,1140,1141],{},".isPending",[351,1143,1144],{},".isSuccess",[351,1146,1147],{},".isError",[1127,1149,1150,1154,1155,1157,1158,1160,1161,449],{},[1130,1151,1152],{},[351,1153,369],{}," : déclenche la mutation. Retourne ",[351,1156,1084],{}," en cas de succès ou ",[351,1159,617],{}," en cas d'échec. Les erreurs ne se propagent jamais à l'appelant ; elles apparaissent dans l'état ",[351,1162,1163],{},"MutationFailure",[381,1165],{},[384,1167,1169],{"id":1168},"hooks-de-cycle-de-vie","Hooks de cycle de vie",[348,1171,1172,1173,1175],{},"Utiliser ",[351,1174,1007],{}," pour effectuer des effets de bord autour de la mutation :",[389,1177,1180],{"className":391,"code":1178,"filename":1179,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003Cvoid, UserUpdate, void>(\n  mutator: (update) => api.updateUser(update),\n  options: MutationOptions(\n    invalidates: [['users', currentUserId]], // Rafraîchissement automatique\n    onSuccess: (_, update, __) async {\n      ScaffoldMessenger.of(context).showSnackBar(\n        const SnackBar(content: Text('Paramètres sauvegardés')),\n      );\n    },\n    onError: (error, _, __) async {\n      ScaffoldMessenger.of(context).showSnackBar(\n        SnackBar(content: Text('Erreur : $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,1181,1182,1201,1224,1236,1259,1285,1305,1329,1336,1342,1365,1381,1409,1415,1421,1428,1444,1453,1470,1489,1496,1503],{"__ignoreMap":395},[399,1183,1184,1186,1188,1190,1192,1195,1197,1199],{"class":401,"line":402},[399,1185,113],{"class":405},[399,1187,409],{"class":408},[399,1189,424],{"class":423},[399,1191,415],{"class":408},[399,1193,1194],{"class":405},"UserUpdate",[399,1196,415],{"class":408},[399,1198,424],{"class":423},[399,1200,427],{"class":408},[399,1202,1203,1205,1207,1210,1212,1214,1216,1219,1222],{"class":401,"line":430},[399,1204,433],{"class":408},[399,1206,437],{"class":436},[399,1208,1209],{"class":408}," (update) ",[399,1211,443],{"class":436},[399,1213,446],{"class":408},[399,1215,449],{"class":436},[399,1217,1218],{"class":452},"updateUser",[399,1220,1221],{"class":408},"(update)",[399,1223,459],{"class":436},[399,1225,1226,1229,1231,1234],{"class":401,"line":462},[399,1227,1228],{"class":408},"  options",[399,1230,437],{"class":436},[399,1232,1233],{"class":405}," MutationOptions",[399,1235,494],{"class":408},[399,1237,1238,1241,1243,1246,1249,1251,1254,1256],{"class":401,"line":484},[399,1239,1240],{"class":408},"    invalidates",[399,1242,437],{"class":436},[399,1244,1245],{"class":408}," [[",[399,1247,1248],{"class":532},"'users'",[399,1250,473],{"class":436},[399,1252,1253],{"class":408}," currentUserId]]",[399,1255,473],{"class":436},[399,1257,1258],{"class":870}," // Rafraîchissement automatique\n",[399,1260,1261,1264,1266,1269,1271,1274,1276,1279,1282],{"class":401,"line":497},[399,1262,1263],{"class":408},"    onSuccess",[399,1265,437],{"class":436},[399,1267,1268],{"class":408}," (_",[399,1270,473],{"class":436},[399,1272,1273],{"class":408}," update",[399,1275,473],{"class":436},[399,1277,1278],{"class":408}," __) ",[399,1280,1281],{"class":487},"async",[399,1283,1284],{"class":408}," {\n",[399,1286,1287,1290,1292,1295,1298,1300,1303],{"class":401,"line":541},[399,1288,1289],{"class":405},"      ScaffoldMessenger",[399,1291,449],{"class":436},[399,1293,1294],{"class":452},"of",[399,1296,1297],{"class":408},"(context)",[399,1299,449],{"class":436},[399,1301,1302],{"class":452},"showSnackBar",[399,1304,494],{"class":408},[399,1306,1307,1310,1313,1316,1318,1320,1322,1325,1327],{"class":401,"line":556},[399,1308,1309],{"class":423},"        const",[399,1311,1312],{"class":405}," SnackBar",[399,1314,1315],{"class":408},"(content",[399,1317,437],{"class":436},[399,1319,579],{"class":405},[399,1321,529],{"class":408},[399,1323,1324],{"class":532},"'Paramètres sauvegardés'",[399,1326,735],{"class":408},[399,1328,459],{"class":436},[399,1330,1331,1334],{"class":401,"line":571},[399,1332,1333],{"class":408},"      )",[399,1335,597],{"class":436},[399,1337,1338,1340],{"class":401,"line":591},[399,1339,914],{"class":408},[399,1341,459],{"class":436},[399,1343,1344,1347,1349,1352,1354,1357,1359,1361,1363],{"class":401,"line":600},[399,1345,1346],{"class":408},"    onError",[399,1348,437],{"class":436},[399,1350,1351],{"class":408}," (error",[399,1353,473],{"class":436},[399,1355,1356],{"class":408}," _",[399,1358,473],{"class":436},[399,1360,1278],{"class":408},[399,1362,1281],{"class":487},[399,1364,1284],{"class":408},[399,1366,1367,1369,1371,1373,1375,1377,1379],{"class":401,"line":608},[399,1368,1289],{"class":405},[399,1370,449],{"class":436},[399,1372,1294],{"class":452},[399,1374,1297],{"class":408},[399,1376,449],{"class":436},[399,1378,1302],{"class":452},[399,1380,494],{"class":408},[399,1382,1383,1386,1388,1390,1392,1394,1397,1400,1403,1405,1407],{"class":401,"line":874},[399,1384,1385],{"class":405},"        SnackBar",[399,1387,1315],{"class":408},[399,1389,437],{"class":436},[399,1391,579],{"class":405},[399,1393,529],{"class":408},[399,1395,1396],{"class":532},"'Erreur : ",[399,1398,1399],{"class":408},"$",[399,1401,1402],{"class":786},"error",[399,1404,798],{"class":532},[399,1406,735],{"class":408},[399,1408,459],{"class":436},[399,1410,1411,1413],{"class":401,"line":895},[399,1412,1333],{"class":408},[399,1414,597],{"class":436},[399,1416,1417,1419],{"class":401,"line":903},[399,1418,914],{"class":408},[399,1420,459],{"class":436},[399,1422,1423,1426],{"class":401,"line":911},[399,1424,1425],{"class":408},"  )",[399,1427,459],{"class":436},[399,1429,1430,1432,1434,1436,1438,1440,1442],{"class":401,"line":919},[399,1431,465],{"class":408},[399,1433,437],{"class":436},[399,1435,470],{"class":408},[399,1437,473],{"class":436},[399,1439,476],{"class":408},[399,1441,473],{"class":436},[399,1443,481],{"class":408},[399,1445,1446,1448,1451],{"class":401,"line":926},[399,1447,488],{"class":487},[399,1449,1450],{"class":405}," SaveButton",[399,1452,494],{"class":408},[399,1454,1456,1459,1461,1463,1465,1468],{"class":401,"line":1455},18,[399,1457,1458],{"class":408},"      isLoading",[399,1460,437],{"class":436},[399,1462,476],{"class":408},[399,1464,449],{"class":436},[399,1466,1467],{"class":408},"isPending",[399,1469,459],{"class":436},[399,1471,1473,1476,1478,1480,1482,1484,1487],{"class":401,"line":1472},19,[399,1474,1475],{"class":408},"      onTap",[399,1477,437],{"class":436},[399,1479,521],{"class":408},[399,1481,443],{"class":436},[399,1483,526],{"class":452},[399,1485,1486],{"class":408},"(formData)",[399,1488,459],{"class":436},[399,1490,1492,1494],{"class":401,"line":1491},20,[399,1493,594],{"class":408},[399,1495,597],{"class":436},[399,1497,1499,1501],{"class":401,"line":1498},21,[399,1500,603],{"class":408},[399,1502,459],{"class":436},[399,1504,1506],{"class":401,"line":1505},22,[399,1507,611],{"class":408},[1509,1510,1511,1512,1515,1516,1519,1520,1523,1524,1527,1528,1531],"warning",{},"Capturer ",[351,1513,1514],{},"context"," dans ",[351,1517,1518],{},"onSuccess","/",[351,1521,1522],{},"onError"," est sûr tant que le widget est monté. Préférer ",[351,1525,1526],{},"ScaffoldMessenger.of(context)"," : il est résilient aux changements de l'arbre de widgets. Éviter ",[351,1529,1530],{},"Navigator.of(context)"," dans les callbacks asynchrones sans vérification de montage.",[381,1533],{},[384,1535,1537],{"id":1536},"file-de-mutations-hors-ligne","File de mutations hors-ligne",[348,1539,1540,1541,1544,1545,1548],{},"Quand l'appareil est hors-ligne, les mutations avec ",[351,1542,1543],{},"offlineQueue: true"," sont enfilées en ordre FIFO et rejouées automatiquement quand la connectivité revient. Fournir ",[351,1546,1547],{},"optimisticResponse"," pour un retour instantané même sans réponse serveur :",[389,1550,1553],{"className":391,"code":1551,"filename":1552,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003Cvoid, Todo, void>(\n  mutator: (todo) => api.createTodo(todo),\n  options: MutationOptions(\n    invalidates: [['todos']], // Rafraîchissement automatique en cas de succès ou relecture hors-ligne\n    // Opter pour la file hors-ligne\n    offlineQueue: true,\n\n    // Fournir un TData optimiste pour que l'UI se mette à jour immédiatement\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,1554,1555,1574,1597,1607,1626,1631,1641,1647,1652,1666,1672,1688,1697,1714,1720,1726],{"__ignoreMap":395},[399,1556,1557,1559,1561,1563,1565,1568,1570,1572],{"class":401,"line":402},[399,1558,113],{"class":405},[399,1560,409],{"class":408},[399,1562,424],{"class":423},[399,1564,415],{"class":408},[399,1566,1567],{"class":405},"Todo",[399,1569,415],{"class":408},[399,1571,424],{"class":423},[399,1573,427],{"class":408},[399,1575,1576,1578,1580,1583,1585,1587,1589,1592,1595],{"class":401,"line":430},[399,1577,433],{"class":408},[399,1579,437],{"class":436},[399,1581,1582],{"class":408}," (todo) ",[399,1584,443],{"class":436},[399,1586,446],{"class":408},[399,1588,449],{"class":436},[399,1590,1591],{"class":452},"createTodo",[399,1593,1594],{"class":408},"(todo)",[399,1596,459],{"class":436},[399,1598,1599,1601,1603,1605],{"class":401,"line":462},[399,1600,1228],{"class":408},[399,1602,437],{"class":436},[399,1604,1233],{"class":405},[399,1606,494],{"class":408},[399,1608,1609,1611,1613,1615,1618,1621,1623],{"class":401,"line":484},[399,1610,1240],{"class":408},[399,1612,437],{"class":436},[399,1614,1245],{"class":408},[399,1616,1617],{"class":532},"'todos'",[399,1619,1620],{"class":408},"]]",[399,1622,473],{"class":436},[399,1624,1625],{"class":870}," // Rafraîchissement automatique en cas de succès ou relecture hors-ligne\n",[399,1627,1628],{"class":401,"line":497},[399,1629,1630],{"class":870},"    // Opter pour la file hors-ligne\n",[399,1632,1633,1636,1638],{"class":401,"line":541},[399,1634,1635],{"class":408},"    offlineQueue",[399,1637,437],{"class":436},[399,1639,1640],{"class":436}," true,\n",[399,1642,1643],{"class":401,"line":556},[399,1644,1646],{"emptyLinePlaceholder":1645},true,"\n",[399,1648,1649],{"class":401,"line":571},[399,1650,1651],{"class":870},"    // Fournir un TData optimiste pour que l'UI se mette à jour immédiatement\n",[399,1653,1654,1657,1659,1661,1663],{"class":401,"line":591},[399,1655,1656],{"class":408},"    optimisticResponse",[399,1658,437],{"class":436},[399,1660,1582],{"class":408},[399,1662,443],{"class":436},[399,1664,1665],{"class":436}," null,\n",[399,1667,1668,1670],{"class":401,"line":600},[399,1669,1425],{"class":408},[399,1671,459],{"class":436},[399,1673,1674,1676,1678,1680,1682,1684,1686],{"class":401,"line":608},[399,1675,465],{"class":408},[399,1677,437],{"class":436},[399,1679,470],{"class":408},[399,1681,473],{"class":436},[399,1683,476],{"class":408},[399,1685,473],{"class":436},[399,1687,481],{"class":408},[399,1689,1690,1692,1695],{"class":401,"line":874},[399,1691,488],{"class":487},[399,1693,1694],{"class":405}," AddTodoButton",[399,1696,494],{"class":408},[399,1698,1699,1701,1703,1705,1707,1709,1712],{"class":401,"line":895},[399,1700,1475],{"class":408},[399,1702,437],{"class":436},[399,1704,521],{"class":408},[399,1706,443],{"class":436},[399,1708,526],{"class":452},[399,1710,1711],{"class":408},"(newTodo)",[399,1713,459],{"class":436},[399,1715,1716,1718],{"class":401,"line":903},[399,1717,594],{"class":408},[399,1719,597],{"class":436},[399,1721,1722,1724],{"class":401,"line":911},[399,1723,603],{"class":408},[399,1725,459],{"class":436},[399,1727,1728],{"class":401,"line":919},[399,1729,611],{"class":408},[1731,1732,1734,1737],"h3",{"id":1733},"isoptimistic-styliser-les-éléments-non-confirmés",[351,1735,1736],{},"isOptimistic"," : styliser les éléments non confirmés",[348,1739,1740,1741,1743,1744,1747,1748,1750],{},"Quand une mutation est en file hors-ligne et que ",[351,1742,1547],{}," est fourni, l'état passe à ",[351,1745,1746],{},"MutationSuccess(isOptimistic: true)",". Utiliser le flag ",[351,1749,1736],{}," pour appliquer un visuel d'attente (grisé, icône d'horloge, barré) afin que les utilisateurs sachent que l'élément n'est pas encore confirmé par le serveur :",[389,1752,1755],{"className":391,"code":1753,"filename":1754,"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    // Extraire isOptimistic depuis l'état de succès\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('En file : synchronisation quand en ligne',\n                  style: TextStyle(color: Colors.grey)),\n            ],\n          ),\n        ElevatedButton(\n          onPressed: state.isPending ? null : () => mutate('Nouveau post'),\n          child: const Text('Créer'),\n        ),\n      ],\n    );\n  },\n)\n","lib/ui/create_post_screen.dart",[351,1756,1757,1775,1789,1799,1807,1829,1835,1851,1856,1871,1891,1901,1907,1911,1919,1928,1936,1946,1963,1972,2015,2032,2044,2069,2077,2084,2092,2126,2146,2154,2162,2169,2176],{"__ignoreMap":395},[399,1758,1759,1761,1763,1765,1767,1769,1771,1773],{"class":401,"line":402},[399,1760,113],{"class":405},[399,1762,409],{"class":408},[399,1764,412],{"class":405},[399,1766,415],{"class":408},[399,1768,418],{"class":405},[399,1770,415],{"class":408},[399,1772,424],{"class":423},[399,1774,427],{"class":408},[399,1776,1777,1779,1781,1783,1785,1787],{"class":401,"line":430},[399,1778,433],{"class":408},[399,1780,437],{"class":436},[399,1782,446],{"class":408},[399,1784,449],{"class":436},[399,1786,453],{"class":408},[399,1788,459],{"class":436},[399,1790,1791,1793,1795,1797],{"class":401,"line":462},[399,1792,1228],{"class":408},[399,1794,437],{"class":436},[399,1796,1233],{"class":405},[399,1798,494],{"class":408},[399,1800,1801,1803,1805],{"class":401,"line":484},[399,1802,1635],{"class":408},[399,1804,437],{"class":436},[399,1806,1640],{"class":436},[399,1808,1809,1811,1813,1815,1817,1820,1822,1825,1827],{"class":401,"line":497},[399,1810,1656],{"class":408},[399,1812,437],{"class":436},[399,1814,440],{"class":408},[399,1816,443],{"class":436},[399,1818,1819],{"class":405}," Post",[399,1821,449],{"class":436},[399,1823,1824],{"class":452},"optimistic",[399,1826,456],{"class":408},[399,1828,459],{"class":436},[399,1830,1831,1833],{"class":401,"line":541},[399,1832,1425],{"class":408},[399,1834,459],{"class":436},[399,1836,1837,1839,1841,1843,1845,1847,1849],{"class":401,"line":556},[399,1838,465],{"class":408},[399,1840,437],{"class":436},[399,1842,470],{"class":408},[399,1844,473],{"class":436},[399,1846,476],{"class":408},[399,1848,473],{"class":436},[399,1850,481],{"class":408},[399,1852,1853],{"class":401,"line":571},[399,1854,1855],{"class":870},"    // Extraire isOptimistic depuis l'état de succès\n",[399,1857,1858,1861,1864,1867,1869],{"class":401,"line":591},[399,1859,1860],{"class":423},"    final",[399,1862,1863],{"class":408}," isOptimistic ",[399,1865,1866],{"class":436},"=",[399,1868,700],{"class":487},[399,1870,703],{"class":408},[399,1872,1873,1875,1877,1879,1881,1884,1886,1889],{"class":401,"line":600},[399,1874,760],{"class":405},[399,1876,529],{"class":408},[399,1878,437],{"class":436},[399,1880,767],{"class":423},[399,1882,1883],{"class":408}," isOptimistic) ",[399,1885,443],{"class":436},[399,1887,1888],{"class":408}," isOptimistic",[399,1890,459],{"class":436},[399,1892,1893,1896,1898],{"class":401,"line":608},[399,1894,1895],{"class":408},"      _ ",[399,1897,443],{"class":436},[399,1899,1900],{"class":436}," false,\n",[399,1902,1903,1905],{"class":401,"line":874},[399,1904,914],{"class":408},[399,1906,597],{"class":436},[399,1908,1909],{"class":401,"line":895},[399,1910,1646],{"emptyLinePlaceholder":1645},[399,1912,1913,1915,1917],{"class":401,"line":903},[399,1914,488],{"class":487},[399,1916,821],{"class":405},[399,1918,494],{"class":408},[399,1920,1921,1924,1926],{"class":401,"line":911},[399,1922,1923],{"class":408},"      children",[399,1925,437],{"class":436},[399,1927,829],{"class":408},[399,1929,1930,1933],{"class":401,"line":919},[399,1931,1932],{"class":487},"        if",[399,1934,1935],{"class":408}," (isOptimistic)\n",[399,1937,1938,1941,1944],{"class":401,"line":926},[399,1939,1940],{"class":423},"          const",[399,1942,1943],{"class":405}," Row",[399,1945,494],{"class":408},[399,1947,1948,1951,1953,1956,1958,1961],{"class":401,"line":1455},[399,1949,1950],{"class":408},"            mainAxisSize",[399,1952,437],{"class":436},[399,1954,1955],{"class":405}," MainAxisSize",[399,1957,449],{"class":436},[399,1959,1960],{"class":408},"min",[399,1962,459],{"class":436},[399,1964,1965,1968,1970],{"class":401,"line":1472},[399,1966,1967],{"class":408},"            children",[399,1969,437],{"class":436},[399,1971,829],{"class":408},[399,1973,1974,1977,1979,1982,1984,1987,1989,1992,1994,1998,2000,2003,2005,2008,2010,2013],{"class":401,"line":1491},[399,1975,1976],{"class":405},"              Icon",[399,1978,529],{"class":408},[399,1980,1981],{"class":405},"Icons",[399,1983,449],{"class":436},[399,1985,1986],{"class":408},"schedule",[399,1988,473],{"class":436},[399,1990,1991],{"class":408}," size",[399,1993,437],{"class":436},[399,1995,1997],{"class":1996},"sbssI"," 14",[399,1999,473],{"class":436},[399,2001,2002],{"class":408}," color",[399,2004,437],{"class":436},[399,2006,2007],{"class":405}," Colors",[399,2009,449],{"class":436},[399,2011,2012],{"class":408},"grey)",[399,2014,459],{"class":436},[399,2016,2017,2020,2023,2025,2028,2030],{"class":401,"line":1498},[399,2018,2019],{"class":405},"              SizedBox",[399,2021,2022],{"class":408},"(width",[399,2024,437],{"class":436},[399,2026,2027],{"class":1996}," 4",[399,2029,536],{"class":408},[399,2031,459],{"class":436},[399,2033,2034,2037,2039,2042],{"class":401,"line":1505},[399,2035,2036],{"class":405},"              Text",[399,2038,529],{"class":408},[399,2040,2041],{"class":532},"'En file : synchronisation quand en ligne'",[399,2043,459],{"class":436},[399,2045,2047,2050,2052,2055,2058,2060,2062,2064,2067],{"class":401,"line":2046},23,[399,2048,2049],{"class":408},"                  style",[399,2051,437],{"class":436},[399,2053,2054],{"class":405}," TextStyle",[399,2056,2057],{"class":408},"(color",[399,2059,437],{"class":436},[399,2061,2007],{"class":405},[399,2063,449],{"class":436},[399,2065,2066],{"class":408},"grey))",[399,2068,459],{"class":436},[399,2070,2072,2075],{"class":401,"line":2071},24,[399,2073,2074],{"class":408},"            ]",[399,2076,459],{"class":436},[399,2078,2080,2082],{"class":401,"line":2079},25,[399,2081,898],{"class":408},[399,2083,459],{"class":436},[399,2085,2087,2090],{"class":401,"line":2086},26,[399,2088,2089],{"class":405},"        ElevatedButton",[399,2091,494],{"class":408},[399,2093,2095,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118,2120,2122,2124],{"class":401,"line":2094},27,[399,2096,2097],{"class":408},"          onPressed",[399,2099,437],{"class":436},[399,2101,476],{"class":408},[399,2103,449],{"class":436},[399,2105,509],{"class":408},[399,2107,512],{"class":436},[399,2109,515],{"class":436},[399,2111,518],{"class":436},[399,2113,521],{"class":408},[399,2115,443],{"class":436},[399,2117,526],{"class":452},[399,2119,529],{"class":408},[399,2121,533],{"class":532},[399,2123,536],{"class":408},[399,2125,459],{"class":436},[399,2127,2129,2132,2134,2136,2138,2140,2142,2144],{"class":401,"line":2128},28,[399,2130,2131],{"class":408},"          child",[399,2133,437],{"class":436},[399,2135,562],{"class":423},[399,2137,579],{"class":405},[399,2139,529],{"class":408},[399,2141,584],{"class":532},[399,2143,536],{"class":408},[399,2145,459],{"class":436},[399,2147,2149,2152],{"class":401,"line":2148},29,[399,2150,2151],{"class":408},"        )",[399,2153,459],{"class":436},[399,2155,2157,2160],{"class":401,"line":2156},30,[399,2158,2159],{"class":408},"      ]",[399,2161,459],{"class":436},[399,2163,2165,2167],{"class":401,"line":2164},31,[399,2166,594],{"class":408},[399,2168,597],{"class":436},[399,2170,2172,2174],{"class":401,"line":2171},32,[399,2173,603],{"class":408},[399,2175,459],{"class":436},[399,2177,2179],{"class":401,"line":2178},33,[399,2180,611],{"class":408},[348,2182,2183,2185,2186,518],{},[351,2184,1736],{}," est également disponible directement sur ",[351,2187,365],{},[389,2189,2191],{"className":391,"code":2190,"language":394,"meta":395,"style":395},"// Sur la classe scellée\nstate.isOptimistic  // false pour tous les états sauf MutationSuccess avec isOptimistic: true\n\n// Dans when()\nstate.when(\n  onSuccess: (data, variables, isOptimistic) {\n    if (isOptimistic) showPendingIndicator();\n    else showConfirmedBadge();\n  },\n  ...\n)\n",[351,2192,2193,2198,2210,2214,2219,2230,2250,2265,2277,2283,2288],{"__ignoreMap":395},[399,2194,2195],{"class":401,"line":402},[399,2196,2197],{"class":870},"// Sur la classe scellée\n",[399,2199,2200,2202,2204,2207],{"class":401,"line":430},[399,2201,1134],{"class":408},[399,2203,449],{"class":436},[399,2205,2206],{"class":408},"isOptimistic  ",[399,2208,2209],{"class":870},"// false pour tous les états sauf MutationSuccess avec isOptimistic: true\n",[399,2211,2212],{"class":401,"line":462},[399,2213,1646],{"emptyLinePlaceholder":1645},[399,2215,2216],{"class":401,"line":484},[399,2217,2218],{"class":870},"// Dans when()\n",[399,2220,2221,2223,2225,2228],{"class":401,"line":497},[399,2222,1134],{"class":408},[399,2224,449],{"class":436},[399,2226,2227],{"class":487},"when",[399,2229,494],{"class":408},[399,2231,2232,2235,2237,2240,2242,2245,2247],{"class":401,"line":541},[399,2233,2234],{"class":408},"  onSuccess",[399,2236,437],{"class":436},[399,2238,2239],{"class":408}," (data",[399,2241,473],{"class":436},[399,2243,2244],{"class":408}," variables",[399,2246,473],{"class":436},[399,2248,2249],{"class":408}," isOptimistic) {\n",[399,2251,2252,2255,2258,2261,2263],{"class":401,"line":556},[399,2253,2254],{"class":487},"    if",[399,2256,2257],{"class":408}," (isOptimistic) ",[399,2259,2260],{"class":452},"showPendingIndicator",[399,2262,753],{"class":408},[399,2264,597],{"class":436},[399,2266,2267,2270,2273,2275],{"class":401,"line":571},[399,2268,2269],{"class":487},"    else",[399,2271,2272],{"class":452}," showConfirmedBadge",[399,2274,753],{"class":408},[399,2276,597],{"class":436},[399,2278,2279,2281],{"class":401,"line":591},[399,2280,603],{"class":408},[399,2282,459],{"class":436},[399,2284,2285],{"class":401,"line":600},[399,2286,2287],{"class":436},"  ...\n",[399,2289,2290],{"class":401,"line":608},[399,2291,611],{"class":408},[372,2293,2294,2297,2298,2300,2301,2300,2304,2306,2307,2309,2310,449],{},[351,2295,2296],{},"isOptimistic: true"," est émis uniquement quand ",[351,2299,1543],{}," ",[1130,2302,2303],{},"et",[351,2305,1547],{}," est fourni ",[1130,2308,2303],{}," l'appareil est hors-ligne. Un succès serveur réel produit toujours ",[351,2311,2312],{},"isOptimistic: false",[381,2314],{},[384,2316,148],{"id":2317},"mises-à-jour-optimistes",[348,2319,2320,2321,2324,2325,2327],{},"Combiner ",[351,2322,2323],{},"onMutate"," (écriture optimiste) et ",[351,2326,1522],{}," (rollback) pour un retour instantané pendant que le serveur confirme le changement :",[389,2329,2332],{"className":391,"code":2330,"filename":2331,"language":394,"meta":395,"style":395},"QoraMutationBuilder\u003Cvoid, Todo, List\u003CTodo>?>(\n  // TContext = List\u003CTodo>? : le snapshot pour le rollback\n  mutator: (todo) => api.addTodo(todo),\n  options: MutationOptions(\n    invalidates: [['todos']], // 4. Récupérer les données confirmées depuis le serveur\n    onMutate: (todo) async {\n      // 1. Snapshot de la liste courante\n      final prev = context.qora.getQueryData\u003CList\u003CTodo>>(['todos']);\n\n      // 2. Appliquer de façon optimiste : l'UI se met à jour avant l'appel réseau\n      context.qora.setQueryData\u003CList\u003CTodo>>(\n        ['todos'],\n        [...?prev, todo.copyWith(isOptimistic: true)],\n      );\n\n      return prev; // Retourné comme TContext\n    },\n    onError: (_, __, prev) async {\n      // 3. Rollback en cas d'échec\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,2333,2334,2358,2363,2384,2394,2411,2424,2429,2469,2473,2478,2503,2515,2548,2554,2558,2572,2578,2600,2605,2632,2638,2644,2660,2668,2682,2698,2704,2710],{"__ignoreMap":395},[399,2335,2336,2338,2340,2342,2344,2346,2348,2351,2353,2355],{"class":401,"line":402},[399,2337,113],{"class":405},[399,2339,409],{"class":408},[399,2341,424],{"class":423},[399,2343,415],{"class":408},[399,2345,1567],{"class":405},[399,2347,415],{"class":408},[399,2349,2350],{"class":405},"List",[399,2352,409],{"class":408},[399,2354,1567],{"class":405},[399,2356,2357],{"class":408},">?>(\n",[399,2359,2360],{"class":401,"line":430},[399,2361,2362],{"class":870},"  // TContext = List\u003CTodo>? : le snapshot pour le rollback\n",[399,2364,2365,2367,2369,2371,2373,2375,2377,2380,2382],{"class":401,"line":462},[399,2366,433],{"class":408},[399,2368,437],{"class":436},[399,2370,1582],{"class":408},[399,2372,443],{"class":436},[399,2374,446],{"class":408},[399,2376,449],{"class":436},[399,2378,2379],{"class":452},"addTodo",[399,2381,1594],{"class":408},[399,2383,459],{"class":436},[399,2385,2386,2388,2390,2392],{"class":401,"line":484},[399,2387,1228],{"class":408},[399,2389,437],{"class":436},[399,2391,1233],{"class":405},[399,2393,494],{"class":408},[399,2395,2396,2398,2400,2402,2404,2406,2408],{"class":401,"line":497},[399,2397,1240],{"class":408},[399,2399,437],{"class":436},[399,2401,1245],{"class":408},[399,2403,1617],{"class":532},[399,2405,1620],{"class":408},[399,2407,473],{"class":436},[399,2409,2410],{"class":870}," // 4. Récupérer les données confirmées depuis le serveur\n",[399,2412,2413,2416,2418,2420,2422],{"class":401,"line":541},[399,2414,2415],{"class":408},"    onMutate",[399,2417,437],{"class":436},[399,2419,1582],{"class":408},[399,2421,1281],{"class":487},[399,2423,1284],{"class":408},[399,2425,2426],{"class":401,"line":556},[399,2427,2428],{"class":870},"      // 1. Snapshot de la liste courante\n",[399,2430,2431,2434,2437,2439,2441,2443,2446,2448,2451,2453,2455,2457,2459,2462,2464,2467],{"class":401,"line":571},[399,2432,2433],{"class":423},"      final",[399,2435,2436],{"class":408}," prev ",[399,2438,1866],{"class":436},[399,2440,1072],{"class":408},[399,2442,449],{"class":436},[399,2444,2445],{"class":408},"qora",[399,2447,449],{"class":436},[399,2449,2450],{"class":452},"getQueryData",[399,2452,409],{"class":408},[399,2454,2350],{"class":405},[399,2456,409],{"class":408},[399,2458,1567],{"class":405},[399,2460,2461],{"class":408},">>([",[399,2463,1617],{"class":532},[399,2465,2466],{"class":408},"])",[399,2468,597],{"class":436},[399,2470,2471],{"class":401,"line":591},[399,2472,1646],{"emptyLinePlaceholder":1645},[399,2474,2475],{"class":401,"line":600},[399,2476,2477],{"class":870},"      // 2. Appliquer de façon optimiste : l'UI se met à jour avant l'appel réseau\n",[399,2479,2480,2483,2485,2487,2489,2492,2494,2496,2498,2500],{"class":401,"line":608},[399,2481,2482],{"class":408},"      context",[399,2484,449],{"class":436},[399,2486,2445],{"class":408},[399,2488,449],{"class":436},[399,2490,2491],{"class":452},"setQueryData",[399,2493,409],{"class":408},[399,2495,2350],{"class":405},[399,2497,409],{"class":408},[399,2499,1567],{"class":405},[399,2501,2502],{"class":408},">>(\n",[399,2504,2505,2508,2510,2513],{"class":401,"line":874},[399,2506,2507],{"class":408},"        [",[399,2509,1617],{"class":532},[399,2511,2512],{"class":408},"]",[399,2514,459],{"class":436},[399,2516,2517,2519,2522,2525,2527,2530,2532,2535,2538,2540,2543,2546],{"class":401,"line":895},[399,2518,2507],{"class":408},[399,2520,2521],{"class":436},"...?",[399,2523,2524],{"class":408},"prev",[399,2526,473],{"class":436},[399,2528,2529],{"class":408}," todo",[399,2531,449],{"class":436},[399,2533,2534],{"class":452},"copyWith",[399,2536,2537],{"class":408},"(isOptimistic",[399,2539,437],{"class":436},[399,2541,2542],{"class":436}," true",[399,2544,2545],{"class":408},")]",[399,2547,459],{"class":436},[399,2549,2550,2552],{"class":401,"line":903},[399,2551,1333],{"class":408},[399,2553,597],{"class":436},[399,2555,2556],{"class":401,"line":911},[399,2557,1646],{"emptyLinePlaceholder":1645},[399,2559,2560,2563,2566,2569],{"class":401,"line":919},[399,2561,2562],{"class":487},"      return",[399,2564,2565],{"class":408}," prev",[399,2567,2568],{"class":436},";",[399,2570,2571],{"class":870}," // Retourné comme TContext\n",[399,2573,2574,2576],{"class":401,"line":926},[399,2575,914],{"class":408},[399,2577,459],{"class":436},[399,2579,2580,2582,2584,2586,2588,2591,2593,2596,2598],{"class":401,"line":1455},[399,2581,1346],{"class":408},[399,2583,437],{"class":436},[399,2585,1268],{"class":408},[399,2587,473],{"class":436},[399,2589,2590],{"class":408}," __",[399,2592,473],{"class":436},[399,2594,2595],{"class":408}," prev) ",[399,2597,1281],{"class":487},[399,2599,1284],{"class":408},[399,2601,2602],{"class":401,"line":1472},[399,2603,2604],{"class":870},"      // 3. Rollback en cas d'échec\n",[399,2606,2607,2609,2611,2613,2615,2618,2621,2623,2625,2627,2630],{"class":401,"line":1491},[399,2608,2482],{"class":408},[399,2610,449],{"class":436},[399,2612,2445],{"class":408},[399,2614,449],{"class":436},[399,2616,2617],{"class":452},"restoreQueryData",[399,2619,2620],{"class":408},"([",[399,2622,1617],{"class":532},[399,2624,2512],{"class":408},[399,2626,473],{"class":436},[399,2628,2629],{"class":408}," prev)",[399,2631,597],{"class":436},[399,2633,2634,2636],{"class":401,"line":1498},[399,2635,914],{"class":408},[399,2637,459],{"class":436},[399,2639,2640,2642],{"class":401,"line":1505},[399,2641,1425],{"class":408},[399,2643,459],{"class":436},[399,2645,2646,2648,2650,2652,2654,2656,2658],{"class":401,"line":2046},[399,2647,465],{"class":408},[399,2649,437],{"class":436},[399,2651,470],{"class":408},[399,2653,473],{"class":436},[399,2655,476],{"class":408},[399,2657,473],{"class":436},[399,2659,481],{"class":408},[399,2661,2662,2664,2666],{"class":401,"line":2071},[399,2663,488],{"class":487},[399,2665,1694],{"class":405},[399,2667,494],{"class":408},[399,2669,2670,2672,2674,2676,2678,2680],{"class":401,"line":2079},[399,2671,1458],{"class":408},[399,2673,437],{"class":436},[399,2675,476],{"class":408},[399,2677,449],{"class":436},[399,2679,1467],{"class":408},[399,2681,459],{"class":436},[399,2683,2684,2686,2688,2690,2692,2694,2696],{"class":401,"line":2086},[399,2685,1475],{"class":408},[399,2687,437],{"class":436},[399,2689,521],{"class":408},[399,2691,443],{"class":436},[399,2693,526],{"class":452},[399,2695,1711],{"class":408},[399,2697,459],{"class":436},[399,2699,2700,2702],{"class":401,"line":2094},[399,2701,594],{"class":408},[399,2703,597],{"class":436},[399,2705,2706,2708],{"class":401,"line":2128},[399,2707,603],{"class":408},[399,2709,459],{"class":436},[399,2711,2712],{"class":401,"line":2148},[399,2713,611],{"class":408},[348,2715,2716,2719,2720,2723,2724,449],{},[351,2717,2718],{},"context.qora"," est le raccourci pour ",[351,2721,2722],{},"QoraScope.of(context)"," : disponible quand le widget est dans un ",[351,2725,103],{},[381,2727],{},[384,2729,2731],{"id":2730},"reset","Reset",[348,2733,2734,2735,2738,2739,2742],{},"Après affichage d'un résultat de succès ou d'échec, appeler ",[351,2736,2737],{},"reset()"," pour revenir à ",[351,2740,2741],{},"MutationIdle"," et permettre à l'utilisateur de déclencher une autre mutation.",[348,2744,2745,2747],{},[351,2746,113],{}," possédant le contrôleur en interne, le reset peut être piloté via l'état du widget externe :",[389,2749,2751],{"className":391,"code":2750,"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('Créé : ${state.data.title}'),\n        TextButton(\n          // Reconstruit avec un état idle frais au prochain frame\n          onPressed: () => setState(() {}),\n          child: const Text('Créer un autre'),\n        ),\n      ]);\n    }\n    return SubmitButton(\n      onTap: state.isPending ? null : () => mutate('Mon post'),\n    );\n  },\n)\n",[351,2752,2753,2771,2791,2807,2831,2843,2872,2879,2884,2902,2921,2927,2934,2939,2947,2980,2986,2992],{"__ignoreMap":395},[399,2754,2755,2757,2759,2761,2763,2765,2767,2769],{"class":401,"line":402},[399,2756,113],{"class":405},[399,2758,409],{"class":408},[399,2760,412],{"class":405},[399,2762,415],{"class":408},[399,2764,418],{"class":405},[399,2766,415],{"class":408},[399,2768,424],{"class":423},[399,2770,427],{"class":408},[399,2772,2773,2775,2777,2779,2781,2783,2785,2787,2789],{"class":401,"line":430},[399,2774,433],{"class":408},[399,2776,437],{"class":436},[399,2778,440],{"class":408},[399,2780,443],{"class":436},[399,2782,446],{"class":408},[399,2784,449],{"class":436},[399,2786,453],{"class":452},[399,2788,456],{"class":408},[399,2790,459],{"class":436},[399,2792,2793,2795,2797,2799,2801,2803,2805],{"class":401,"line":462},[399,2794,465],{"class":408},[399,2796,437],{"class":436},[399,2798,470],{"class":408},[399,2800,473],{"class":436},[399,2802,476],{"class":408},[399,2804,473],{"class":436},[399,2806,481],{"class":408},[399,2808,2809,2811,2814,2817,2820,2822,2824,2826,2828],{"class":401,"line":484},[399,2810,2254],{"class":487},[399,2812,2813],{"class":408}," (state ",[399,2815,2816],{"class":436},"is",[399,2818,2819],{"class":405}," MutationSuccess",[399,2821,409],{"class":408},[399,2823,412],{"class":405},[399,2825,415],{"class":408},[399,2827,418],{"class":405},[399,2829,2830],{"class":408},">) {\n",[399,2832,2833,2835,2837,2839,2841],{"class":401,"line":497},[399,2834,2562],{"class":487},[399,2836,821],{"class":405},[399,2838,824],{"class":408},[399,2840,437],{"class":436},[399,2842,829],{"class":408},[399,2844,2845,2848,2850,2852,2854,2856,2858,2860,2862,2864,2866,2868,2870],{"class":401,"line":541},[399,2846,2847],{"class":405},"        Text",[399,2849,529],{"class":408},[399,2851,780],{"class":532},[399,2853,783],{"class":408},[399,2855,1134],{"class":786},[399,2857,449],{"class":408},[399,2859,787],{"class":786},[399,2861,449],{"class":408},[399,2863,792],{"class":786},[399,2865,795],{"class":408},[399,2867,798],{"class":532},[399,2869,536],{"class":408},[399,2871,459],{"class":436},[399,2873,2874,2877],{"class":401,"line":556},[399,2875,2876],{"class":405},"        TextButton",[399,2878,494],{"class":408},[399,2880,2881],{"class":401,"line":571},[399,2882,2883],{"class":870},"          // Reconstruit avec un état idle frais au prochain frame\n",[399,2885,2886,2888,2890,2892,2894,2897,2900],{"class":401,"line":591},[399,2887,2097],{"class":408},[399,2889,437],{"class":436},[399,2891,521],{"class":408},[399,2893,443],{"class":436},[399,2895,2896],{"class":452}," setState",[399,2898,2899],{"class":408},"(() {})",[399,2901,459],{"class":436},[399,2903,2904,2906,2908,2910,2912,2914,2917,2919],{"class":401,"line":600},[399,2905,2131],{"class":408},[399,2907,437],{"class":436},[399,2909,562],{"class":423},[399,2911,579],{"class":405},[399,2913,529],{"class":408},[399,2915,2916],{"class":532},"'Créer un autre'",[399,2918,536],{"class":408},[399,2920,459],{"class":436},[399,2922,2923,2925],{"class":401,"line":608},[399,2924,2151],{"class":408},[399,2926,459],{"class":436},[399,2928,2929,2932],{"class":401,"line":874},[399,2930,2931],{"class":408},"      ])",[399,2933,597],{"class":436},[399,2935,2936],{"class":401,"line":895},[399,2937,2938],{"class":408},"    }\n",[399,2940,2941,2943,2945],{"class":401,"line":903},[399,2942,488],{"class":487},[399,2944,716],{"class":405},[399,2946,494],{"class":408},[399,2948,2949,2951,2953,2955,2957,2959,2961,2963,2965,2967,2969,2971,2973,2976,2978],{"class":401,"line":911},[399,2950,1475],{"class":408},[399,2952,437],{"class":436},[399,2954,476],{"class":408},[399,2956,449],{"class":436},[399,2958,509],{"class":408},[399,2960,512],{"class":436},[399,2962,515],{"class":436},[399,2964,518],{"class":436},[399,2966,521],{"class":408},[399,2968,443],{"class":436},[399,2970,526],{"class":452},[399,2972,529],{"class":408},[399,2974,2975],{"class":532},"'Mon post'",[399,2977,536],{"class":408},[399,2979,459],{"class":436},[399,2981,2982,2984],{"class":401,"line":919},[399,2983,594],{"class":408},[399,2985,597],{"class":436},[399,2987,2988,2990],{"class":401,"line":926},[399,2989,603],{"class":408},[399,2991,459],{"class":436},[399,2993,2994],{"class":401,"line":1455},[399,2995,611],{"class":408},[372,2997,2998,2999,3001,3002,3005,3006,3008,3009,3012,3013,449],{},"Pour un accès programmatique à ",[351,3000,2737],{}," ou ",[351,3003,3004],{},"mutate()"," en dehors du builder, utiliser directement ",[351,3007,357],{}," et s'abonner à son ",[351,3010,3011],{},"stream"," dans un ",[351,3014,3015],{},"StatefulWidget",[381,3017],{},[384,3019,3021,3022],{"id":3020},"étiquetage-devtools-avec-metadata","Étiquetage DevTools avec ",[351,3023,1026],{},[348,3025,3026,3027,3029],{},"Attacher un contexte métier à chaque ",[351,3028,1041],{}," pour un filtrage plus facile dans les DevTools :",[389,3031,3034],{"className":391,"code":3032,"filename":3033,"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,3035,3036,3056,3072,3104,3129],{"__ignoreMap":395},[399,3037,3038,3040,3042,3045,3047,3050,3052,3054],{"class":401,"line":402},[399,3039,113],{"class":405},[399,3041,409],{"class":408},[399,3043,3044],{"class":405},"User",[399,3046,415],{"class":408},[399,3048,3049],{"class":405},"LoginCredentials",[399,3051,415],{"class":408},[399,3053,424],{"class":423},[399,3055,427],{"class":408},[399,3057,3058,3060,3062,3065,3067,3070],{"class":401,"line":430},[399,3059,433],{"class":408},[399,3061,437],{"class":436},[399,3063,3064],{"class":408}," authApi",[399,3066,449],{"class":436},[399,3068,3069],{"class":408},"login",[399,3071,459],{"class":436},[399,3073,3074,3077,3079,3082,3085,3087,3090,3092,3095,3097,3100,3102],{"class":401,"line":462},[399,3075,3076],{"class":408},"  metadata",[399,3078,437],{"class":436},[399,3080,3081],{"class":408}," {",[399,3083,3084],{"class":532},"'category'",[399,3086,437],{"class":436},[399,3088,3089],{"class":532}," 'auth'",[399,3091,473],{"class":436},[399,3093,3094],{"class":532}," 'screen'",[399,3096,437],{"class":436},[399,3098,3099],{"class":532}," 'login'",[399,3101,795],{"class":408},[399,3103,459],{"class":436},[399,3105,3106,3108,3110,3112,3114,3116,3118,3121,3124,3127],{"class":401,"line":484},[399,3107,465],{"class":408},[399,3109,437],{"class":436},[399,3111,470],{"class":408},[399,3113,473],{"class":436},[399,3115,476],{"class":408},[399,3117,473],{"class":436},[399,3119,3120],{"class":408}," mutate) { ",[399,3122,3123],{"class":436},"...",[399,3125,3126],{"class":408}," }",[399,3128,459],{"class":436},[399,3130,3131],{"class":401,"line":497},[399,3132,611],{"class":408},[348,3134,3135,3136,3139,3140,3143,3144,449],{},"Tous les événements émis par ce contrôleur incluront ",[351,3137,3138],{},"metadata: {'category': 'auth', 'screen': 'login'}",", visible dans ",[351,3141,3142],{},"client.mutationEvents"," et ",[351,3145,3146],{},"client.activeMutations",[381,3148],{},[384,3150,3152],{"id":3151},"mode-autonome","Mode autonome",[348,3154,3155,3157,3158,3160,3161,3164,3165,3167],{},[351,3156,113],{}," peut être utilisé n'importe où dans l'arbre de widgets, même sans ancêtre ",[351,3159,103],{},". Dans ce cas, ",[351,3162,3163],{},"tracker"," est ",[351,3166,617],{}," et le contrôleur fonctionne en mode autonome sans câblage DevTools global :",[389,3169,3172],{"className":391,"code":3170,"filename":3171,"language":394,"meta":395,"style":395},"// Pas de QoraScope requis\nQoraMutationBuilder\u003Cvoid, OnboardingData, void>(\n  mutator: onboardingApi.submit,\n  builder: (context, state, mutate) { ... },\n)\n","onboarding_screen.dart",[351,3173,3174,3179,3198,3214,3236],{"__ignoreMap":395},[399,3175,3176],{"class":401,"line":402},[399,3177,3178],{"class":870},"// Pas de QoraScope requis\n",[399,3180,3181,3183,3185,3187,3189,3192,3194,3196],{"class":401,"line":430},[399,3182,113],{"class":405},[399,3184,409],{"class":408},[399,3186,424],{"class":423},[399,3188,415],{"class":408},[399,3190,3191],{"class":405},"OnboardingData",[399,3193,415],{"class":408},[399,3195,424],{"class":423},[399,3197,427],{"class":408},[399,3199,3200,3202,3204,3207,3209,3212],{"class":401,"line":462},[399,3201,433],{"class":408},[399,3203,437],{"class":436},[399,3205,3206],{"class":408}," onboardingApi",[399,3208,449],{"class":436},[399,3210,3211],{"class":408},"submit",[399,3213,459],{"class":436},[399,3215,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234],{"class":401,"line":484},[399,3217,465],{"class":408},[399,3219,437],{"class":436},[399,3221,470],{"class":408},[399,3223,473],{"class":436},[399,3225,476],{"class":408},[399,3227,473],{"class":436},[399,3229,3120],{"class":408},[399,3231,3123],{"class":436},[399,3233,3126],{"class":408},[399,3235,459],{"class":436},[399,3237,3238],{"class":401,"line":497},[399,3239,611],{"class":408},[381,3241],{},[384,3243,3245],{"id":3244},"cycle-de-vie-du-contrôleur","Cycle de vie du contrôleur",[348,3247,3248,3249,3251],{},"Le ",[351,3250,357],{}," interne est :",[1124,3253,3254,3263,3279],{},[1127,3255,3256,3259,3260,536],{},[1130,3257,3258],{},"Créé"," au montage du widget (",[351,3261,3262],{},"initState",[1127,3264,3265,3268,3269,415,3271,3001,3273,3275,3276,536],{},[1130,3266,3267],{},"Recréé"," quand l'identité de ",[351,3270,967],{},[351,3272,1007],{},[351,3274,1026],{}," change (",[351,3277,3278],{},"didUpdateWidget",[1127,3280,3281,3284,3285,536],{},[1130,3282,3283],{},"Disposé"," au démontage du widget (",[351,3286,3287],{},"dispose",[348,3289,3290,3291,449],{},"Quand le contrôleur est recréé, l'état de mutation est réinitialisé à ",[351,3292,2741],{},[381,3294],{},[384,3296,3298],{"id":3297},"étapes-suivantes","Étapes suivantes",[1124,3300,3301,3312,3319,3325],{},[1127,3302,3303,3308,3309,3311],{},[3304,3305,3307],"a",{"href":3306},"../recipes/network-aware","Guide réseau adaptatif"," : File hors-ligne, ",[351,3310,1736],{}," et relecture à la reconnexion en détail",[1127,3313,3314,3318],{},[3304,3315,3317],{"href":3316},"../recipes/mutations","Guide des mutations"," : Guide conceptuel complet avec tous les patterns",[1127,3320,3321,3324],{},[3304,3322,148],{"href":3323},"../recipes/optimistic-updates"," : Exploration approfondie du rollback",[1127,3326,3327,3331],{},[3304,3328,3330],{"href":3329},"../api-reference/qora-mutation","Référence API Mutation"," : Documentation API complète",[3333,3334,3335],"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":3337},[3338,3339,3340,3341,3343,3344,3348,3349,3350,3352,3353,3354],{"id":386,"depth":430,"text":387},{"id":627,"depth":430,"text":628},{"id":933,"depth":430,"text":934},{"id":1046,"depth":430,"text":3342},"Le callback builder",{"id":1168,"depth":430,"text":1169},{"id":1536,"depth":430,"text":1537,"children":3345},[3346],{"id":1733,"depth":462,"text":3347},"isOptimistic : styliser les éléments non confirmés",{"id":2317,"depth":430,"text":148},{"id":2730,"depth":430,"text":2731},{"id":3020,"depth":430,"text":3351},"Étiquetage DevTools avec metadata",{"id":3151,"depth":430,"text":3152},{"id":3244,"depth":430,"text":3245},{"id":3297,"depth":430,"text":3298},"Le widget qui gère le cycle de vie d'un MutationController et reconstruit l'UI à chaque transition d'état de mutation.","md",null,{},{"icon":116},{"title":3361,"description":3362},"QoraMutationBuilder - Flutter Qora","Lier les opérations d'écriture à l'UI Flutter avec QoraMutationBuilder. Cycle de vie du contrôleur automatique, mises à jour optimistes et câblage DevTools inclus.","sIbemcRVuXSjItrqVlerukbP8mdarjVT8Pm2H_AxeYo",[3365,3367],{"title":108,"path":109,"stem":110,"description":3366,"icon":111,"children":-1},"Le widget qui récupère les données, s'abonne aux changements d'état et reconstruit l'UI à chaque transition d'état.",{"title":118,"path":119,"stem":120,"description":3368,"icon":121,"children":-1},"Le widget qui gère les requêtes paginées et expose fetchNextPage, fetchPreviousPage et refetch via une interface de contrôleur stable.",1794040407227]