[{"data":1,"prerenderedAt":1240},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-core-concepts-mutations":342,"-fr-core-concepts-mutations-surround":1235},[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":82,"body":344,"description":1228,"extension":1229,"links":1230,"meta":1231,"navigation":1232,"path":83,"seo":1233,"stem":84,"__hash__":1234},"docs_fr/fr/02.core-concepts/7.mutations.md",{"type":345,"value":346,"toc":1218},"minimark",[347,356,359,364,367,378,381,387,412,416,486,489,493,500,678,689,731,734,737,830,837,840,843,1142,1155,1159,1162,1180,1184,1214],[348,349,350,351,355],"p",{},"Une requête lit des données serveur et les garde en cache. Une ",[352,353,354],"strong",{},"mutation"," modifie des données serveur : création, mise à jour, suppression. Les mutations ne sont ni mises en cache ni dédupliquées ; elles s'exécutent quand vous les appelez, une fois par appel.",[348,357,358],{},"Le plus difficile dans une écriture n'est pas de l'envoyer. C'est ce que deviennent les données en cache ensuite : la liste qui devrait contenir le nouvel élément, l'écran de détail qui affiche l'ancien titre. Cette page traite de cette partie.",[360,361,363],"h2",{"id":362},"le-cycle-de-vie","Le cycle de vie",[348,365,366],{},"Une mutation passe par quatre états :",[368,369,375],"pre",{"className":370,"code":372,"language":373,"meta":374},[371],"language-text","MutationIdle ──mutate()──▶ MutationPending ──▶ MutationSuccess\n                                         └──▶ MutationFailure\n","text","",[376,377,372],"code",{"__ignoreMap":374},[348,379,380],{},"Ses callbacks s'exécutent dans un ordre fixe. Le connaître indique où placer chaque partie de la logique :",[368,382,385],{"className":383,"code":384,"language":373,"meta":374},[371],"mutate(variables)\n  1. onMutate(variables)            → renvoie un contexte (souvent un snapshot)\n  2. état : MutationPending\n  3. mutator(variables)             → retenté retryCount fois (0 par défaut)\n  succès :\n  4. état : MutationSuccess\n  5. onSuccess(data, variables, context)\n  6. invalidates, puis invalidatesTags\n  7. onSettled(data, null, variables, context)\n  échec :\n  4. état : MutationFailure\n  5. onError(error, variables, context)\n  6. onSettled(null, error, variables, context)\n",[376,386,384],{"__ignoreMap":374},[348,388,389,390,393,394,397,398,401,402,404,405,408,409,411],{},"Le ",[376,391,392],{},"context"," renvoyé par ",[376,395,396],{},"onMutate"," est transmis à tous les callbacks suivants. C'est ainsi qu'un rollback dans ",[376,399,400],{},"onError"," sait quoi restaurer. Si ",[376,403,396],{}," lève lui-même une exception, la mutation passe directement à ",[376,406,407],{},"MutationFailure"," : le mutator n'est pas appelé, et ",[376,410,400],{}," non plus.",[360,413,415],{"id":414},"trois-façons-de-mettre-à-jour-le-cache-après-une-écriture","Trois façons de mettre à jour le cache après une écriture",[417,418,419,435],"table",{},[420,421,422],"thead",{},[423,424,425,429,432],"tr",{},[426,427,428],"th",{},"Stratégie",[426,430,431],{},"Ce que vous faites",[426,433,434],{},"À utiliser quand",[436,437,438,452,468],"tbody",{},[423,439,440,446,449],{},[441,442,443],"td",{},[352,444,445],{},"Invalider",[441,447,448],{},"Marquer les requêtes concernées comme périmées ; elles se relancent",[441,450,451],{},"Par défaut. Le serveur fait foi et une requête de plus est acceptable",[423,453,454,459,465],{},[441,455,456],{},[352,457,458],{},"Écrire la réponse",[441,460,461,462],{},"Mettre la réponse du serveur en cache avec ",[376,463,464],{},"setQueryData",[441,466,467],{},"Le serveur renvoie l'entité mise à jour, et vous voulez éviter le refetch",[423,469,470,475,483],{},[441,471,472],{},[352,473,474],{},"Mise à jour optimiste",[441,476,477,478,480,481],{},"Modifier le cache dans ",[376,479,396],{},", annuler dans ",[376,482,400],{},[441,484,485],{},"Le résultat est prévisible et l'UI doit réagir instantanément, ou fonctionner hors-ligne",[348,487,488],{},"Elles se combinent. Le schéma le plus robuste est une mise à jour optimiste suivie d'une invalidation : l'UI change immédiatement, et le refetch remplace votre supposition par ce que le serveur a réellement enregistré.",[490,491,445],"h3",{"id":492},"invalider",[348,494,495,496,499],{},"Déclarez les clés qu'une mutation affecte ; Qora les invalide après ",[376,497,498],{},"onSuccess"," :",[368,501,505],{"className":502,"code":503,"language":504,"meta":374,"style":374},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraMutationBuilder\u003CTodo, String, void>(\n  mutator: (title) => api.createTodo(title),\n  options: const MutationOptions(invalidates: [['todos']]),\n  builder: (context, state, mutate) => AddTodoField(\n    enabled: !state.isPending,\n    onSubmit: mutate,\n  ),\n)\n","dart",[376,506,507,537,569,600,630,651,664,672],{"__ignoreMap":374},[508,509,512,515,519,522,525,528,530,534],"span",{"class":510,"line":511},"line",1,[508,513,113],{"class":514},"sBMFI",[508,516,518],{"class":517},"sTEyZ","\u003C",[508,520,521],{"class":514},"Todo",[508,523,524],{"class":517},", ",[508,526,527],{"class":514},"String",[508,529,524],{"class":517},[508,531,533],{"class":532},"spNyl","void",[508,535,536],{"class":517},">(\n",[508,538,540,543,547,550,553,556,559,563,566],{"class":510,"line":539},2,[508,541,542],{"class":517},"  mutator",[508,544,546],{"class":545},"sMK4o",":",[508,548,549],{"class":517}," (title) ",[508,551,552],{"class":545},"=>",[508,554,555],{"class":517}," api",[508,557,558],{"class":545},".",[508,560,562],{"class":561},"s2Zo4","createTodo",[508,564,565],{"class":517},"(title)",[508,567,568],{"class":545},",\n",[508,570,572,575,577,580,583,586,588,591,595,598],{"class":510,"line":571},3,[508,573,574],{"class":517},"  options",[508,576,546],{"class":545},[508,578,579],{"class":532}," const",[508,581,582],{"class":514}," MutationOptions",[508,584,585],{"class":517},"(invalidates",[508,587,546],{"class":545},[508,589,590],{"class":517}," [[",[508,592,594],{"class":593},"sfazB","'todos'",[508,596,597],{"class":517},"]])",[508,599,568],{"class":545},[508,601,603,606,608,611,614,617,619,622,624,627],{"class":510,"line":602},4,[508,604,605],{"class":517},"  builder",[508,607,546],{"class":545},[508,609,610],{"class":517}," (context",[508,612,613],{"class":545},",",[508,615,616],{"class":517}," state",[508,618,613],{"class":545},[508,620,621],{"class":517}," mutate) ",[508,623,552],{"class":545},[508,625,626],{"class":514}," AddTodoField",[508,628,629],{"class":517},"(\n",[508,631,633,636,638,641,644,646,649],{"class":510,"line":632},5,[508,634,635],{"class":517},"    enabled",[508,637,546],{"class":545},[508,639,640],{"class":545}," !",[508,642,643],{"class":517},"state",[508,645,558],{"class":545},[508,647,648],{"class":517},"isPending",[508,650,568],{"class":545},[508,652,654,657,659,662],{"class":510,"line":653},6,[508,655,656],{"class":517},"    onSubmit",[508,658,546],{"class":545},[508,660,661],{"class":517}," mutate",[508,663,568],{"class":545},[508,665,667,670],{"class":510,"line":666},7,[508,668,669],{"class":517},"  )",[508,671,568],{"class":545},[508,673,675],{"class":510,"line":674},8,[508,676,677],{"class":517},")\n",[348,679,680,681,684,685,688],{},"Invalider une clé marque sa donnée comme périmée. Une requête affichée à l'écran se relance immédiatement ; en attendant, son état est ",[376,682,683],{},"Loading"," avec l'ancienne donnée dans ",[376,686,687],{},"previousData",", que l'écran peut continuer d'afficher. Une requête qui n'est pas à l'écran se relance la prochaine fois qu'un widget l'utilise.",[690,691,692,695,696,699,700,703,704,707,708,711,712,715,716,718,719,722,723,726,727,558],"warning",{},[376,693,694],{},"invalidates"," compare des ",[352,697,698],{},"clés exactes",". ",[376,701,702],{},"[['todos']]"," invalide ",[376,705,706],{},"['todos']",", pas ",[376,709,710],{},"['todos', 42]",". Pour invalider toute une famille, appelez ",[376,713,714],{},"client.invalidatePrefix(['todos'])"," dans ",[376,717,498],{},", ou utilisez les tags (",[376,720,721],{},"providesTags"," sur les requêtes, ",[376,724,725],{},"invalidatesTags"," sur la mutation). Voir ",[728,729,57],"a",{"href":730},"./query-keys",[490,732,458],{"id":733},"écrire-la-réponse",[348,735,736],{},"Quand le serveur renvoie l'entité mise à jour, mettez-la en cache au lieu de la recharger :",[368,738,740],{"className":502,"code":739,"language":504,"meta":374,"style":374},"options: MutationOptions(\n  onSuccess: (updated, _, __) async {\n    client.setQueryData\u003CTodo>(['todos', updated.id], updated);\n  },\n),\n",[376,741,742,753,780,816,823],{"__ignoreMap":374},[508,743,744,747,749,751],{"class":510,"line":511},[508,745,746],{"class":517},"options",[508,748,546],{"class":545},[508,750,582],{"class":514},[508,752,629],{"class":517},[508,754,755,758,760,763,765,768,770,773,777],{"class":510,"line":539},[508,756,757],{"class":517},"  onSuccess",[508,759,546],{"class":545},[508,761,762],{"class":517}," (updated",[508,764,613],{"class":545},[508,766,767],{"class":517}," _",[508,769,613],{"class":545},[508,771,772],{"class":517}," __) ",[508,774,776],{"class":775},"s7zQu","async",[508,778,779],{"class":517}," {\n",[508,781,782,785,787,789,791,793,796,798,800,803,805,808,810,813],{"class":510,"line":571},[508,783,784],{"class":517},"    client",[508,786,558],{"class":545},[508,788,464],{"class":561},[508,790,518],{"class":517},[508,792,521],{"class":514},[508,794,795],{"class":517},">([",[508,797,594],{"class":593},[508,799,613],{"class":545},[508,801,802],{"class":517}," updated",[508,804,558],{"class":545},[508,806,807],{"class":517},"id]",[508,809,613],{"class":545},[508,811,812],{"class":517}," updated)",[508,814,815],{"class":545},";\n",[508,817,818,821],{"class":510,"line":602},[508,819,820],{"class":517},"  }",[508,822,568],{"class":545},[508,824,825,828],{"class":510,"line":632},[508,826,827],{"class":517},")",[508,829,568],{"class":545},[348,831,832,833,836],{},"Chaque widget qui affiche ",[376,834,835],{},"['todos', updated.id]"," se reconstruit avec la nouvelle valeur, sans requête. Les listes qui contiennent l'élément sont une autre clé : invalidez-les, ou mettez-les à jour de la même façon.",[490,838,474],{"id":839},"mise-à-jour-optimiste",[348,841,842],{},"Modifiez le cache avant la réponse du serveur, gardez un snapshot, et restaurez-le en cas d'échec :",[368,844,846],{"className":502,"code":845,"language":504,"meta":374,"style":374},"options: MutationOptions\u003CTodo, Todo, List\u003CTodo>?>(\n  onMutate: (todo) async {\n    final previous = client.getQueryData\u003CList\u003CTodo>>(['todos']);\n    client.setQueryData\u003CList\u003CTodo>>(\n      ['todos'],\n      [for (final t in previous ?? \u003CTodo>[]) t.id == todo.id ? todo : t],\n    );\n    return previous; // devient `context` dans les autres callbacks\n  },\n  onError: (_, __, previous) async {\n    client.restoreQueryData\u003CList\u003CTodo>>(['todos'], previous);\n  },\n  invalidates: const [['todos']], // réaligner sur le serveur dans tous les cas\n),\n",[376,847,848,876,890,927,946,958,1021,1028,1043,1050,1075,1106,1113,1135],{"__ignoreMap":374},[508,849,850,852,854,856,858,860,862,864,866,869,871,873],{"class":510,"line":511},[508,851,746],{"class":517},[508,853,546],{"class":545},[508,855,582],{"class":514},[508,857,518],{"class":517},[508,859,521],{"class":514},[508,861,524],{"class":517},[508,863,521],{"class":514},[508,865,524],{"class":517},[508,867,868],{"class":514},"List",[508,870,518],{"class":517},[508,872,521],{"class":514},[508,874,875],{"class":517},">?>(\n",[508,877,878,881,883,886,888],{"class":510,"line":539},[508,879,880],{"class":517},"  onMutate",[508,882,546],{"class":545},[508,884,885],{"class":517}," (todo) ",[508,887,776],{"class":775},[508,889,779],{"class":517},[508,891,892,895,898,901,904,906,909,911,913,915,917,920,922,925],{"class":510,"line":571},[508,893,894],{"class":532},"    final",[508,896,897],{"class":517}," previous ",[508,899,900],{"class":545},"=",[508,902,903],{"class":517}," client",[508,905,558],{"class":545},[508,907,908],{"class":561},"getQueryData",[508,910,518],{"class":517},[508,912,868],{"class":514},[508,914,518],{"class":517},[508,916,521],{"class":514},[508,918,919],{"class":517},">>([",[508,921,594],{"class":593},[508,923,924],{"class":517},"])",[508,926,815],{"class":545},[508,928,929,931,933,935,937,939,941,943],{"class":510,"line":602},[508,930,784],{"class":517},[508,932,558],{"class":545},[508,934,464],{"class":561},[508,936,518],{"class":517},[508,938,868],{"class":514},[508,940,518],{"class":517},[508,942,521],{"class":514},[508,944,945],{"class":517},">>(\n",[508,947,948,951,953,956],{"class":510,"line":632},[508,949,950],{"class":517},"      [",[508,952,594],{"class":593},[508,954,955],{"class":517},"]",[508,957,568],{"class":545},[508,959,960,962,965,968,971,974,977,979,982,985,987,990,993,995,998,1001,1004,1006,1008,1011,1014,1016,1019],{"class":510,"line":653},[508,961,950],{"class":517},[508,963,964],{"class":775},"for",[508,966,967],{"class":517}," (",[508,969,970],{"class":532},"final",[508,972,973],{"class":517}," t ",[508,975,976],{"class":775},"in",[508,978,897],{"class":517},[508,980,981],{"class":545},"??",[508,983,984],{"class":545}," \u003C",[508,986,521],{"class":514},[508,988,989],{"class":545},">",[508,991,992],{"class":517},"[]) t",[508,994,558],{"class":545},[508,996,997],{"class":517},"id ",[508,999,1000],{"class":545},"==",[508,1002,1003],{"class":517}," todo",[508,1005,558],{"class":545},[508,1007,997],{"class":517},[508,1009,1010],{"class":545},"?",[508,1012,1013],{"class":517}," todo ",[508,1015,546],{"class":545},[508,1017,1018],{"class":517}," t]",[508,1020,568],{"class":545},[508,1022,1023,1026],{"class":510,"line":666},[508,1024,1025],{"class":517},"    )",[508,1027,815],{"class":545},[508,1029,1030,1033,1036,1039],{"class":510,"line":674},[508,1031,1032],{"class":775},"    return",[508,1034,1035],{"class":517}," previous",[508,1037,1038],{"class":545},";",[508,1040,1042],{"class":1041},"sHwdD"," // devient `context` dans les autres callbacks\n",[508,1044,1046,1048],{"class":510,"line":1045},9,[508,1047,820],{"class":517},[508,1049,568],{"class":545},[508,1051,1053,1056,1058,1061,1063,1066,1068,1071,1073],{"class":510,"line":1052},10,[508,1054,1055],{"class":517},"  onError",[508,1057,546],{"class":545},[508,1059,1060],{"class":517}," (_",[508,1062,613],{"class":545},[508,1064,1065],{"class":517}," __",[508,1067,613],{"class":545},[508,1069,1070],{"class":517}," previous) ",[508,1072,776],{"class":775},[508,1074,779],{"class":517},[508,1076,1078,1080,1082,1085,1087,1089,1091,1093,1095,1097,1099,1101,1104],{"class":510,"line":1077},11,[508,1079,784],{"class":517},[508,1081,558],{"class":545},[508,1083,1084],{"class":561},"restoreQueryData",[508,1086,518],{"class":517},[508,1088,868],{"class":514},[508,1090,518],{"class":517},[508,1092,521],{"class":514},[508,1094,919],{"class":517},[508,1096,594],{"class":593},[508,1098,955],{"class":517},[508,1100,613],{"class":545},[508,1102,1103],{"class":517}," previous)",[508,1105,815],{"class":545},[508,1107,1109,1111],{"class":510,"line":1108},12,[508,1110,820],{"class":517},[508,1112,568],{"class":545},[508,1114,1116,1119,1121,1123,1125,1127,1130,1132],{"class":510,"line":1115},13,[508,1117,1118],{"class":517},"  invalidates",[508,1120,546],{"class":545},[508,1122,579],{"class":532},[508,1124,590],{"class":517},[508,1126,594],{"class":593},[508,1128,1129],{"class":517},"]]",[508,1131,613],{"class":545},[508,1133,1134],{"class":1041}," // réaligner sur le serveur dans tous les cas\n",[508,1136,1138,1140],{"class":510,"line":1137},14,[508,1139,827],{"class":517},[508,1141,568],{"class":545},[348,1143,1144,1146,1147,1150,1151,1154],{},[376,1145,1084],{}," remet le snapshot en place, ou supprime l'entrée si le snapshot vaut ",[376,1148,1149],{},"null",". La recette ",[728,1152,148],{"href":1153},"../recipes/optimistic-updates"," couvre les listes, les clés multiples et les modifications concurrentes.",[360,1156,1158],{"id":1157},"mutations-et-réseau","Mutations et réseau",[348,1160,1161],{},"Par défaut, une mutation envoie sa requête immédiatement. Quand l'appareil est hors-ligne, cette requête échoue comme n'importe quelle erreur réseau, et le chemin d'échec ci-dessus s'exécute.",[348,1163,1164,1165,1168,1169,1172,1173,1175,1176,1179],{},"Avec ",[376,1166,1167],{},"offlineQueue: true",", une mutation appelée hors-ligne est ",[352,1170,1171],{},"mise en file"," à la place : ",[376,1174,396],{}," s'exécute tout de suite, donc les mises à jour optimistes fonctionnent hors-ligne, et la requête est envoyée à la reconnexion. ",[728,1177,87],{"href":1178},"./offline"," explique la file, son ordre et ses limites.",[360,1181,1183],{"id":1182},"étapes-suivantes","Étapes suivantes",[1185,1186,1187,1193,1203,1208],"ul",{},[1188,1189,1190,1192],"li",{},[728,1191,87],{"href":1178}," : requêtes en pause, file de mutations, reconnexion",[1188,1194,1195,1199,1200,1202],{},[728,1196,1198],{"href":1197},"../recipes/mutations","Recette Mutations"," : ",[376,1201,113],{},", retries, tags, contrôleurs autonomes",[1188,1204,1205,1207],{},[728,1206,148],{"href":1153}," : schémas pour les listes et les clés multiples",[1188,1209,1210,1213],{},[728,1211,113],{"href":1212},"../flutter-integration/qora-mutation-builder"," : l'API du widget",[1215,1216,1217],"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 .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 .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 .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}",{"title":374,"searchDepth":539,"depth":539,"links":1219},[1220,1221,1226,1227],{"id":362,"depth":539,"text":363},{"id":414,"depth":539,"text":415,"children":1222},[1223,1224,1225],{"id":492,"depth":571,"text":445},{"id":733,"depth":571,"text":458},{"id":839,"depth":571,"text":474},{"id":1157,"depth":539,"text":1158},{"id":1182,"depth":539,"text":1183},"Comment s'exécutent les écritures, dans quel ordre leurs callbacks sont appelés, et les trois façons de réaligner le cache sur le serveur ensuite.","md",null,{},{"icon":85},{"title":82,"description":1228},"PW3hoqoriCtTCibu5ZBlf4ZALUSmxbvtyPe_oDPYi6k",[1236,1238],{"title":77,"path":78,"stem":79,"description":1237,"icon":80,"children":-1},"Qora fusionne les requêtes concurrentes pour la même clé en un seul appel réseau, quel que soit le nombre d'appelants.",{"title":87,"path":88,"stem":89,"description":1239,"icon":90,"children":-1},"Ce que Qora fait des lectures et des écritures quand l'appareil est hors-ligne, ce qui se passe à la reconnexion, et ce qui survit à un redémarrage.",1794040407011]