[{"data":1,"prerenderedAt":2547},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-recipes-error-handling":342,"-fr-recipes-error-handling-surround":2542},[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":182,"body":344,"description":2535,"extension":2536,"links":2537,"meta":2538,"navigation":2539,"path":183,"seo":2540,"stem":184,"__hash__":2541},"docs_fr/fr/04.recipes/10.error-handling.md",{"type":345,"value":346,"toc":2520},"minimark",[347,356,359,366,375,511,522,867,869,873,878,938,943,987,992,1067,1071,1095,1097,1101,1108,1179,1182,1388,1395,1493,1495,1499,1508,1687,1689,1693,1715,1803,1809,1811,1815,1822,1956,1958,1962,1968,2309,2311,2315,2326,2356,2467,2469,2473,2516],[348,349,350,351,355],"p",{},"Qora distingue les erreurs transitoires (retry automatique) des erreurs terminales (remontées à l'UI). Tous les échecs de fetch passent par le même pipeline : retry avec backoff exponentiel → transition vers ",[352,353,354],"code",{},"Failure"," → notification des abonnés.",[357,358],"hr",{},[360,361,363,364],"h2",{"id":362},"létat-failure","L'état ",[352,365,354],{},[348,367,368,369,371,372,374],{},"Quand tous les retries sont épuisés, ",[352,370,211],{}," transite vers ",[352,373,354],{}," :",[376,377,382],"pre",{"className":378,"code":379,"language":380,"meta":381,"style":381},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sealed class QoraState\u003CT> { ... }\n\nfinal class Failure\u003CT> extends QoraState\u003CT> {\n  final Object error;\n  final StackTrace? stackTrace;\n  final T? previousData; // non-null quand des données étaient en cache avant l'échec\n}\n","dart","",[352,383,384,416,423,454,469,485,505],{"__ignoreMap":381},[385,386,389,393,396,400,404,407,410,413],"span",{"class":387,"line":388},"line",1,[385,390,392],{"class":391},"sMK4o","sealed",[385,394,395],{"class":391}," class",[385,397,399],{"class":398},"sBMFI"," QoraState",[385,401,403],{"class":402},"sTEyZ","\u003C",[385,405,406],{"class":398},"T",[385,408,409],{"class":402},"> { ",[385,411,412],{"class":391},"...",[385,414,415],{"class":402}," }\n",[385,417,419],{"class":387,"line":418},2,[385,420,422],{"emptyLinePlaceholder":421},true,"\n",[385,424,426,430,432,435,437,439,442,445,447,449,451],{"class":387,"line":425},3,[385,427,429],{"class":428},"spNyl","final",[385,431,395],{"class":391},[385,433,434],{"class":398}," Failure",[385,436,403],{"class":402},[385,438,406],{"class":398},[385,440,441],{"class":402},"> ",[385,443,444],{"class":391},"extends",[385,446,399],{"class":398},[385,448,403],{"class":402},[385,450,406],{"class":398},[385,452,453],{"class":402},"> {\n",[385,455,457,460,463,466],{"class":387,"line":456},4,[385,458,459],{"class":428},"  final",[385,461,462],{"class":398}," Object",[385,464,465],{"class":402}," error",[385,467,468],{"class":391},";\n",[385,470,472,474,477,480,483],{"class":387,"line":471},5,[385,473,459],{"class":428},[385,475,476],{"class":398}," StackTrace",[385,478,479],{"class":391},"?",[385,481,482],{"class":402}," stackTrace",[385,484,468],{"class":391},[385,486,488,490,493,495,498,501],{"class":387,"line":487},6,[385,489,459],{"class":428},[385,491,492],{"class":398}," T",[385,494,479],{"class":391},[385,496,497],{"class":402}," previousData",[385,499,500],{"class":391},";",[385,502,504],{"class":503},"sHwdD"," // non-null quand des données étaient en cache avant l'échec\n",[385,506,508],{"class":387,"line":507},7,[385,509,510],{"class":402},"}\n",[348,512,513,516,517,521],{},[352,514,515],{},"previousData"," porte la dernière valeur récupérée avec succès. Cela permet la ",[518,519,520],"strong",{},"dégradation gracieuse"," : afficher des données périmées à côté d'un indicateur d'erreur plutôt que de remplacer toute la vue.",[376,523,526],{"className":378,"code":524,"filename":525,"language":380,"meta":381,"style":381},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  builder: (context, state, fetchStatus) => switch (state) {\n    Initial() => const SizedBox.shrink(),\n    Loading(:final previousData) => previousData != null\n        ? Stack(children: [UserCard(previousData), const LoadingOverlay()])\n        : const CircularProgressIndicator(),\n    Success(:final data) => UserCard(data),\n    Failure(:final error, :final previousData) => previousData != null\n        ? Column(children: [\n            UserCard(previousData),\n            ErrorBanner('Échec du rafraîchissement : $error'),\n          ])\n        : ErrorScreen('$error'),\n  },\n)\n","user_screen.dart",[352,527,528,540,564,592,621,647,673,704,719,744,774,789,799,825,831,853,861],{"__ignoreMap":381},[385,529,530,532,534,537],{"class":387,"line":388},[385,531,108],{"class":398},[385,533,403],{"class":402},[385,535,536],{"class":398},"User",[385,538,539],{"class":402},">(\n",[385,541,542,545,548,551,555,558,561],{"class":387,"line":418},[385,543,544],{"class":402},"  queryKey",[385,546,547],{"class":391},":",[385,549,550],{"class":402}," [",[385,552,554],{"class":553},"sfazB","'users'",[385,556,557],{"class":391},",",[385,559,560],{"class":402}," userId]",[385,562,563],{"class":391},",\n",[385,565,566,569,571,574,577,580,583,587,590],{"class":387,"line":425},[385,567,568],{"class":402},"  fetcher",[385,570,547],{"class":391},[385,572,573],{"class":402}," () ",[385,575,576],{"class":391},"=>",[385,578,579],{"class":402}," api",[385,581,582],{"class":391},".",[385,584,586],{"class":585},"s2Zo4","getUser",[385,588,589],{"class":402},"(userId)",[385,591,563],{"class":391},[385,593,594,597,599,602,604,607,609,612,614,618],{"class":387,"line":456},[385,595,596],{"class":402},"  builder",[385,598,547],{"class":391},[385,600,601],{"class":402}," (context",[385,603,557],{"class":391},[385,605,606],{"class":402}," state",[385,608,557],{"class":391},[385,610,611],{"class":402}," fetchStatus) ",[385,613,576],{"class":391},[385,615,617],{"class":616},"s7zQu"," switch",[385,619,620],{"class":402}," (state) {\n",[385,622,623,626,629,631,634,637,639,642,645],{"class":387,"line":471},[385,624,625],{"class":398},"    Initial",[385,627,628],{"class":402},"() ",[385,630,576],{"class":391},[385,632,633],{"class":428}," const",[385,635,636],{"class":398}," SizedBox",[385,638,582],{"class":391},[385,640,641],{"class":585},"shrink",[385,643,644],{"class":402},"()",[385,646,563],{"class":391},[385,648,649,652,655,657,659,662,664,667,670],{"class":387,"line":487},[385,650,651],{"class":398},"    Loading",[385,653,654],{"class":402},"(",[385,656,547],{"class":391},[385,658,429],{"class":428},[385,660,661],{"class":402}," previousData) ",[385,663,576],{"class":391},[385,665,666],{"class":402}," previousData ",[385,668,669],{"class":391},"!=",[385,671,672],{"class":391}," null\n",[385,674,675,678,681,684,686,688,691,694,696,698,701],{"class":387,"line":507},[385,676,677],{"class":391},"        ?",[385,679,680],{"class":398}," Stack",[385,682,683],{"class":402},"(children",[385,685,547],{"class":391},[385,687,550],{"class":402},[385,689,690],{"class":398},"UserCard",[385,692,693],{"class":402},"(previousData)",[385,695,557],{"class":391},[385,697,633],{"class":428},[385,699,700],{"class":398}," LoadingOverlay",[385,702,703],{"class":402},"()])\n",[385,705,707,710,712,715,717],{"class":387,"line":706},8,[385,708,709],{"class":391},"        :",[385,711,633],{"class":428},[385,713,714],{"class":398}," CircularProgressIndicator",[385,716,644],{"class":402},[385,718,563],{"class":391},[385,720,722,725,727,729,731,734,736,739,742],{"class":387,"line":721},9,[385,723,724],{"class":398},"    Success",[385,726,654],{"class":402},[385,728,547],{"class":391},[385,730,429],{"class":428},[385,732,733],{"class":402}," data) ",[385,735,576],{"class":391},[385,737,738],{"class":398}," UserCard",[385,740,741],{"class":402},"(data)",[385,743,563],{"class":391},[385,745,747,750,752,754,756,758,760,762,764,766,768,770,772],{"class":387,"line":746},10,[385,748,749],{"class":398},"    Failure",[385,751,654],{"class":402},[385,753,547],{"class":391},[385,755,429],{"class":428},[385,757,465],{"class":402},[385,759,557],{"class":391},[385,761,374],{"class":391},[385,763,429],{"class":428},[385,765,661],{"class":402},[385,767,576],{"class":391},[385,769,666],{"class":402},[385,771,669],{"class":391},[385,773,672],{"class":391},[385,775,777,779,782,784,786],{"class":387,"line":776},11,[385,778,677],{"class":391},[385,780,781],{"class":398}," Column",[385,783,683],{"class":402},[385,785,547],{"class":391},[385,787,788],{"class":402}," [\n",[385,790,792,795,797],{"class":387,"line":791},12,[385,793,794],{"class":398},"            UserCard",[385,796,693],{"class":402},[385,798,563],{"class":391},[385,800,802,805,807,810,813,817,820,823],{"class":387,"line":801},13,[385,803,804],{"class":398},"            ErrorBanner",[385,806,654],{"class":402},[385,808,809],{"class":553},"'Échec du rafraîchissement : ",[385,811,812],{"class":402},"$",[385,814,816],{"class":815},"sHdIc","error",[385,818,819],{"class":553},"'",[385,821,822],{"class":402},")",[385,824,563],{"class":391},[385,826,828],{"class":387,"line":827},14,[385,829,830],{"class":402},"          ])\n",[385,832,834,836,839,841,843,845,847,849,851],{"class":387,"line":833},15,[385,835,709],{"class":391},[385,837,838],{"class":398}," ErrorScreen",[385,840,654],{"class":402},[385,842,819],{"class":553},[385,844,812],{"class":402},[385,846,816],{"class":815},[385,848,819],{"class":553},[385,850,822],{"class":402},[385,852,563],{"class":391},[385,854,856,859],{"class":387,"line":855},16,[385,857,858],{"class":402},"  }",[385,860,563],{"class":391},[385,862,864],{"class":387,"line":863},17,[385,865,866],{"class":402},")\n",[357,868],{},[360,870,872],{"id":871},"configuration-du-retry","Configuration du retry",[348,874,875,876,374],{},"Qora relance automatiquement les fetchs échoués avec un backoff exponentiel. Contrôler cela par requête via ",[352,877,215],{},[376,879,882],{"className":378,"code":880,"filename":881,"language":380,"meta":381,"style":381},"QoraOptions(\n  retryCount: 3,                              // Défaut : 3 ; mettre 0 pour désactiver\n  retryDelay: const Duration(seconds: 1),     // Délai de base ; double à chaque tentative\n)\n","main.dart",[352,883,884,891,907,934],{"__ignoreMap":381},[385,885,886,888],{"class":387,"line":388},[385,887,215],{"class":398},[385,889,890],{"class":402},"(\n",[385,892,893,896,898,902,904],{"class":387,"line":418},[385,894,895],{"class":402},"  retryCount",[385,897,547],{"class":391},[385,899,901],{"class":900},"sbssI"," 3",[385,903,557],{"class":391},[385,905,906],{"class":503},"                              // Défaut : 3 ; mettre 0 pour désactiver\n",[385,908,909,912,914,916,919,922,924,927,929,931],{"class":387,"line":425},[385,910,911],{"class":402},"  retryDelay",[385,913,547],{"class":391},[385,915,633],{"class":428},[385,917,918],{"class":398}," Duration",[385,920,921],{"class":402},"(seconds",[385,923,547],{"class":391},[385,925,926],{"class":900}," 1",[385,928,822],{"class":402},[385,930,557],{"class":391},[385,932,933],{"class":503},"     // Délai de base ; double à chaque tentative\n",[385,935,936],{"class":387,"line":456},[385,937,866],{"class":402},[348,939,940],{},[518,941,942],{},"Calendrier de backoff par défaut :",[944,945,946,959],"table",{},[947,948,949],"thead",{},[950,951,952,956],"tr",{},[953,954,955],"th",{},"Tentative",[953,957,958],{},"Délai",[960,961,962,971,979],"tbody",{},[950,963,964,968],{},[965,966,967],"td",{},"1",[965,969,970],{},"1 s",[950,972,973,976],{},[965,974,975],{},"2",[965,977,978],{},"2 s",[950,980,981,984],{},[965,982,983],{},"3",[965,985,986],{},"4 s",[988,989,991],"h3",{"id":990},"délai-personnalisé","Délai personnalisé",[376,993,995],{"className":378,"code":994,"filename":881,"language":380,"meta":381,"style":381},"QoraOptions(\n  retryDelayCalculator: (attempt) => Duration(\n    milliseconds: (500 * pow(2, attempt)).toInt(),\n  ),\n)\n",[352,996,997,1003,1019,1056,1063],{"__ignoreMap":381},[385,998,999,1001],{"class":387,"line":388},[385,1000,215],{"class":398},[385,1002,890],{"class":402},[385,1004,1005,1008,1010,1013,1015,1017],{"class":387,"line":418},[385,1006,1007],{"class":402},"  retryDelayCalculator",[385,1009,547],{"class":391},[385,1011,1012],{"class":402}," (attempt) ",[385,1014,576],{"class":391},[385,1016,918],{"class":398},[385,1018,890],{"class":402},[385,1020,1021,1024,1026,1029,1032,1035,1038,1040,1042,1044,1047,1049,1052,1054],{"class":387,"line":425},[385,1022,1023],{"class":402},"    milliseconds",[385,1025,547],{"class":391},[385,1027,1028],{"class":402}," (",[385,1030,1031],{"class":900},"500",[385,1033,1034],{"class":391}," *",[385,1036,1037],{"class":585}," pow",[385,1039,654],{"class":402},[385,1041,975],{"class":900},[385,1043,557],{"class":391},[385,1045,1046],{"class":402}," attempt))",[385,1048,582],{"class":391},[385,1050,1051],{"class":585},"toInt",[385,1053,644],{"class":402},[385,1055,563],{"class":391},[385,1057,1058,1061],{"class":387,"line":456},[385,1059,1060],{"class":402},"  )",[385,1062,563],{"class":391},[385,1064,1065],{"class":387,"line":471},[385,1066,866],{"class":402},[988,1068,1070],{"id":1069},"désactiver-les-retries","Désactiver les retries",[376,1072,1074],{"className":378,"code":1073,"filename":881,"language":380,"meta":381,"style":381},"// Échec immédiat : ex. pour les mutations ou les requêtes temps réel\nQoraOptions(retryCount: 0)\n",[352,1075,1076,1081],{"__ignoreMap":381},[385,1077,1078],{"class":387,"line":388},[385,1079,1080],{"class":503},"// Échec immédiat : ex. pour les mutations ou les requêtes temps réel\n",[385,1082,1083,1085,1088,1090,1093],{"class":387,"line":418},[385,1084,215],{"class":398},[385,1086,1087],{"class":402},"(retryCount",[385,1089,547],{"class":391},[385,1091,1092],{"class":900}," 0",[385,1094,866],{"class":402},[357,1096],{},[360,1098,1100],{"id":1099},"ignorer-sélectivement-les-retries","Ignorer sélectivement les retries",[348,1102,1103,1104,1107],{},"Pour ignorer les retries pour des types d'erreurs spécifiques (ex. ",[352,1105,1106],{},"401 Unauthorized"," ne doit jamais être retenté) :",[376,1109,1111],{"className":378,"code":1110,"filename":881,"language":380,"meta":381,"style":381},"QoraOptions(\n  retryCount: 3,\n  retryDelayCalculator: (attempt) {\n    // Ne sera pas appelé si retryCount est effectivement 0,\n    // mais la logique de retry peut être conditionnée dans le fetcher lui-même :\n    return Duration(seconds: 1 \u003C\u003C attempt);\n  },\n)\n",[352,1112,1113,1119,1129,1138,1143,1148,1169,1175],{"__ignoreMap":381},[385,1114,1115,1117],{"class":387,"line":388},[385,1116,215],{"class":398},[385,1118,890],{"class":402},[385,1120,1121,1123,1125,1127],{"class":387,"line":418},[385,1122,895],{"class":402},[385,1124,547],{"class":391},[385,1126,901],{"class":900},[385,1128,563],{"class":391},[385,1130,1131,1133,1135],{"class":387,"line":425},[385,1132,1007],{"class":402},[385,1134,547],{"class":391},[385,1136,1137],{"class":402}," (attempt) {\n",[385,1139,1140],{"class":387,"line":456},[385,1141,1142],{"class":503},"    // Ne sera pas appelé si retryCount est effectivement 0,\n",[385,1144,1145],{"class":387,"line":471},[385,1146,1147],{"class":503},"    // mais la logique de retry peut être conditionnée dans le fetcher lui-même :\n",[385,1149,1150,1153,1155,1157,1159,1161,1164,1167],{"class":387,"line":487},[385,1151,1152],{"class":616},"    return",[385,1154,918],{"class":398},[385,1156,921],{"class":402},[385,1158,547],{"class":391},[385,1160,926],{"class":900},[385,1162,1163],{"class":391}," \u003C\u003C",[385,1165,1166],{"class":402}," attempt)",[385,1168,468],{"class":391},[385,1170,1171,1173],{"class":387,"line":507},[385,1172,858],{"class":402},[385,1174,563],{"class":391},[385,1176,1177],{"class":387,"line":706},[385,1178,866],{"class":402},[348,1180,1181],{},"Le pattern recommandé est de lever une exception spécifique et de la capturer dans le fetcher :",[376,1183,1186],{"className":378,"code":1184,"filename":1185,"language":380,"meta":381,"style":381},"Future\u003CUser> getUser(int id) async {\n  final response = await http.get(Uri.parse('/users/$id'));\n  if (response.statusCode == 401) throw const UnauthorizedException();\n  if (response.statusCode == 404) throw const NotFoundException();\n  if (response.statusCode != 200) throw HttpException(response.statusCode);\n  return User.fromJson(jsonDecode(response.body));\n}\n","user_api.dart",[352,1187,1188,1215,1263,1297,1325,1357,1384],{"__ignoreMap":381},[385,1189,1190,1193,1195,1197,1199,1201,1203,1206,1209,1212],{"class":387,"line":388},[385,1191,1192],{"class":398},"Future",[385,1194,403],{"class":402},[385,1196,536],{"class":398},[385,1198,441],{"class":402},[385,1200,586],{"class":585},[385,1202,654],{"class":402},[385,1204,1205],{"class":398},"int",[385,1207,1208],{"class":402}," id) ",[385,1210,1211],{"class":616},"async",[385,1213,1214],{"class":402}," {\n",[385,1216,1217,1219,1222,1225,1228,1231,1233,1236,1238,1241,1243,1246,1248,1251,1253,1256,1258,1261],{"class":387,"line":418},[385,1218,459],{"class":428},[385,1220,1221],{"class":402}," response ",[385,1223,1224],{"class":391},"=",[385,1226,1227],{"class":616}," await",[385,1229,1230],{"class":402}," http",[385,1232,582],{"class":391},[385,1234,1235],{"class":585},"get",[385,1237,654],{"class":402},[385,1239,1240],{"class":398},"Uri",[385,1242,582],{"class":391},[385,1244,1245],{"class":585},"parse",[385,1247,654],{"class":402},[385,1249,1250],{"class":553},"'/users/",[385,1252,812],{"class":402},[385,1254,1255],{"class":815},"id",[385,1257,819],{"class":553},[385,1259,1260],{"class":402},"))",[385,1262,468],{"class":391},[385,1264,1265,1268,1271,1273,1276,1279,1282,1285,1288,1290,1293,1295],{"class":387,"line":425},[385,1266,1267],{"class":616},"  if",[385,1269,1270],{"class":402}," (response",[385,1272,582],{"class":391},[385,1274,1275],{"class":402},"statusCode ",[385,1277,1278],{"class":391},"==",[385,1280,1281],{"class":900}," 401",[385,1283,1284],{"class":402},") ",[385,1286,1287],{"class":616},"throw",[385,1289,633],{"class":428},[385,1291,1292],{"class":398}," UnauthorizedException",[385,1294,644],{"class":402},[385,1296,468],{"class":391},[385,1298,1299,1301,1303,1305,1307,1309,1312,1314,1316,1318,1321,1323],{"class":387,"line":456},[385,1300,1267],{"class":616},[385,1302,1270],{"class":402},[385,1304,582],{"class":391},[385,1306,1275],{"class":402},[385,1308,1278],{"class":391},[385,1310,1311],{"class":900}," 404",[385,1313,1284],{"class":402},[385,1315,1287],{"class":616},[385,1317,633],{"class":428},[385,1319,1320],{"class":398}," NotFoundException",[385,1322,644],{"class":402},[385,1324,468],{"class":391},[385,1326,1327,1329,1331,1333,1335,1337,1340,1342,1344,1347,1350,1352,1355],{"class":387,"line":471},[385,1328,1267],{"class":616},[385,1330,1270],{"class":402},[385,1332,582],{"class":391},[385,1334,1275],{"class":402},[385,1336,669],{"class":391},[385,1338,1339],{"class":900}," 200",[385,1341,1284],{"class":402},[385,1343,1287],{"class":616},[385,1345,1346],{"class":398}," HttpException",[385,1348,1349],{"class":402},"(response",[385,1351,582],{"class":391},[385,1353,1354],{"class":402},"statusCode)",[385,1356,468],{"class":391},[385,1358,1359,1362,1365,1367,1370,1372,1375,1377,1379,1382],{"class":387,"line":487},[385,1360,1361],{"class":616},"  return",[385,1363,1364],{"class":398}," User",[385,1366,582],{"class":391},[385,1368,1369],{"class":585},"fromJson",[385,1371,654],{"class":402},[385,1373,1374],{"class":585},"jsonDecode",[385,1376,1349],{"class":402},[385,1378,582],{"class":391},[385,1380,1381],{"class":402},"body))",[385,1383,468],{"class":391},[385,1385,1386],{"class":387,"line":507},[385,1387,510],{"class":402},[348,1389,1390,1391,1394],{},"Puis dans ",[352,1392,1393],{},"QoraClientConfig.errorMapper",", normaliser les erreurs avant qu'elles atteignent le moteur de retry :",[376,1396,1398],{"className":378,"code":1397,"filename":881,"language":380,"meta":381,"style":381},"QoraClientConfig(\n  errorMapper: (error, stack) {\n    if (error is UnauthorizedException) return error; // Ne pas envelopper : laisser remonter\n    return QoraException('$error', originalError: error, stackTrace: stack);\n  },\n)\n",[352,1399,1400,1406,1421,1446,1483,1489],{"__ignoreMap":381},[385,1401,1402,1404],{"class":387,"line":388},[385,1403,220],{"class":398},[385,1405,890],{"class":402},[385,1407,1408,1411,1413,1416,1418],{"class":387,"line":418},[385,1409,1410],{"class":402},"  errorMapper",[385,1412,547],{"class":391},[385,1414,1415],{"class":402}," (error",[385,1417,557],{"class":391},[385,1419,1420],{"class":402}," stack) {\n",[385,1422,1423,1426,1429,1432,1434,1436,1439,1441,1443],{"class":387,"line":425},[385,1424,1425],{"class":616},"    if",[385,1427,1428],{"class":402}," (error ",[385,1430,1431],{"class":391},"is",[385,1433,1292],{"class":398},[385,1435,1284],{"class":402},[385,1437,1438],{"class":616},"return",[385,1440,465],{"class":402},[385,1442,500],{"class":391},[385,1444,1445],{"class":503}," // Ne pas envelopper : laisser remonter\n",[385,1447,1448,1450,1453,1455,1457,1459,1461,1463,1465,1468,1470,1472,1474,1476,1478,1481],{"class":387,"line":456},[385,1449,1152],{"class":616},[385,1451,1452],{"class":398}," QoraException",[385,1454,654],{"class":402},[385,1456,819],{"class":553},[385,1458,812],{"class":402},[385,1460,816],{"class":815},[385,1462,819],{"class":553},[385,1464,557],{"class":391},[385,1466,1467],{"class":402}," originalError",[385,1469,547],{"class":391},[385,1471,465],{"class":402},[385,1473,557],{"class":391},[385,1475,482],{"class":402},[385,1477,547],{"class":391},[385,1479,1480],{"class":402}," stack)",[385,1482,468],{"class":391},[385,1484,1485,1487],{"class":387,"line":471},[385,1486,858],{"class":402},[385,1488,563],{"class":391},[385,1490,1491],{"class":387,"line":487},[385,1492,866],{"class":402},[357,1494],{},[360,1496,1498],{"id":1497},"gestion-globale-des-erreurs","Gestion globale des erreurs",[348,1500,1501,1502,1504,1505,374],{},"Utiliser ",[352,1503,1393],{}," pour normaliser toutes les erreurs en un seul type avant qu'elles remontent dans ",[352,1506,1507],{},"Failure.error",[376,1509,1511],{"className":378,"code":1510,"filename":881,"language":380,"meta":381,"style":381},"final client = QoraClient(\n  config: QoraClientConfig(\n    errorMapper: (error, stackTrace) {\n      if (error is DioException) {\n        return switch (error.type) {\n          DioExceptionType.connectionTimeout => const NetworkTimeoutError(),\n          DioExceptionType.receiveTimeout => const NetworkTimeoutError(),\n          _ => ApiError(error.response?.statusCode),\n        };\n      }\n      return error;\n    },\n  ),\n);\n",[352,1512,1513,1527,1539,1553,1568,1582,1603,1622,1647,1654,1659,1668,1675,1681],{"__ignoreMap":381},[385,1514,1515,1517,1520,1522,1525],{"class":387,"line":388},[385,1516,429],{"class":428},[385,1518,1519],{"class":402}," client ",[385,1521,1224],{"class":391},[385,1523,1524],{"class":398}," QoraClient",[385,1526,890],{"class":402},[385,1528,1529,1532,1534,1537],{"class":387,"line":418},[385,1530,1531],{"class":402},"  config",[385,1533,547],{"class":391},[385,1535,1536],{"class":398}," QoraClientConfig",[385,1538,890],{"class":402},[385,1540,1541,1544,1546,1548,1550],{"class":387,"line":425},[385,1542,1543],{"class":402},"    errorMapper",[385,1545,547],{"class":391},[385,1547,1415],{"class":402},[385,1549,557],{"class":391},[385,1551,1552],{"class":402}," stackTrace) {\n",[385,1554,1555,1558,1560,1562,1565],{"class":387,"line":456},[385,1556,1557],{"class":616},"      if",[385,1559,1428],{"class":402},[385,1561,1431],{"class":391},[385,1563,1564],{"class":398}," DioException",[385,1566,1567],{"class":402},") {\n",[385,1569,1570,1573,1575,1577,1579],{"class":387,"line":471},[385,1571,1572],{"class":616},"        return",[385,1574,617],{"class":616},[385,1576,1415],{"class":402},[385,1578,582],{"class":391},[385,1580,1581],{"class":402},"type) {\n",[385,1583,1584,1587,1589,1592,1594,1596,1599,1601],{"class":387,"line":487},[385,1585,1586],{"class":398},"          DioExceptionType",[385,1588,582],{"class":391},[385,1590,1591],{"class":402},"connectionTimeout ",[385,1593,576],{"class":391},[385,1595,633],{"class":428},[385,1597,1598],{"class":398}," NetworkTimeoutError",[385,1600,644],{"class":402},[385,1602,563],{"class":391},[385,1604,1605,1607,1609,1612,1614,1616,1618,1620],{"class":387,"line":507},[385,1606,1586],{"class":398},[385,1608,582],{"class":391},[385,1610,1611],{"class":402},"receiveTimeout ",[385,1613,576],{"class":391},[385,1615,633],{"class":428},[385,1617,1598],{"class":398},[385,1619,644],{"class":402},[385,1621,563],{"class":391},[385,1623,1624,1627,1629,1632,1635,1637,1640,1643,1645],{"class":387,"line":706},[385,1625,1626],{"class":402},"          _ ",[385,1628,576],{"class":391},[385,1630,1631],{"class":398}," ApiError",[385,1633,1634],{"class":402},"(error",[385,1636,582],{"class":391},[385,1638,1639],{"class":402},"response",[385,1641,1642],{"class":391},"?.",[385,1644,1354],{"class":402},[385,1646,563],{"class":391},[385,1648,1649,1652],{"class":387,"line":721},[385,1650,1651],{"class":402},"        }",[385,1653,468],{"class":391},[385,1655,1656],{"class":387,"line":746},[385,1657,1658],{"class":402},"      }\n",[385,1660,1661,1664,1666],{"class":387,"line":776},[385,1662,1663],{"class":616},"      return",[385,1665,465],{"class":402},[385,1667,468],{"class":391},[385,1669,1670,1673],{"class":387,"line":791},[385,1671,1672],{"class":402},"    }",[385,1674,563],{"class":391},[385,1676,1677,1679],{"class":387,"line":801},[385,1678,1060],{"class":402},[385,1680,563],{"class":391},[385,1682,1683,1685],{"class":387,"line":827},[385,1684,822],{"class":402},[385,1686,468],{"class":391},[357,1688],{},[360,1690,1692],{"id":1691},"erreurs-de-fetch-en-arrière-plan","Erreurs de fetch en arrière-plan",[348,1694,1695,1696,1699,1700,1703,1704,1706,1707,1710,1711,1714],{},"Quand vous utilisez ",[352,1697,1698],{},"watchQuery",", les fetchs en arrière-plan s'exécutent dans des futures ",[352,1701,1702],{},"unawaited",". Si le fetch échoue, l'erreur est stockée dans l'état ",[352,1705,354],{},", mais l'exception relancée ferait crasher la ",[352,1708,1709],{},"Zone"," asynchrone courante. Utilisez ",[352,1712,1713],{},"QoraClientConfig.onBackgroundFetchError"," pour intercepter ces erreurs en toute sécurité pour la journalisation ou le rapport de crash :",[376,1716,1719],{"className":378,"code":1717,"filename":1718,"language":380,"meta":381,"style":381},"final client = QoraClient(\n  config: QoraClientConfig(\n    onBackgroundFetchError: (error, stackTrace, key) {\n      // L'erreur est déjà stockée dans l'état Failure, utiliser pour le reporting\n      crashReporter.record(error, stackTrace);\n    },\n  ),\n);\n","lib/core/qora.dart",[352,1720,1721,1733,1743,1761,1766,1785,1791,1797],{"__ignoreMap":381},[385,1722,1723,1725,1727,1729,1731],{"class":387,"line":388},[385,1724,429],{"class":428},[385,1726,1519],{"class":402},[385,1728,1224],{"class":391},[385,1730,1524],{"class":398},[385,1732,890],{"class":402},[385,1734,1735,1737,1739,1741],{"class":387,"line":418},[385,1736,1531],{"class":402},[385,1738,547],{"class":391},[385,1740,1536],{"class":398},[385,1742,890],{"class":402},[385,1744,1745,1748,1750,1752,1754,1756,1758],{"class":387,"line":425},[385,1746,1747],{"class":402},"    onBackgroundFetchError",[385,1749,547],{"class":391},[385,1751,1415],{"class":402},[385,1753,557],{"class":391},[385,1755,482],{"class":402},[385,1757,557],{"class":391},[385,1759,1760],{"class":402}," key) {\n",[385,1762,1763],{"class":387,"line":456},[385,1764,1765],{"class":503},"      // L'erreur est déjà stockée dans l'état Failure, utiliser pour le reporting\n",[385,1767,1768,1771,1773,1776,1778,1780,1783],{"class":387,"line":471},[385,1769,1770],{"class":402},"      crashReporter",[385,1772,582],{"class":391},[385,1774,1775],{"class":585},"record",[385,1777,1634],{"class":402},[385,1779,557],{"class":391},[385,1781,1782],{"class":402}," stackTrace)",[385,1784,468],{"class":391},[385,1786,1787,1789],{"class":387,"line":487},[385,1788,1672],{"class":402},[385,1790,563],{"class":391},[385,1792,1793,1795],{"class":387,"line":507},[385,1794,1060],{"class":402},[385,1796,563],{"class":391},[385,1798,1799,1801],{"class":387,"line":706},[385,1800,822],{"class":402},[385,1802,468],{"class":391},[348,1804,1805,1806,1808],{},"Le callback reçoit l'erreur, la stack trace et la clé de requête normalisée. L'erreur a déjà été stockée dans l'état ",[352,1807,354],{}," de la requête, ce callback est uniquement pour l'observabilité.",[357,1810],{},[360,1812,1814],{"id":1813},"observation-des-erreurs-par-tracker","Observation des erreurs par tracker",[348,1816,1817,1818,1821],{},"Implémenter ",[352,1819,1820],{},"QoraTracker.onQueryFetchFailed"," pour observer toutes les erreurs de requête globalement : utile pour le rapport de crash ou l'analytics :",[376,1823,1826],{"className":378,"code":1824,"filename":1825,"language":380,"meta":381,"style":381},"class AnalyticsTracker extends NoOpTracker {\n  @override\n  void onQueryFetchFailed(String key, Object error, StackTrace stackTrace) {\n    Sentry.captureException(error, stackTrace: stackTrace);\n    analytics.track('query_error', {'key': key, 'error': '$error'});\n  }\n}\n","analytics_tracker.dart",[352,1827,1828,1844,1849,1877,1899,1947,1952],{"__ignoreMap":381},[385,1829,1830,1833,1836,1839,1842],{"class":387,"line":388},[385,1831,1832],{"class":391},"class",[385,1834,1835],{"class":398}," AnalyticsTracker",[385,1837,1838],{"class":391}," extends",[385,1840,1841],{"class":398}," NoOpTracker",[385,1843,1214],{"class":402},[385,1845,1846],{"class":387,"line":418},[385,1847,1848],{"class":428},"  @override\n",[385,1850,1851,1854,1857,1859,1862,1865,1867,1869,1871,1873,1875],{"class":387,"line":425},[385,1852,1853],{"class":428},"  void",[385,1855,1856],{"class":585}," onQueryFetchFailed",[385,1858,654],{"class":402},[385,1860,1861],{"class":398},"String",[385,1863,1864],{"class":402}," key",[385,1866,557],{"class":391},[385,1868,462],{"class":398},[385,1870,465],{"class":402},[385,1872,557],{"class":391},[385,1874,476],{"class":398},[385,1876,1552],{"class":402},[385,1878,1879,1882,1884,1887,1889,1891,1893,1895,1897],{"class":387,"line":456},[385,1880,1881],{"class":398},"    Sentry",[385,1883,582],{"class":391},[385,1885,1886],{"class":585},"captureException",[385,1888,1634],{"class":402},[385,1890,557],{"class":391},[385,1892,482],{"class":402},[385,1894,547],{"class":391},[385,1896,1782],{"class":402},[385,1898,468],{"class":391},[385,1900,1901,1904,1906,1909,1911,1914,1916,1919,1922,1924,1926,1928,1931,1933,1936,1938,1940,1942,1945],{"class":387,"line":471},[385,1902,1903],{"class":402},"    analytics",[385,1905,582],{"class":391},[385,1907,1908],{"class":585},"track",[385,1910,654],{"class":402},[385,1912,1913],{"class":553},"'query_error'",[385,1915,557],{"class":391},[385,1917,1918],{"class":402}," {",[385,1920,1921],{"class":553},"'key'",[385,1923,547],{"class":391},[385,1925,1864],{"class":402},[385,1927,557],{"class":391},[385,1929,1930],{"class":553}," 'error'",[385,1932,547],{"class":391},[385,1934,1935],{"class":553}," '",[385,1937,812],{"class":402},[385,1939,816],{"class":815},[385,1941,819],{"class":553},[385,1943,1944],{"class":402},"})",[385,1946,468],{"class":391},[385,1948,1949],{"class":387,"line":487},[385,1950,1951],{"class":402},"  }\n",[385,1953,1954],{"class":387,"line":507},[385,1955,510],{"class":402},[357,1957],{},[360,1959,1961],{"id":1960},"erreurs-de-mutation","Erreurs de mutation",[348,1963,1964,1965,374],{},"Les erreurs de mutation sont exposées sur ",[352,1966,1967],{},"MutationFailure",[376,1969,1971],{"className":378,"code":1970,"filename":881,"language":380,"meta":381,"style":381},"QoraMutationBuilder\u003CUser, UpdatePayload, User?>(\n  mutator: (payload) => api.updateUser(payload),\n  options: MutationOptions(\n    onMutate: (payload) async =>\n        QoraScope.of(context).getQueryData\u003CUser>(['users', userId]),\n    onError: (error, payload, snapshot) async {\n      if (snapshot != null) {\n        QoraScope.of(context).restoreQueryData(['users', userId], snapshot);\n      }\n    },\n    onSettled: (_, _, _, _) async =>\n        QoraScope.of(context).invalidate(['users', userId]),\n  ),\n  builder: (context, state, mutate) => switch (state) {\n    MutationFailure(:final error) => ErrorBanner('$error'),\n    _ => UpdateButton(onTap: () => mutate(payload)),\n  },\n)\n",[352,1972,1973,1994,2018,2030,2044,2078,2101,2115,2146,2150,2156,2184,2209,2215,2238,2271,2298,2304],{"__ignoreMap":381},[385,1974,1975,1977,1979,1981,1984,1987,1989,1991],{"class":387,"line":388},[385,1976,113],{"class":398},[385,1978,403],{"class":402},[385,1980,536],{"class":398},[385,1982,1983],{"class":402},", ",[385,1985,1986],{"class":398},"UpdatePayload",[385,1988,1983],{"class":402},[385,1990,536],{"class":398},[385,1992,1993],{"class":402},"?>(\n",[385,1995,1996,1999,2001,2004,2006,2008,2010,2013,2016],{"class":387,"line":418},[385,1997,1998],{"class":402},"  mutator",[385,2000,547],{"class":391},[385,2002,2003],{"class":402}," (payload) ",[385,2005,576],{"class":391},[385,2007,579],{"class":402},[385,2009,582],{"class":391},[385,2011,2012],{"class":585},"updateUser",[385,2014,2015],{"class":402},"(payload)",[385,2017,563],{"class":391},[385,2019,2020,2023,2025,2028],{"class":387,"line":425},[385,2021,2022],{"class":402},"  options",[385,2024,547],{"class":391},[385,2026,2027],{"class":398}," MutationOptions",[385,2029,890],{"class":402},[385,2031,2032,2035,2037,2039,2041],{"class":387,"line":456},[385,2033,2034],{"class":402},"    onMutate",[385,2036,547],{"class":391},[385,2038,2003],{"class":402},[385,2040,1211],{"class":616},[385,2042,2043],{"class":391}," =>\n",[385,2045,2046,2049,2051,2054,2057,2059,2062,2064,2066,2069,2071,2073,2076],{"class":387,"line":471},[385,2047,2048],{"class":398},"        QoraScope",[385,2050,582],{"class":391},[385,2052,2053],{"class":585},"of",[385,2055,2056],{"class":402},"(context)",[385,2058,582],{"class":391},[385,2060,2061],{"class":585},"getQueryData",[385,2063,403],{"class":402},[385,2065,536],{"class":398},[385,2067,2068],{"class":402},">([",[385,2070,554],{"class":553},[385,2072,557],{"class":391},[385,2074,2075],{"class":402}," userId])",[385,2077,563],{"class":391},[385,2079,2080,2083,2085,2087,2089,2092,2094,2097,2099],{"class":387,"line":487},[385,2081,2082],{"class":402},"    onError",[385,2084,547],{"class":391},[385,2086,1415],{"class":402},[385,2088,557],{"class":391},[385,2090,2091],{"class":402}," payload",[385,2093,557],{"class":391},[385,2095,2096],{"class":402}," snapshot) ",[385,2098,1211],{"class":616},[385,2100,1214],{"class":402},[385,2102,2103,2105,2108,2110,2113],{"class":387,"line":507},[385,2104,1557],{"class":616},[385,2106,2107],{"class":402}," (snapshot ",[385,2109,669],{"class":391},[385,2111,2112],{"class":391}," null",[385,2114,1567],{"class":402},[385,2116,2117,2119,2121,2123,2125,2127,2130,2133,2135,2137,2139,2141,2144],{"class":387,"line":706},[385,2118,2048],{"class":398},[385,2120,582],{"class":391},[385,2122,2053],{"class":585},[385,2124,2056],{"class":402},[385,2126,582],{"class":391},[385,2128,2129],{"class":585},"restoreQueryData",[385,2131,2132],{"class":402},"([",[385,2134,554],{"class":553},[385,2136,557],{"class":391},[385,2138,560],{"class":402},[385,2140,557],{"class":391},[385,2142,2143],{"class":402}," snapshot)",[385,2145,468],{"class":391},[385,2147,2148],{"class":387,"line":721},[385,2149,1658],{"class":402},[385,2151,2152,2154],{"class":387,"line":746},[385,2153,1672],{"class":402},[385,2155,563],{"class":391},[385,2157,2158,2161,2163,2166,2168,2171,2173,2175,2177,2180,2182],{"class":387,"line":776},[385,2159,2160],{"class":402},"    onSettled",[385,2162,547],{"class":391},[385,2164,2165],{"class":402}," (_",[385,2167,557],{"class":391},[385,2169,2170],{"class":402}," _",[385,2172,557],{"class":391},[385,2174,2170],{"class":402},[385,2176,557],{"class":391},[385,2178,2179],{"class":402}," _) ",[385,2181,1211],{"class":616},[385,2183,2043],{"class":391},[385,2185,2186,2188,2190,2192,2194,2196,2199,2201,2203,2205,2207],{"class":387,"line":791},[385,2187,2048],{"class":398},[385,2189,582],{"class":391},[385,2191,2053],{"class":585},[385,2193,2056],{"class":402},[385,2195,582],{"class":391},[385,2197,2198],{"class":585},"invalidate",[385,2200,2132],{"class":402},[385,2202,554],{"class":553},[385,2204,557],{"class":391},[385,2206,2075],{"class":402},[385,2208,563],{"class":391},[385,2210,2211,2213],{"class":387,"line":801},[385,2212,1060],{"class":402},[385,2214,563],{"class":391},[385,2216,2217,2219,2221,2223,2225,2227,2229,2232,2234,2236],{"class":387,"line":827},[385,2218,596],{"class":402},[385,2220,547],{"class":391},[385,2222,601],{"class":402},[385,2224,557],{"class":391},[385,2226,606],{"class":402},[385,2228,557],{"class":391},[385,2230,2231],{"class":402}," mutate) ",[385,2233,576],{"class":391},[385,2235,617],{"class":616},[385,2237,620],{"class":402},[385,2239,2240,2243,2245,2247,2249,2252,2254,2257,2259,2261,2263,2265,2267,2269],{"class":387,"line":833},[385,2241,2242],{"class":398},"    MutationFailure",[385,2244,654],{"class":402},[385,2246,547],{"class":391},[385,2248,429],{"class":428},[385,2250,2251],{"class":402}," error) ",[385,2253,576],{"class":391},[385,2255,2256],{"class":398}," ErrorBanner",[385,2258,654],{"class":402},[385,2260,819],{"class":553},[385,2262,812],{"class":402},[385,2264,816],{"class":815},[385,2266,819],{"class":553},[385,2268,822],{"class":402},[385,2270,563],{"class":391},[385,2272,2273,2276,2278,2281,2284,2286,2288,2290,2293,2296],{"class":387,"line":855},[385,2274,2275],{"class":402},"    _ ",[385,2277,576],{"class":391},[385,2279,2280],{"class":398}," UpdateButton",[385,2282,2283],{"class":402},"(onTap",[385,2285,547],{"class":391},[385,2287,573],{"class":402},[385,2289,576],{"class":391},[385,2291,2292],{"class":585}," mutate",[385,2294,2295],{"class":402},"(payload))",[385,2297,563],{"class":391},[385,2299,2300,2302],{"class":387,"line":863},[385,2301,858],{"class":402},[385,2303,563],{"class":391},[385,2305,2307],{"class":387,"line":2306},18,[385,2308,866],{"class":402},[357,2310],{},[360,2312,2314],{"id":2313},"erreurs-hors-ligne","Erreurs hors-ligne",[348,2316,2317,2318,2321,2322,2325],{},"Quand ",[352,2319,2320],{},"networkMode"," est ",[352,2323,2324],{},"NetworkMode.online"," (défaut) et que l'appareil est hors-ligne :",[2327,2328,2329,2340,2353],"ul",{},[2330,2331,2332,2335,2336,2339],"li",{},[352,2333,2334],{},"fetchQuery"," lève ",[352,2337,2338],{},"QoraOfflineException"," si aucune donnée en cache n'existe.",[2330,2341,2342,2344,2345,2348,2349,2352],{},[352,2343,1698],{}," émet ",[352,2346,2347],{},"FetchStatus.paused"," : l'état reste à ",[352,2350,2351],{},"Loading(previousData: ...)"," si des données ont été précédemment mises en cache.",[2330,2354,2355],{},"Le fetch est rejoué automatiquement quand la connectivité est restaurée.",[376,2357,2359],{"className":378,"code":2358,"filename":881,"language":380,"meta":381,"style":381},"try {\n  final data = await client.fetchQuery\u003CUser>(\n    key: ['users', userId],\n    fetcher: () => api.getUser(userId),\n  );\n} on QoraOfflineException {\n  showSnackBar('Pas de connexion internet');\n}\n",[352,2360,2361,2368,2392,2409,2430,2436,2449,2463],{"__ignoreMap":381},[385,2362,2363,2366],{"class":387,"line":388},[385,2364,2365],{"class":616},"try",[385,2367,1214],{"class":402},[385,2369,2370,2372,2375,2377,2379,2382,2384,2386,2388,2390],{"class":387,"line":418},[385,2371,459],{"class":428},[385,2373,2374],{"class":402}," data ",[385,2376,1224],{"class":391},[385,2378,1227],{"class":616},[385,2380,2381],{"class":402}," client",[385,2383,582],{"class":391},[385,2385,2334],{"class":585},[385,2387,403],{"class":402},[385,2389,536],{"class":398},[385,2391,539],{"class":402},[385,2393,2394,2397,2399,2401,2403,2405,2407],{"class":387,"line":425},[385,2395,2396],{"class":402},"    key",[385,2398,547],{"class":391},[385,2400,550],{"class":402},[385,2402,554],{"class":553},[385,2404,557],{"class":391},[385,2406,560],{"class":402},[385,2408,563],{"class":391},[385,2410,2411,2414,2416,2418,2420,2422,2424,2426,2428],{"class":387,"line":456},[385,2412,2413],{"class":402},"    fetcher",[385,2415,547],{"class":391},[385,2417,573],{"class":402},[385,2419,576],{"class":391},[385,2421,579],{"class":402},[385,2423,582],{"class":391},[385,2425,586],{"class":585},[385,2427,589],{"class":402},[385,2429,563],{"class":391},[385,2431,2432,2434],{"class":387,"line":471},[385,2433,1060],{"class":402},[385,2435,468],{"class":391},[385,2437,2438,2441,2444,2447],{"class":387,"line":487},[385,2439,2440],{"class":402},"} ",[385,2442,2443],{"class":616},"on",[385,2445,2446],{"class":398}," QoraOfflineException",[385,2448,1214],{"class":402},[385,2450,2451,2454,2456,2459,2461],{"class":387,"line":507},[385,2452,2453],{"class":585},"  showSnackBar",[385,2455,654],{"class":402},[385,2457,2458],{"class":553},"'Pas de connexion internet'",[385,2460,822],{"class":402},[385,2462,468],{"class":391},[385,2464,2465],{"class":387,"line":706},[385,2466,510],{"class":402},[357,2468],{},[360,2470,2472],{"id":2471},"voir-aussi","Voir aussi",[2327,2474,2475,2493,2506],{},[2330,2476,2477,2481,2482,1983,2485,1983,2488,1983,2491],{},[2478,2479,215],"a",{"href":2480},"../api-reference/qora-options"," : ",[352,2483,2484],{},"retryCount",[352,2486,2487],{},"retryDelay",[352,2489,2490],{},"retryDelayCalculator",[352,2492,2320],{},[2330,2494,2495,2499,2500,1983,2503],{},[2478,2496,2498],{"href":2497},"./network-aware","Requêtes réseau adaptatives"," : comportement hors-ligne, ",[352,2501,2502],{},"NetworkMode",[352,2504,2505],{},"FetchStatus",[2330,2507,2508,2481,2512,2515],{},[2478,2509,2511],{"href":2510},"./mutations","Guide des mutations",[352,2513,2514],{},"onError",", rollback",[2517,2518,2519],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":381,"searchDepth":418,"depth":418,"links":2521},[2522,2524,2528,2529,2530,2531,2532,2533,2534],{"id":362,"depth":418,"text":2523},"L'état Failure",{"id":871,"depth":418,"text":872,"children":2525},[2526,2527],{"id":990,"depth":425,"text":991},{"id":1069,"depth":425,"text":1070},{"id":1099,"depth":418,"text":1100},{"id":1497,"depth":418,"text":1498},{"id":1691,"depth":418,"text":1692},{"id":1813,"depth":418,"text":1814},{"id":1960,"depth":418,"text":1961},{"id":2313,"depth":418,"text":2314},{"id":2471,"depth":418,"text":2472},"Comprendre comment Qora remonte les erreurs, configure le comportement de retry et active la dégradation gracieuse avec previousData.","md",null,{},{"icon":185},{"title":182,"description":2535},"OXTRBX-oHqj7ac6bM99SzQUyB6CHSXJUSCrCwmO_em4",[2543,2545],{"title":177,"path":178,"stem":179,"description":2544,"icon":180,"children":-1},"Éliminer le flash de chargement sur les pages Flutter Web rendues côté serveur en injectant le cache serveur dans QoraClient via SsrHydrator.",{"title":187,"path":188,"stem":189,"description":2546,"icon":190,"children":-1},"Tester les requêtes, mutations et widgets Qora avec des helpers déterministes : pas de réseau, pas de Hive, pas de timers.",1794040408917]