[{"data":1,"prerenderedAt":4650},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-core-concepts-query-states":342,"-fr-core-concepts-query-states-surround":4645},[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":62,"body":344,"description":4638,"extension":4639,"links":4640,"meta":4641,"navigation":4642,"path":63,"seo":4643,"stem":64,"__hash__":4644},"docs_fr/fr/02.core-concepts/3.query-states.md",{"type":345,"value":346,"toc":4607},"minimark",[347,351,355,655,667,670,674,682,687,713,715,719,723,997,1004,1014,1122,1129,1142,1213,1215,1221,1224,1336,1339,1341,1346,1352,1423,1579,1584,1648,1650,1656,1666,1765,1863,1867,1930,1932,1937,1943,2111,2162,2172,2174,2178,2188,2192,2245,2249,2338,2342,2591,2595,2768,2770,2774,2787,3118,3120,3124,3130,3418,3420,3423,4308,4310,4313,4317,4494,4498,4575,4577,4581,4603],[348,349,243],"h2",{"id":350},"vue-densemble",[352,353,354],"p",{},"Toute requête dans Qora se trouve à chaque instant dans l'un des quatre états suivants :",[356,357,363],"pre",{"className":358,"code":359,"filename":360,"language":361,"meta":362,"style":362},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sealed class QoraState\u003CT> { ... }\n\n// La requête n'a pas encore démarré\nfinal class Initial\u003CT> extends QoraState\u003CT> {}\n\n// Fetch actif (avec données périmées optionnelles)\nfinal class Loading\u003CT> extends QoraState\u003CT> {\n  final T? previousData;\n}\n\n// Données récupérées avec succès\nfinal class Success\u003CT> extends QoraState\u003CT> {\n  final T data;\n  final DateTime updatedAt;\n}\n\n// Fetch échoué (avec données périmées optionnelles pour la dégradation gracieuse)\nfinal class Failure\u003CT> extends QoraState\u003CT> {\n  final Object error;\n  final StackTrace? stackTrace;\n  final T? previousData;\n}\n","lib/src/state/qora_state.dart","dart","",[364,365,366,398,405,412,443,448,454,481,499,505,510,516,542,554,567,572,577,583,609,622,637,650],"code",{"__ignoreMap":362},[367,368,371,375,378,382,386,389,392,395],"span",{"class":369,"line":370},"line",1,[367,372,374],{"class":373},"sMK4o","sealed",[367,376,377],{"class":373}," class",[367,379,381],{"class":380},"sBMFI"," QoraState",[367,383,385],{"class":384},"sTEyZ","\u003C",[367,387,388],{"class":380},"T",[367,390,391],{"class":384},"> { ",[367,393,394],{"class":373},"...",[367,396,397],{"class":384}," }\n",[367,399,401],{"class":369,"line":400},2,[367,402,404],{"emptyLinePlaceholder":403},true,"\n",[367,406,408],{"class":369,"line":407},3,[367,409,411],{"class":410},"sHwdD","// La requête n'a pas encore démarré\n",[367,413,415,419,421,424,426,428,431,434,436,438,440],{"class":369,"line":414},4,[367,416,418],{"class":417},"spNyl","final",[367,420,377],{"class":373},[367,422,423],{"class":380}," Initial",[367,425,385],{"class":384},[367,427,388],{"class":380},[367,429,430],{"class":384},"> ",[367,432,433],{"class":373},"extends",[367,435,381],{"class":380},[367,437,385],{"class":384},[367,439,388],{"class":380},[367,441,442],{"class":384},"> {}\n",[367,444,446],{"class":369,"line":445},5,[367,447,404],{"emptyLinePlaceholder":403},[367,449,451],{"class":369,"line":450},6,[367,452,453],{"class":410},"// Fetch actif (avec données périmées optionnelles)\n",[367,455,457,459,461,464,466,468,470,472,474,476,478],{"class":369,"line":456},7,[367,458,418],{"class":417},[367,460,377],{"class":373},[367,462,463],{"class":380}," Loading",[367,465,385],{"class":384},[367,467,388],{"class":380},[367,469,430],{"class":384},[367,471,433],{"class":373},[367,473,381],{"class":380},[367,475,385],{"class":384},[367,477,388],{"class":380},[367,479,480],{"class":384},"> {\n",[367,482,484,487,490,493,496],{"class":369,"line":483},8,[367,485,486],{"class":417},"  final",[367,488,489],{"class":380}," T",[367,491,492],{"class":373},"?",[367,494,495],{"class":384}," previousData",[367,497,498],{"class":373},";\n",[367,500,502],{"class":369,"line":501},9,[367,503,504],{"class":384},"}\n",[367,506,508],{"class":369,"line":507},10,[367,509,404],{"emptyLinePlaceholder":403},[367,511,513],{"class":369,"line":512},11,[367,514,515],{"class":410},"// Données récupérées avec succès\n",[367,517,519,521,523,526,528,530,532,534,536,538,540],{"class":369,"line":518},12,[367,520,418],{"class":417},[367,522,377],{"class":373},[367,524,525],{"class":380}," Success",[367,527,385],{"class":384},[367,529,388],{"class":380},[367,531,430],{"class":384},[367,533,433],{"class":373},[367,535,381],{"class":380},[367,537,385],{"class":384},[367,539,388],{"class":380},[367,541,480],{"class":384},[367,543,545,547,549,552],{"class":369,"line":544},13,[367,546,486],{"class":417},[367,548,489],{"class":380},[367,550,551],{"class":384}," data",[367,553,498],{"class":373},[367,555,557,559,562,565],{"class":369,"line":556},14,[367,558,486],{"class":417},[367,560,561],{"class":380}," DateTime",[367,563,564],{"class":384}," updatedAt",[367,566,498],{"class":373},[367,568,570],{"class":369,"line":569},15,[367,571,504],{"class":384},[367,573,575],{"class":369,"line":574},16,[367,576,404],{"emptyLinePlaceholder":403},[367,578,580],{"class":369,"line":579},17,[367,581,582],{"class":410},"// Fetch échoué (avec données périmées optionnelles pour la dégradation gracieuse)\n",[367,584,586,588,590,593,595,597,599,601,603,605,607],{"class":369,"line":585},18,[367,587,418],{"class":417},[367,589,377],{"class":373},[367,591,592],{"class":380}," Failure",[367,594,385],{"class":384},[367,596,388],{"class":380},[367,598,430],{"class":384},[367,600,433],{"class":373},[367,602,381],{"class":380},[367,604,385],{"class":384},[367,606,388],{"class":380},[367,608,480],{"class":384},[367,610,612,614,617,620],{"class":369,"line":611},19,[367,613,486],{"class":417},[367,615,616],{"class":380}," Object",[367,618,619],{"class":384}," error",[367,621,498],{"class":373},[367,623,625,627,630,632,635],{"class":369,"line":624},20,[367,626,486],{"class":417},[367,628,629],{"class":380}," StackTrace",[367,631,492],{"class":373},[367,633,634],{"class":384}," stackTrace",[367,636,498],{"class":373},[367,638,640,642,644,646,648],{"class":369,"line":639},21,[367,641,486],{"class":417},[367,643,489],{"class":380},[367,645,492],{"class":373},[367,647,495],{"class":384},[367,649,498],{"class":373},[367,651,653],{"class":369,"line":652},22,[367,654,504],{"class":384},[352,656,657,658,662,663,666],{},"Les classes scellées Dart 3 garantissent la ",[659,660,661],"strong",{},"correspondance de motifs exhaustive à la compilation"," : le compilateur rejette tout ",[364,664,665],{},"switch"," qui ne traite pas les quatre variantes.",[668,669],"hr",{},[348,671,673],{"id":672},"transitions-détat","Transitions d'état",[356,675,680],{"className":676,"code":678,"language":679,"meta":362},[677],"language-text","Initial\n  │  premier fetch déclenché\n  ▼\nLoading(previousData: null)\n  │  fetcher réussit\n  ▼\nSuccess(data, updatedAt)\n  │  staleTime écoulé → refetch en arrière-plan\n  ▼\nLoading(previousData: data)    ← données périmées visibles pendant le rechargement\n  │  fetcher réussit\n  ▼\nSuccess(newData, updatedAt)\n  │  fetcher échoue après tous les retries\n  ▼\nFailure(error, previousData: data)   ← données périmées toujours accessibles\n","text",[364,681,678],{"__ignoreMap":362},[683,684,686],"h3",{"id":685},"principes-fondamentaux","Principes fondamentaux",[688,689,690,705],"ol",{},[691,692,693,696,697,700,701,704],"li",{},[364,694,695],{},"previousData"," est conservé dans les états ",[364,698,699],{},"Loading"," et ",[364,702,703],{},"Failure",". L'UI dispose toujours de quelque chose à afficher.",[691,706,707,709,710,712],{},[364,708,703],{}," avec ",[364,711,695],{}," n'est pas un état terminal. Il supporte la dégradation gracieuse.",[668,714],{},[348,716,718],{"id":717},"correspondance-de-motifs","Correspondance de motifs",[683,720,722],{"id":721},"switch-exhaustif-recommandé","switch exhaustif (recommandé)",[356,724,727],{"className":358,"code":725,"filename":726,"language":361,"meta":362,"style":362},"Widget build(BuildContext context) {\n  return switch (state) {\n    Initial() => const SizedBox.shrink(),\n    Loading(:final previousData) => previousData != null\n        ? Stack(children: [UserCard(previousData), const LinearProgressIndicator()])\n        : const CircularProgressIndicator(),\n    Success(:final data) => UserCard(data),\n    Failure(:final error, :final previousData) => Column(\n        children: [\n          if (previousData != null) UserCard(previousData),\n          ErrorBanner('$error'),\n        ],\n      ),\n  };\n}\n","user_page.dart",[364,728,729,747,759,788,814,847,861,885,915,925,947,972,979,986,993],{"__ignoreMap":362},[367,730,731,734,738,741,744],{"class":369,"line":370},[367,732,733],{"class":380},"Widget",[367,735,737],{"class":736},"s2Zo4"," build",[367,739,740],{"class":384},"(",[367,742,743],{"class":380},"BuildContext",[367,745,746],{"class":384}," context) {\n",[367,748,749,753,756],{"class":369,"line":400},[367,750,752],{"class":751},"s7zQu","  return",[367,754,755],{"class":751}," switch",[367,757,758],{"class":384}," (state) {\n",[367,760,761,764,767,770,773,776,779,782,785],{"class":369,"line":407},[367,762,763],{"class":380},"    Initial",[367,765,766],{"class":384},"() ",[367,768,769],{"class":373},"=>",[367,771,772],{"class":417}," const",[367,774,775],{"class":380}," SizedBox",[367,777,778],{"class":373},".",[367,780,781],{"class":736},"shrink",[367,783,784],{"class":384},"()",[367,786,787],{"class":373},",\n",[367,789,790,793,795,798,800,803,805,808,811],{"class":369,"line":414},[367,791,792],{"class":380},"    Loading",[367,794,740],{"class":384},[367,796,797],{"class":373},":",[367,799,418],{"class":417},[367,801,802],{"class":384}," previousData) ",[367,804,769],{"class":373},[367,806,807],{"class":384}," previousData ",[367,809,810],{"class":373},"!=",[367,812,813],{"class":373}," null\n",[367,815,816,819,822,825,827,830,833,836,839,841,844],{"class":369,"line":445},[367,817,818],{"class":373},"        ?",[367,820,821],{"class":380}," Stack",[367,823,824],{"class":384},"(children",[367,826,797],{"class":373},[367,828,829],{"class":384}," [",[367,831,832],{"class":380},"UserCard",[367,834,835],{"class":384},"(previousData)",[367,837,838],{"class":373},",",[367,840,772],{"class":417},[367,842,843],{"class":380}," LinearProgressIndicator",[367,845,846],{"class":384},"()])\n",[367,848,849,852,854,857,859],{"class":369,"line":450},[367,850,851],{"class":373},"        :",[367,853,772],{"class":417},[367,855,856],{"class":380}," CircularProgressIndicator",[367,858,784],{"class":384},[367,860,787],{"class":373},[367,862,863,866,868,870,872,875,877,880,883],{"class":369,"line":456},[367,864,865],{"class":380},"    Success",[367,867,740],{"class":384},[367,869,797],{"class":373},[367,871,418],{"class":417},[367,873,874],{"class":384}," data) ",[367,876,769],{"class":373},[367,878,879],{"class":380}," UserCard",[367,881,882],{"class":384},"(data)",[367,884,787],{"class":373},[367,886,887,890,892,894,896,898,900,903,905,907,909,912],{"class":369,"line":483},[367,888,889],{"class":380},"    Failure",[367,891,740],{"class":384},[367,893,797],{"class":373},[367,895,418],{"class":417},[367,897,619],{"class":384},[367,899,838],{"class":373},[367,901,902],{"class":373}," :",[367,904,418],{"class":417},[367,906,802],{"class":384},[367,908,769],{"class":373},[367,910,911],{"class":380}," Column",[367,913,914],{"class":384},"(\n",[367,916,917,920,922],{"class":369,"line":501},[367,918,919],{"class":384},"        children",[367,921,797],{"class":373},[367,923,924],{"class":384}," [\n",[367,926,927,930,933,935,938,941,943,945],{"class":369,"line":507},[367,928,929],{"class":751},"          if",[367,931,932],{"class":384}," (previousData ",[367,934,810],{"class":373},[367,936,937],{"class":373}," null",[367,939,940],{"class":384},") ",[367,942,832],{"class":380},[367,944,835],{"class":384},[367,946,787],{"class":373},[367,948,949,952,954,958,961,965,967,970],{"class":369,"line":512},[367,950,951],{"class":380},"          ErrorBanner",[367,953,740],{"class":384},[367,955,957],{"class":956},"sfazB","'",[367,959,960],{"class":384},"$",[367,962,964],{"class":963},"sHdIc","error",[367,966,957],{"class":956},[367,968,969],{"class":384},")",[367,971,787],{"class":373},[367,973,974,977],{"class":369,"line":518},[367,975,976],{"class":384},"        ]",[367,978,787],{"class":373},[367,980,981,984],{"class":369,"line":544},[367,982,983],{"class":384},"      )",[367,985,787],{"class":373},[367,987,988,991],{"class":369,"line":556},[367,989,990],{"class":384},"  }",[367,992,498],{"class":373},[367,994,995],{"class":369,"line":569},[367,996,504],{"class":384},[683,998,1000,1003],{"id":999},"when-dispatch-deffets-de-bord",[364,1001,1002],{},"when"," : dispatch d'effets de bord",[352,1005,1006,1007,1009,1010,1013],{},"Les quatre callbacks sont optionnels. ",[364,1008,1002],{}," retourne ",[364,1011,1012],{},"void"," et est conçu pour les effets de bord : événements analytics, snackbars, logging :",[356,1015,1017],{"className":358,"code":1016,"filename":726,"language":361,"meta":362,"style":362},"state.when(\n  onSuccess: (data, updatedAt) => analytics.track('loaded', {'id': data.id}),\n  onError: (error, stackTrace, previousData) => showSnackBar('$error'),\n);\n",[364,1018,1019,1030,1079,1116],{"__ignoreMap":362},[367,1020,1021,1024,1026,1028],{"class":369,"line":370},[367,1022,1023],{"class":384},"state",[367,1025,778],{"class":373},[367,1027,1002],{"class":751},[367,1029,914],{"class":384},[367,1031,1032,1035,1037,1040,1042,1045,1047,1050,1052,1055,1057,1060,1062,1065,1068,1070,1072,1074,1077],{"class":369,"line":400},[367,1033,1034],{"class":384},"  onSuccess",[367,1036,797],{"class":373},[367,1038,1039],{"class":384}," (data",[367,1041,838],{"class":373},[367,1043,1044],{"class":384}," updatedAt) ",[367,1046,769],{"class":373},[367,1048,1049],{"class":384}," analytics",[367,1051,778],{"class":373},[367,1053,1054],{"class":736},"track",[367,1056,740],{"class":384},[367,1058,1059],{"class":956},"'loaded'",[367,1061,838],{"class":373},[367,1063,1064],{"class":384}," {",[367,1066,1067],{"class":956},"'id'",[367,1069,797],{"class":373},[367,1071,551],{"class":384},[367,1073,778],{"class":373},[367,1075,1076],{"class":384},"id})",[367,1078,787],{"class":373},[367,1080,1081,1084,1086,1089,1091,1093,1095,1097,1099,1102,1104,1106,1108,1110,1112,1114],{"class":369,"line":407},[367,1082,1083],{"class":384},"  onError",[367,1085,797],{"class":373},[367,1087,1088],{"class":384}," (error",[367,1090,838],{"class":373},[367,1092,634],{"class":384},[367,1094,838],{"class":373},[367,1096,802],{"class":384},[367,1098,769],{"class":373},[367,1100,1101],{"class":736}," showSnackBar",[367,1103,740],{"class":384},[367,1105,957],{"class":956},[367,1107,960],{"class":384},[367,1109,964],{"class":963},[367,1111,957],{"class":956},[367,1113,969],{"class":384},[367,1115,787],{"class":373},[367,1117,1118,1120],{"class":369,"line":414},[367,1119,969],{"class":384},[367,1121,498],{"class":373},[683,1123,1125,1128],{"id":1124},"maybewhen-mapping-vers-une-valeur-avec-fallback",[364,1126,1127],{},"maybeWhen"," : mapping vers une valeur avec fallback",[352,1130,1131,1133,1134,1137,1138,1141],{},[364,1132,1127],{}," retourne une valeur de type ",[364,1135,1136],{},"R",". Il accepte un fallback ",[364,1139,1140],{},"orElse"," et des handlers optionnels par état :",[356,1143,1145],{"className":358,"code":1144,"filename":726,"language":361,"meta":362,"style":362},"final widget = state.maybeWhen(\n  onSuccess: (data, _) => UserCard(data),\n  orElse: () => const CircularProgressIndicator(),\n);\n",[364,1146,1147,1166,1187,1207],{"__ignoreMap":362},[367,1148,1149,1151,1154,1157,1160,1162,1164],{"class":369,"line":370},[367,1150,418],{"class":417},[367,1152,1153],{"class":384}," widget ",[367,1155,1156],{"class":373},"=",[367,1158,1159],{"class":384}," state",[367,1161,778],{"class":373},[367,1163,1127],{"class":736},[367,1165,914],{"class":384},[367,1167,1168,1170,1172,1174,1176,1179,1181,1183,1185],{"class":369,"line":400},[367,1169,1034],{"class":384},[367,1171,797],{"class":373},[367,1173,1039],{"class":384},[367,1175,838],{"class":373},[367,1177,1178],{"class":384}," _) ",[367,1180,769],{"class":373},[367,1182,879],{"class":380},[367,1184,882],{"class":384},[367,1186,787],{"class":373},[367,1188,1189,1192,1194,1197,1199,1201,1203,1205],{"class":369,"line":407},[367,1190,1191],{"class":384},"  orElse",[367,1193,797],{"class":373},[367,1195,1196],{"class":384}," () ",[367,1198,769],{"class":373},[367,1200,772],{"class":417},[367,1202,856],{"class":380},[367,1204,784],{"class":384},[367,1206,787],{"class":373},[367,1208,1209,1211],{"class":369,"line":414},[367,1210,969],{"class":384},[367,1212,498],{"class":373},[668,1214],{},[348,1216,1218],{"id":1217},"initial",[364,1219,1220],{},"Initial",[352,1222,1223],{},"La requête n'a jamais été exécutée. C'est l'état par défaut de toute clé qui n'a pas encore été chargée.",[356,1225,1228],{"className":358,"code":1226,"filename":1227,"language":361,"meta":362,"style":362},"final state = client.getQueryState\u003CUser>(['users', 42]);\nprint(state); // Initial\u003CUser>()\n\nprint(state.isInitial);  // true\nprint(state.hasData);    // false\nprint(state.dataOrNull); // null\n","main.dart",[364,1229,1230,1269,1283,1287,1304,1320],{"__ignoreMap":362},[367,1231,1232,1234,1237,1239,1242,1244,1247,1249,1252,1255,1258,1260,1264,1267],{"class":369,"line":370},[367,1233,418],{"class":417},[367,1235,1236],{"class":384}," state ",[367,1238,1156],{"class":373},[367,1240,1241],{"class":384}," client",[367,1243,778],{"class":373},[367,1245,1246],{"class":736},"getQueryState",[367,1248,385],{"class":384},[367,1250,1251],{"class":380},"User",[367,1253,1254],{"class":384},">([",[367,1256,1257],{"class":956},"'users'",[367,1259,838],{"class":373},[367,1261,1263],{"class":1262},"sbssI"," 42",[367,1265,1266],{"class":384},"])",[367,1268,498],{"class":373},[367,1270,1271,1274,1277,1280],{"class":369,"line":400},[367,1272,1273],{"class":736},"print",[367,1275,1276],{"class":384},"(state)",[367,1278,1279],{"class":373},";",[367,1281,1282],{"class":410}," // Initial\u003CUser>()\n",[367,1284,1285],{"class":369,"line":407},[367,1286,404],{"emptyLinePlaceholder":403},[367,1288,1289,1291,1294,1296,1299,1301],{"class":369,"line":414},[367,1290,1273],{"class":736},[367,1292,1293],{"class":384},"(state",[367,1295,778],{"class":373},[367,1297,1298],{"class":384},"isInitial)",[367,1300,1279],{"class":373},[367,1302,1303],{"class":410},"  // true\n",[367,1305,1306,1308,1310,1312,1315,1317],{"class":369,"line":445},[367,1307,1273],{"class":736},[367,1309,1293],{"class":384},[367,1311,778],{"class":373},[367,1313,1314],{"class":384},"hasData)",[367,1316,1279],{"class":373},[367,1318,1319],{"class":410},"    // false\n",[367,1321,1322,1324,1326,1328,1331,1333],{"class":369,"line":450},[367,1323,1273],{"class":736},[367,1325,1293],{"class":384},[367,1327,778],{"class":373},[367,1329,1330],{"class":384},"dataOrNull)",[367,1332,1279],{"class":373},[367,1334,1335],{"class":410}," // null\n",[352,1337,1338],{},"Afficher un espace réservé ou rien. Un spinner est inapproprié ici car aucun fetch n'est en cours.",[668,1340],{},[348,1342,1344],{"id":1343},"loading",[364,1345,699],{},[352,1347,1348,1349,1351],{},"Un fetch est activement en cours. ",[364,1350,695],{}," contient les dernières données réussies (le cas échéant), permettant à l'UI de rester utile pendant les rechargements.",[356,1353,1355],{"className":358,"code":1354,"filename":726,"language":361,"meta":362,"style":362},"// Premier chargement : pas de previousData\nLoading(previousData: null)  // Afficher un spinner plein écran\n\n// Refetch / rechargement en arrière-plan : previousData disponible\nLoading(previousData: User(id: 1, name: 'Alice'))  // Afficher l'UI périmée + indicateur discret\n",[364,1356,1357,1362,1379,1383,1388],{"__ignoreMap":362},[367,1358,1359],{"class":369,"line":370},[367,1360,1361],{"class":410},"// Premier chargement : pas de previousData\n",[367,1363,1364,1366,1369,1371,1373,1376],{"class":369,"line":400},[367,1365,699],{"class":380},[367,1367,1368],{"class":384},"(previousData",[367,1370,797],{"class":373},[367,1372,937],{"class":373},[367,1374,1375],{"class":384},")  ",[367,1377,1378],{"class":410},"// Afficher un spinner plein écran\n",[367,1380,1381],{"class":369,"line":407},[367,1382,404],{"emptyLinePlaceholder":403},[367,1384,1385],{"class":369,"line":414},[367,1386,1387],{"class":410},"// Refetch / rechargement en arrière-plan : previousData disponible\n",[367,1389,1390,1392,1394,1396,1399,1402,1404,1407,1409,1412,1414,1417,1420],{"class":369,"line":445},[367,1391,699],{"class":380},[367,1393,1368],{"class":384},[367,1395,797],{"class":373},[367,1397,1398],{"class":380}," User",[367,1400,1401],{"class":384},"(id",[367,1403,797],{"class":373},[367,1405,1406],{"class":1262}," 1",[367,1408,838],{"class":373},[367,1410,1411],{"class":384}," name",[367,1413,797],{"class":373},[367,1415,1416],{"class":956}," 'Alice'",[367,1418,1419],{"class":384},"))  ",[367,1421,1422],{"class":410},"// Afficher l'UI périmée + indicateur discret\n",[356,1424,1426],{"className":358,"code":1425,"filename":726,"language":361,"meta":362,"style":362},"case Loading(:final previousData):\n  if (previousData != null) {\n    return Stack(\n      children: [\n        UserCard(previousData),\n        const Positioned(\n          top: 0, left: 0, right: 0,\n          child: LinearProgressIndicator(),\n        ),\n      ],\n    );\n  }\n  return const CircularProgressIndicator();\n",[364,1427,1428,1447,1461,1470,1479,1488,1498,1528,1541,1548,1555,1562,1567],{"__ignoreMap":362},[367,1429,1430,1433,1435,1437,1439,1441,1444],{"class":369,"line":370},[367,1431,1432],{"class":751},"case",[367,1434,463],{"class":380},[367,1436,740],{"class":384},[367,1438,797],{"class":373},[367,1440,418],{"class":417},[367,1442,1443],{"class":384}," previousData)",[367,1445,1446],{"class":373},":\n",[367,1448,1449,1452,1454,1456,1458],{"class":369,"line":400},[367,1450,1451],{"class":751},"  if",[367,1453,932],{"class":384},[367,1455,810],{"class":373},[367,1457,937],{"class":373},[367,1459,1460],{"class":384},") {\n",[367,1462,1463,1466,1468],{"class":369,"line":407},[367,1464,1465],{"class":751},"    return",[367,1467,821],{"class":380},[367,1469,914],{"class":384},[367,1471,1472,1475,1477],{"class":369,"line":414},[367,1473,1474],{"class":384},"      children",[367,1476,797],{"class":373},[367,1478,924],{"class":384},[367,1480,1481,1484,1486],{"class":369,"line":445},[367,1482,1483],{"class":380},"        UserCard",[367,1485,835],{"class":384},[367,1487,787],{"class":373},[367,1489,1490,1493,1496],{"class":369,"line":450},[367,1491,1492],{"class":417},"        const",[367,1494,1495],{"class":380}," Positioned",[367,1497,914],{"class":384},[367,1499,1500,1503,1505,1508,1510,1513,1515,1517,1519,1522,1524,1526],{"class":369,"line":456},[367,1501,1502],{"class":384},"          top",[367,1504,797],{"class":373},[367,1506,1507],{"class":1262}," 0",[367,1509,838],{"class":373},[367,1511,1512],{"class":384}," left",[367,1514,797],{"class":373},[367,1516,1507],{"class":1262},[367,1518,838],{"class":373},[367,1520,1521],{"class":384}," right",[367,1523,797],{"class":373},[367,1525,1507],{"class":1262},[367,1527,787],{"class":373},[367,1529,1530,1533,1535,1537,1539],{"class":369,"line":483},[367,1531,1532],{"class":384},"          child",[367,1534,797],{"class":373},[367,1536,843],{"class":380},[367,1538,784],{"class":384},[367,1540,787],{"class":373},[367,1542,1543,1546],{"class":369,"line":501},[367,1544,1545],{"class":384},"        )",[367,1547,787],{"class":373},[367,1549,1550,1553],{"class":369,"line":507},[367,1551,1552],{"class":384},"      ]",[367,1554,787],{"class":373},[367,1556,1557,1560],{"class":369,"line":512},[367,1558,1559],{"class":384},"    )",[367,1561,498],{"class":373},[367,1563,1564],{"class":369,"line":518},[367,1565,1566],{"class":384},"  }\n",[367,1568,1569,1571,1573,1575,1577],{"class":369,"line":544},[367,1570,752],{"class":751},[367,1572,772],{"class":417},[367,1574,856],{"class":380},[367,1576,784],{"class":384},[367,1578,498],{"class":373},[352,1580,1581],{},[659,1582,1583],{},"Propriétés utilitaires :",[356,1585,1587],{"className":358,"code":1586,"filename":1227,"language":361,"meta":362,"style":362},"state.isLoading        // true\nstate.isFirstLoad      // true quand previousData == null\nstate.isRefreshing     // true quand previousData != null\nstate.hasData          // true quand previousData != null\nstate.dataOrNull       // retourne previousData\n",[364,1588,1589,1601,1613,1625,1636],{"__ignoreMap":362},[367,1590,1591,1593,1595,1598],{"class":369,"line":370},[367,1592,1023],{"class":384},[367,1594,778],{"class":373},[367,1596,1597],{"class":384},"isLoading        ",[367,1599,1600],{"class":410},"// true\n",[367,1602,1603,1605,1607,1610],{"class":369,"line":400},[367,1604,1023],{"class":384},[367,1606,778],{"class":373},[367,1608,1609],{"class":384},"isFirstLoad      ",[367,1611,1612],{"class":410},"// true quand previousData == null\n",[367,1614,1615,1617,1619,1622],{"class":369,"line":407},[367,1616,1023],{"class":384},[367,1618,778],{"class":373},[367,1620,1621],{"class":384},"isRefreshing     ",[367,1623,1624],{"class":410},"// true quand previousData != null\n",[367,1626,1627,1629,1631,1634],{"class":369,"line":414},[367,1628,1023],{"class":384},[367,1630,778],{"class":373},[367,1632,1633],{"class":384},"hasData          ",[367,1635,1624],{"class":410},[367,1637,1638,1640,1642,1645],{"class":369,"line":445},[367,1639,1023],{"class":384},[367,1641,778],{"class":373},[367,1643,1644],{"class":384},"dataOrNull       ",[367,1646,1647],{"class":410},"// retourne previousData\n",[668,1649],{},[348,1651,1653],{"id":1652},"success",[364,1654,1655],{},"Success",[352,1657,1658,1659,700,1662,1665],{},"Les données ont été récupérées avec succès. Contient ",[364,1660,1661],{},"data",[364,1663,1664],{},"updatedAt"," pour le suivi de la fraîcheur.",[356,1667,1669],{"className":358,"code":1668,"filename":726,"language":361,"meta":362,"style":362},"case Success(:final data, :final updatedAt):\n  return Column(\n    children: [\n      UserCard(data),\n      Text('Mis à jour ${_timeAgo(updatedAt)}'),\n    ],\n  );\n",[364,1670,1671,1696,1704,1713,1722,1751,1758],{"__ignoreMap":362},[367,1672,1673,1675,1677,1679,1681,1683,1685,1687,1689,1691,1694],{"class":369,"line":370},[367,1674,1432],{"class":751},[367,1676,525],{"class":380},[367,1678,740],{"class":384},[367,1680,797],{"class":373},[367,1682,418],{"class":417},[367,1684,551],{"class":384},[367,1686,838],{"class":373},[367,1688,902],{"class":373},[367,1690,418],{"class":417},[367,1692,1693],{"class":384}," updatedAt)",[367,1695,1446],{"class":373},[367,1697,1698,1700,1702],{"class":369,"line":400},[367,1699,752],{"class":751},[367,1701,911],{"class":380},[367,1703,914],{"class":384},[367,1705,1706,1709,1711],{"class":369,"line":407},[367,1707,1708],{"class":384},"    children",[367,1710,797],{"class":373},[367,1712,924],{"class":384},[367,1714,1715,1718,1720],{"class":369,"line":414},[367,1716,1717],{"class":380},"      UserCard",[367,1719,882],{"class":384},[367,1721,787],{"class":373},[367,1723,1724,1727,1729,1732,1735,1738,1740,1742,1745,1747,1749],{"class":369,"line":445},[367,1725,1726],{"class":380},"      Text",[367,1728,740],{"class":384},[367,1730,1731],{"class":956},"'Mis à jour ",[367,1733,1734],{"class":384},"${",[367,1736,1737],{"class":736},"_timeAgo",[367,1739,740],{"class":384},[367,1741,1664],{"class":963},[367,1743,1744],{"class":384},")}",[367,1746,957],{"class":956},[367,1748,969],{"class":384},[367,1750,787],{"class":373},[367,1752,1753,1756],{"class":369,"line":450},[367,1754,1755],{"class":384},"    ]",[367,1757,787],{"class":373},[367,1759,1760,1763],{"class":369,"line":456},[367,1761,1762],{"class":384},"  )",[367,1764,498],{"class":373},[356,1766,1768],{"className":358,"code":1767,"filename":1227,"language":361,"meta":362,"style":362},"final s = state as Success\u003CUser>;\n\ns.data        // l'User récupéré\ns.updatedAt   // DateTime du dernier fetch réussi\ns.age         // Duration depuis updatedAt\ns.isStale(Duration(minutes: 5))  // true si age > 5 min\n",[364,1769,1770,1795,1799,1812,1824,1836],{"__ignoreMap":362},[367,1771,1772,1774,1777,1779,1781,1784,1786,1788,1790,1793],{"class":369,"line":370},[367,1773,418],{"class":417},[367,1775,1776],{"class":384}," s ",[367,1778,1156],{"class":373},[367,1780,1236],{"class":384},[367,1782,1783],{"class":373},"as",[367,1785,525],{"class":380},[367,1787,385],{"class":384},[367,1789,1251],{"class":380},[367,1791,1792],{"class":384},">",[367,1794,498],{"class":373},[367,1796,1797],{"class":369,"line":400},[367,1798,404],{"emptyLinePlaceholder":403},[367,1800,1801,1804,1806,1809],{"class":369,"line":407},[367,1802,1803],{"class":384},"s",[367,1805,778],{"class":373},[367,1807,1808],{"class":384},"data        ",[367,1810,1811],{"class":410},"// l'User récupéré\n",[367,1813,1814,1816,1818,1821],{"class":369,"line":414},[367,1815,1803],{"class":384},[367,1817,778],{"class":373},[367,1819,1820],{"class":384},"updatedAt   ",[367,1822,1823],{"class":410},"// DateTime du dernier fetch réussi\n",[367,1825,1826,1828,1830,1833],{"class":369,"line":445},[367,1827,1803],{"class":384},[367,1829,778],{"class":373},[367,1831,1832],{"class":384},"age         ",[367,1834,1835],{"class":410},"// Duration depuis updatedAt\n",[367,1837,1838,1840,1842,1845,1847,1850,1853,1855,1858,1860],{"class":369,"line":450},[367,1839,1803],{"class":384},[367,1841,778],{"class":373},[367,1843,1844],{"class":736},"isStale",[367,1846,740],{"class":384},[367,1848,1849],{"class":380},"Duration",[367,1851,1852],{"class":384},"(minutes",[367,1854,797],{"class":373},[367,1856,1857],{"class":1262}," 5",[367,1859,1419],{"class":384},[367,1861,1862],{"class":410},"// true si age > 5 min\n",[352,1864,1865],{},[659,1866,1583],{},[356,1868,1870],{"className":358,"code":1869,"filename":1227,"language":361,"meta":362,"style":362},"state.isSuccess         // true\nstate.hasData           // true\nstate.dataOrNull        // retourne data\nstate.successDataOrNull // retourne data (null pour les états non-Success)\nstate.updatedAt         // DateTime?\n",[364,1871,1872,1883,1894,1906,1918],{"__ignoreMap":362},[367,1873,1874,1876,1878,1881],{"class":369,"line":370},[367,1875,1023],{"class":384},[367,1877,778],{"class":373},[367,1879,1880],{"class":384},"isSuccess         ",[367,1882,1600],{"class":410},[367,1884,1885,1887,1889,1892],{"class":369,"line":400},[367,1886,1023],{"class":384},[367,1888,778],{"class":373},[367,1890,1891],{"class":384},"hasData           ",[367,1893,1600],{"class":410},[367,1895,1896,1898,1900,1903],{"class":369,"line":407},[367,1897,1023],{"class":384},[367,1899,778],{"class":373},[367,1901,1902],{"class":384},"dataOrNull        ",[367,1904,1905],{"class":410},"// retourne data\n",[367,1907,1908,1910,1912,1915],{"class":369,"line":414},[367,1909,1023],{"class":384},[367,1911,778],{"class":373},[367,1913,1914],{"class":384},"successDataOrNull ",[367,1916,1917],{"class":410},"// retourne data (null pour les états non-Success)\n",[367,1919,1920,1922,1924,1927],{"class":369,"line":445},[367,1921,1023],{"class":384},[367,1923,778],{"class":373},[367,1925,1926],{"class":384},"updatedAt         ",[367,1928,1929],{"class":410},"// DateTime?\n",[668,1931],{},[348,1933,1935],{"id":1934},"failure",[364,1936,703],{},[352,1938,1939,1940,1942],{},"Le fetch a échoué après toutes les tentatives de retry. ",[364,1941,695],{}," donne accès aux dernières données réussies pour la dégradation gracieuse.",[356,1944,1946],{"className":358,"code":1945,"filename":726,"language":361,"meta":362,"style":362},"case Failure(:final error, :final previousData):\n  return Column(\n    children: [\n      if (previousData != null) ...[\n        UserCard(previousData),\n        const SizedBox(height: 8),\n      ],\n      ErrorBanner(\n        message: '$error',\n        onRetry: () => client.invalidate(['users', userId]),\n      ),\n    ],\n  );\n",[364,1947,1948,1972,1980,1988,2006,2014,2032,2038,2045,2063,2093,2099,2105],{"__ignoreMap":362},[367,1949,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968,1970],{"class":369,"line":370},[367,1951,1432],{"class":751},[367,1953,592],{"class":380},[367,1955,740],{"class":384},[367,1957,797],{"class":373},[367,1959,418],{"class":417},[367,1961,619],{"class":384},[367,1963,838],{"class":373},[367,1965,902],{"class":373},[367,1967,418],{"class":417},[367,1969,1443],{"class":384},[367,1971,1446],{"class":373},[367,1973,1974,1976,1978],{"class":369,"line":400},[367,1975,752],{"class":751},[367,1977,911],{"class":380},[367,1979,914],{"class":384},[367,1981,1982,1984,1986],{"class":369,"line":407},[367,1983,1708],{"class":384},[367,1985,797],{"class":373},[367,1987,924],{"class":384},[367,1989,1990,1993,1995,1997,1999,2001,2003],{"class":369,"line":414},[367,1991,1992],{"class":751},"      if",[367,1994,932],{"class":384},[367,1996,810],{"class":373},[367,1998,937],{"class":373},[367,2000,940],{"class":384},[367,2002,394],{"class":373},[367,2004,2005],{"class":384},"[\n",[367,2007,2008,2010,2012],{"class":369,"line":445},[367,2009,1483],{"class":380},[367,2011,835],{"class":384},[367,2013,787],{"class":373},[367,2015,2016,2018,2020,2023,2025,2028,2030],{"class":369,"line":450},[367,2017,1492],{"class":417},[367,2019,775],{"class":380},[367,2021,2022],{"class":384},"(height",[367,2024,797],{"class":373},[367,2026,2027],{"class":1262}," 8",[367,2029,969],{"class":384},[367,2031,787],{"class":373},[367,2033,2034,2036],{"class":369,"line":456},[367,2035,1552],{"class":384},[367,2037,787],{"class":373},[367,2039,2040,2043],{"class":369,"line":483},[367,2041,2042],{"class":380},"      ErrorBanner",[367,2044,914],{"class":384},[367,2046,2047,2050,2052,2055,2057,2059,2061],{"class":369,"line":501},[367,2048,2049],{"class":384},"        message",[367,2051,797],{"class":373},[367,2053,2054],{"class":956}," '",[367,2056,960],{"class":384},[367,2058,964],{"class":963},[367,2060,957],{"class":956},[367,2062,787],{"class":373},[367,2064,2065,2068,2070,2072,2074,2076,2078,2081,2084,2086,2088,2091],{"class":369,"line":507},[367,2066,2067],{"class":384},"        onRetry",[367,2069,797],{"class":373},[367,2071,1196],{"class":384},[367,2073,769],{"class":373},[367,2075,1241],{"class":384},[367,2077,778],{"class":373},[367,2079,2080],{"class":736},"invalidate",[367,2082,2083],{"class":384},"([",[367,2085,1257],{"class":956},[367,2087,838],{"class":373},[367,2089,2090],{"class":384}," userId])",[367,2092,787],{"class":373},[367,2094,2095,2097],{"class":369,"line":512},[367,2096,983],{"class":384},[367,2098,787],{"class":373},[367,2100,2101,2103],{"class":369,"line":518},[367,2102,1755],{"class":384},[367,2104,787],{"class":373},[367,2106,2107,2109],{"class":369,"line":544},[367,2108,1762],{"class":384},[367,2110,498],{"class":373},[356,2112,2114],{"className":358,"code":2113,"filename":1227,"language":361,"meta":362,"style":362},"state.isError     // true (alias : hasError)\nstate.hasData     // true quand previousData != null\nstate.dataOrNull  // retourne previousData\nstate.errorOrNull // retourne l'objet error\n",[364,2115,2116,2128,2139,2150],{"__ignoreMap":362},[367,2117,2118,2120,2122,2125],{"class":369,"line":370},[367,2119,1023],{"class":384},[367,2121,778],{"class":373},[367,2123,2124],{"class":384},"isError     ",[367,2126,2127],{"class":410},"// true (alias : hasError)\n",[367,2129,2130,2132,2134,2137],{"class":369,"line":400},[367,2131,1023],{"class":384},[367,2133,778],{"class":373},[367,2135,2136],{"class":384},"hasData     ",[367,2138,1624],{"class":410},[367,2140,2141,2143,2145,2148],{"class":369,"line":407},[367,2142,1023],{"class":384},[367,2144,778],{"class":373},[367,2146,2147],{"class":384},"dataOrNull  ",[367,2149,1647],{"class":410},[367,2151,2152,2154,2156,2159],{"class":369,"line":414},[367,2153,1023],{"class":384},[367,2155,778],{"class":373},[367,2157,2158],{"class":384},"errorOrNull ",[367,2160,2161],{"class":410},"// retourne l'objet error\n",[2163,2164,2165,2166,2168,2169,2171],"tip",{},"Toujours vérifier ",[364,2167,695],{}," dans ",[364,2170,703],{},". Afficher les données périmées à côté d'une bannière d'erreur offre une meilleure expérience qu'un écran d'erreur vide.",[668,2173],{},[348,2175,2177],{"id":2176},"extensions-de-state","Extensions de state",[352,2179,2180,2181,2184,2185,778],{},"Qora fournit un ensemble d'extensions sur ",[364,2182,2183],{},"QoraState\u003CT>"," définies dans ",[364,2186,2187],{},"state_extensions.dart",[683,2189,2191],{"id":2190},"accès-aux-données","Accès aux données",[356,2193,2195],{"className":358,"code":2194,"filename":1227,"language":361,"meta":362,"style":362},"state.hasData           // true pour Success, ou Loading/Failure avec previousData\nstate.dataOrNull        // T? : meilleures données disponibles dans tous les états\nstate.requireData()     // T : lève StateError si aucune donnée\nstate.successDataOrNull // T? : uniquement pour l'état Success, null sinon\n",[364,2196,2197,2208,2219,2234],{"__ignoreMap":362},[367,2198,2199,2201,2203,2205],{"class":369,"line":370},[367,2200,1023],{"class":384},[367,2202,778],{"class":373},[367,2204,1891],{"class":384},[367,2206,2207],{"class":410},"// true pour Success, ou Loading/Failure avec previousData\n",[367,2209,2210,2212,2214,2216],{"class":369,"line":400},[367,2211,1023],{"class":384},[367,2213,778],{"class":373},[367,2215,1902],{"class":384},[367,2217,2218],{"class":410},"// T? : meilleures données disponibles dans tous les états\n",[367,2220,2221,2223,2225,2228,2231],{"class":369,"line":407},[367,2222,1023],{"class":384},[367,2224,778],{"class":373},[367,2226,2227],{"class":736},"requireData",[367,2229,2230],{"class":384},"()     ",[367,2232,2233],{"class":410},"// T : lève StateError si aucune donnée\n",[367,2235,2236,2238,2240,2242],{"class":369,"line":414},[367,2237,1023],{"class":384},[367,2239,778],{"class":373},[367,2241,1914],{"class":384},[367,2243,2244],{"class":410},"// T? : uniquement pour l'état Success, null sinon\n",[683,2246,2248],{"id":2247},"indicateurs-de-statut","Indicateurs de statut",[356,2250,2252],{"className":358,"code":2251,"filename":1227,"language":361,"meta":362,"style":362},"state.isInitial    // true si Initial\nstate.isLoading    // true si Loading\nstate.isSuccess    // true si Success\nstate.isError      // true si Failure\nstate.hasError     // alias de isError\nstate.isFirstLoad  // true si Loading sans previousData\nstate.isRefreshing // true si Loading avec previousData\n",[364,2253,2254,2266,2278,2290,2302,2314,2326],{"__ignoreMap":362},[367,2255,2256,2258,2260,2263],{"class":369,"line":370},[367,2257,1023],{"class":384},[367,2259,778],{"class":373},[367,2261,2262],{"class":384},"isInitial    ",[367,2264,2265],{"class":410},"// true si Initial\n",[367,2267,2268,2270,2272,2275],{"class":369,"line":400},[367,2269,1023],{"class":384},[367,2271,778],{"class":373},[367,2273,2274],{"class":384},"isLoading    ",[367,2276,2277],{"class":410},"// true si Loading\n",[367,2279,2280,2282,2284,2287],{"class":369,"line":407},[367,2281,1023],{"class":384},[367,2283,778],{"class":373},[367,2285,2286],{"class":384},"isSuccess    ",[367,2288,2289],{"class":410},"// true si Success\n",[367,2291,2292,2294,2296,2299],{"class":369,"line":414},[367,2293,1023],{"class":384},[367,2295,778],{"class":373},[367,2297,2298],{"class":384},"isError      ",[367,2300,2301],{"class":410},"// true si Failure\n",[367,2303,2304,2306,2308,2311],{"class":369,"line":445},[367,2305,1023],{"class":384},[367,2307,778],{"class":373},[367,2309,2310],{"class":384},"hasError     ",[367,2312,2313],{"class":410},"// alias de isError\n",[367,2315,2316,2318,2320,2323],{"class":369,"line":450},[367,2317,1023],{"class":384},[367,2319,778],{"class":373},[367,2321,2322],{"class":384},"isFirstLoad  ",[367,2324,2325],{"class":410},"// true si Loading sans previousData\n",[367,2327,2328,2330,2332,2335],{"class":369,"line":456},[367,2329,1023],{"class":384},[367,2331,778],{"class":373},[367,2333,2334],{"class":384},"isRefreshing ",[367,2336,2337],{"class":410},"// true si Loading avec previousData\n",[683,2339,2341],{"id":2340},"mapping","Mapping",[356,2343,2345],{"className":358,"code":2344,"filename":1227,"language":361,"meta":362,"style":362},"// Transformer le type de données, en préservant la structure d'état\nfinal namesState = usersState.map((users) => users.map((u) => u.name).toList());\n// usersState: Success\u003CList\u003CUser>> → namesState: Success\u003CList\u003CString>>\n\n// mapData se comporte comme map ; choisissez le nom le plus lisible dans une chaîne\nfinal countState = usersState.mapData((users) => users.length);\n\n// Fold exhaustif vers une valeur unique\nfinal label = state.fold(\n  onInitial: () => 'Non chargé',\n  onLoading: (prev) => prev != null ? 'Actualisation...' : 'Chargement...',\n  onSuccess: (data, _) => 'Chargé : ${data.name}',\n  onError: (error, stackTrace, prev) => 'Erreur : $error',\n);\n",[364,2346,2347,2352,2404,2409,2413,2418,2447,2451,2456,2474,2490,2522,2555,2585],{"__ignoreMap":362},[367,2348,2349],{"class":369,"line":370},[367,2350,2351],{"class":410},"// Transformer le type de données, en préservant la structure d'état\n",[367,2353,2354,2356,2359,2361,2364,2366,2369,2372,2374,2377,2379,2381,2384,2386,2389,2391,2394,2396,2399,2402],{"class":369,"line":400},[367,2355,418],{"class":417},[367,2357,2358],{"class":384}," namesState ",[367,2360,1156],{"class":373},[367,2362,2363],{"class":384}," usersState",[367,2365,778],{"class":373},[367,2367,2368],{"class":736},"map",[367,2370,2371],{"class":384},"((users) ",[367,2373,769],{"class":373},[367,2375,2376],{"class":384}," users",[367,2378,778],{"class":373},[367,2380,2368],{"class":736},[367,2382,2383],{"class":384},"((u) ",[367,2385,769],{"class":373},[367,2387,2388],{"class":384}," u",[367,2390,778],{"class":373},[367,2392,2393],{"class":384},"name)",[367,2395,778],{"class":373},[367,2397,2398],{"class":736},"toList",[367,2400,2401],{"class":384},"())",[367,2403,498],{"class":373},[367,2405,2406],{"class":369,"line":407},[367,2407,2408],{"class":410},"// usersState: Success\u003CList\u003CUser>> → namesState: Success\u003CList\u003CString>>\n",[367,2410,2411],{"class":369,"line":414},[367,2412,404],{"emptyLinePlaceholder":403},[367,2414,2415],{"class":369,"line":445},[367,2416,2417],{"class":410},"// mapData se comporte comme map ; choisissez le nom le plus lisible dans une chaîne\n",[367,2419,2420,2422,2425,2427,2429,2431,2434,2436,2438,2440,2442,2445],{"class":369,"line":450},[367,2421,418],{"class":417},[367,2423,2424],{"class":384}," countState ",[367,2426,1156],{"class":373},[367,2428,2363],{"class":384},[367,2430,778],{"class":373},[367,2432,2433],{"class":736},"mapData",[367,2435,2371],{"class":384},[367,2437,769],{"class":373},[367,2439,2376],{"class":384},[367,2441,778],{"class":373},[367,2443,2444],{"class":384},"length)",[367,2446,498],{"class":373},[367,2448,2449],{"class":369,"line":456},[367,2450,404],{"emptyLinePlaceholder":403},[367,2452,2453],{"class":369,"line":483},[367,2454,2455],{"class":410},"// Fold exhaustif vers une valeur unique\n",[367,2457,2458,2460,2463,2465,2467,2469,2472],{"class":369,"line":501},[367,2459,418],{"class":417},[367,2461,2462],{"class":384}," label ",[367,2464,1156],{"class":373},[367,2466,1159],{"class":384},[367,2468,778],{"class":373},[367,2470,2471],{"class":736},"fold",[367,2473,914],{"class":384},[367,2475,2476,2479,2481,2483,2485,2488],{"class":369,"line":507},[367,2477,2478],{"class":384},"  onInitial",[367,2480,797],{"class":373},[367,2482,1196],{"class":384},[367,2484,769],{"class":373},[367,2486,2487],{"class":956}," 'Non chargé'",[367,2489,787],{"class":373},[367,2491,2492,2495,2497,2500,2502,2505,2507,2509,2512,2515,2517,2520],{"class":369,"line":512},[367,2493,2494],{"class":384},"  onLoading",[367,2496,797],{"class":373},[367,2498,2499],{"class":384}," (prev) ",[367,2501,769],{"class":373},[367,2503,2504],{"class":384}," prev ",[367,2506,810],{"class":373},[367,2508,937],{"class":373},[367,2510,2511],{"class":373}," ?",[367,2513,2514],{"class":956}," 'Actualisation...'",[367,2516,902],{"class":373},[367,2518,2519],{"class":956}," 'Chargement...'",[367,2521,787],{"class":373},[367,2523,2524,2526,2528,2530,2532,2534,2536,2539,2541,2543,2545,2548,2551,2553],{"class":369,"line":518},[367,2525,1034],{"class":384},[367,2527,797],{"class":373},[367,2529,1039],{"class":384},[367,2531,838],{"class":373},[367,2533,1178],{"class":384},[367,2535,769],{"class":373},[367,2537,2538],{"class":956}," 'Chargé : ",[367,2540,1734],{"class":384},[367,2542,1661],{"class":963},[367,2544,778],{"class":384},[367,2546,2547],{"class":963},"name",[367,2549,2550],{"class":384},"}",[367,2552,957],{"class":956},[367,2554,787],{"class":373},[367,2556,2557,2559,2561,2563,2565,2567,2569,2572,2574,2577,2579,2581,2583],{"class":369,"line":544},[367,2558,1083],{"class":384},[367,2560,797],{"class":373},[367,2562,1088],{"class":384},[367,2564,838],{"class":373},[367,2566,634],{"class":384},[367,2568,838],{"class":373},[367,2570,2571],{"class":384}," prev) ",[367,2573,769],{"class":373},[367,2575,2576],{"class":956}," 'Erreur : ",[367,2578,960],{"class":384},[367,2580,964],{"class":963},[367,2582,957],{"class":956},[367,2584,787],{"class":373},[367,2586,2587,2589],{"class":369,"line":556},[367,2588,969],{"class":384},[367,2590,498],{"class":373},[683,2592,2594],{"id":2593},"combinaison-de-plusieurs-états","Combinaison de plusieurs états",[356,2596,2598],{"className":358,"code":2597,"filename":1227,"language":361,"meta":362,"style":362},"// Combiner deux états : Success uniquement quand les deux sont Success\nfinal combined = userState.combine(\n  postsState,\n  (user, posts) => UserWithPosts(user, posts),\n);\n\n// Combiner une liste d'états\nfinal allUsers = QoraStateUtils.combineList([state1, state2, state3]);\n\n// Combiner exactement 2 ou 3 états en un record\nfinal pair   = QoraStateUtils.combine2(userState, settingsState);\nfinal triple = QoraStateUtils.combine3(userState, postsState, tagsState);\n",[364,2599,2600,2605,2624,2631,2656,2662,2666,2671,2703,2707,2712,2738],{"__ignoreMap":362},[367,2601,2602],{"class":369,"line":370},[367,2603,2604],{"class":410},"// Combiner deux états : Success uniquement quand les deux sont Success\n",[367,2606,2607,2609,2612,2614,2617,2619,2622],{"class":369,"line":400},[367,2608,418],{"class":417},[367,2610,2611],{"class":384}," combined ",[367,2613,1156],{"class":373},[367,2615,2616],{"class":384}," userState",[367,2618,778],{"class":373},[367,2620,2621],{"class":736},"combine",[367,2623,914],{"class":384},[367,2625,2626,2629],{"class":369,"line":407},[367,2627,2628],{"class":384},"  postsState",[367,2630,787],{"class":373},[367,2632,2633,2636,2638,2641,2643,2646,2649,2651,2654],{"class":369,"line":414},[367,2634,2635],{"class":384},"  (user",[367,2637,838],{"class":373},[367,2639,2640],{"class":384}," posts) ",[367,2642,769],{"class":373},[367,2644,2645],{"class":380}," UserWithPosts",[367,2647,2648],{"class":384},"(user",[367,2650,838],{"class":373},[367,2652,2653],{"class":384}," posts)",[367,2655,787],{"class":373},[367,2657,2658,2660],{"class":369,"line":445},[367,2659,969],{"class":384},[367,2661,498],{"class":373},[367,2663,2664],{"class":369,"line":450},[367,2665,404],{"emptyLinePlaceholder":403},[367,2667,2668],{"class":369,"line":456},[367,2669,2670],{"class":410},"// Combiner une liste d'états\n",[367,2672,2673,2675,2678,2680,2683,2685,2688,2691,2693,2696,2698,2701],{"class":369,"line":483},[367,2674,418],{"class":417},[367,2676,2677],{"class":384}," allUsers ",[367,2679,1156],{"class":373},[367,2681,2682],{"class":380}," QoraStateUtils",[367,2684,778],{"class":373},[367,2686,2687],{"class":736},"combineList",[367,2689,2690],{"class":384},"([state1",[367,2692,838],{"class":373},[367,2694,2695],{"class":384}," state2",[367,2697,838],{"class":373},[367,2699,2700],{"class":384}," state3])",[367,2702,498],{"class":373},[367,2704,2705],{"class":369,"line":501},[367,2706,404],{"emptyLinePlaceholder":403},[367,2708,2709],{"class":369,"line":507},[367,2710,2711],{"class":410},"// Combiner exactement 2 ou 3 états en un record\n",[367,2713,2714,2716,2719,2721,2723,2725,2728,2731,2733,2736],{"class":369,"line":512},[367,2715,418],{"class":417},[367,2717,2718],{"class":384}," pair   ",[367,2720,1156],{"class":373},[367,2722,2682],{"class":380},[367,2724,778],{"class":373},[367,2726,2727],{"class":736},"combine2",[367,2729,2730],{"class":384},"(userState",[367,2732,838],{"class":373},[367,2734,2735],{"class":384}," settingsState)",[367,2737,498],{"class":373},[367,2739,2740,2742,2745,2747,2749,2751,2754,2756,2758,2761,2763,2766],{"class":369,"line":518},[367,2741,418],{"class":417},[367,2743,2744],{"class":384}," triple ",[367,2746,1156],{"class":373},[367,2748,2682],{"class":380},[367,2750,778],{"class":373},[367,2752,2753],{"class":736},"combine3",[367,2755,2730],{"class":384},[367,2757,838],{"class":373},[367,2759,2760],{"class":384}," postsState",[367,2762,838],{"class":373},[367,2764,2765],{"class":384}," tagsState)",[367,2767,498],{"class":373},[668,2769],{},[348,2771,2773],{"id":2772},"extensions-de-stream","Extensions de stream",[352,2775,2776,2779,2780,2783,2784,902],{},[364,2777,2778],{},"watchQuery"," retourne un ",[364,2781,2782],{},"Stream\u003CQoraState\u003CT>>"," avec des opérateurs supplémentaires définis dans ",[364,2785,2786],{},"QoraStateStreamExtensions",[356,2788,2790],{"className":358,"code":2789,"filename":726,"language":361,"meta":362,"style":362},"// Émettre uniquement les états qui ont des données\nclient.watchQuery(...).whereHasData().listen(...);\n\n// Émettre uniquement les états Success\nclient.watchQuery(...).whereSuccess().listen((s) => print(s.data));\n\n// Émettre uniquement les états Failure\nclient.watchQuery(...).whereError().listen((f) => logError(f.error));\n\n// Extraire les données comme T? (null pour les états sans données)\nclient.watchQuery(...).dataOrNull().listen(...);\n\n// Extraire les données : ignorer les états sans données\nclient.watchQuery(...).data().listen((user) => render(user));\n\n// Mapper le type de données\nclient.watchQuery\u003CList\u003CUser>>(...).mapData((u) => u.length);\n\n// Retarder les émissions Loading pour éviter le scintillement sur les connexions rapides\nclient.watchQuery(...).delayLoading(Duration(milliseconds: 300));\n",[364,2791,2792,2797,2832,2836,2841,2884,2888,2893,2936,2940,2945,2978,2982,2987,3024,3028,3033,3073,3077,3082],{"__ignoreMap":362},[367,2793,2794],{"class":369,"line":370},[367,2795,2796],{"class":410},"// Émettre uniquement les états qui ont des données\n",[367,2798,2799,2802,2804,2806,2808,2810,2812,2814,2817,2819,2821,2824,2826,2828,2830],{"class":369,"line":400},[367,2800,2801],{"class":384},"client",[367,2803,778],{"class":373},[367,2805,2778],{"class":736},[367,2807,740],{"class":384},[367,2809,394],{"class":373},[367,2811,969],{"class":384},[367,2813,778],{"class":373},[367,2815,2816],{"class":736},"whereHasData",[367,2818,784],{"class":384},[367,2820,778],{"class":373},[367,2822,2823],{"class":736},"listen",[367,2825,740],{"class":384},[367,2827,394],{"class":373},[367,2829,969],{"class":384},[367,2831,498],{"class":373},[367,2833,2834],{"class":369,"line":407},[367,2835,404],{"emptyLinePlaceholder":403},[367,2837,2838],{"class":369,"line":414},[367,2839,2840],{"class":410},"// Émettre uniquement les états Success\n",[367,2842,2843,2845,2847,2849,2851,2853,2855,2857,2860,2862,2864,2866,2869,2871,2874,2877,2879,2882],{"class":369,"line":445},[367,2844,2801],{"class":384},[367,2846,778],{"class":373},[367,2848,2778],{"class":736},[367,2850,740],{"class":384},[367,2852,394],{"class":373},[367,2854,969],{"class":384},[367,2856,778],{"class":373},[367,2858,2859],{"class":736},"whereSuccess",[367,2861,784],{"class":384},[367,2863,778],{"class":373},[367,2865,2823],{"class":736},[367,2867,2868],{"class":384},"((s) ",[367,2870,769],{"class":373},[367,2872,2873],{"class":736}," print",[367,2875,2876],{"class":384},"(s",[367,2878,778],{"class":373},[367,2880,2881],{"class":384},"data))",[367,2883,498],{"class":373},[367,2885,2886],{"class":369,"line":450},[367,2887,404],{"emptyLinePlaceholder":403},[367,2889,2890],{"class":369,"line":456},[367,2891,2892],{"class":410},"// Émettre uniquement les états Failure\n",[367,2894,2895,2897,2899,2901,2903,2905,2907,2909,2912,2914,2916,2918,2921,2923,2926,2929,2931,2934],{"class":369,"line":483},[367,2896,2801],{"class":384},[367,2898,778],{"class":373},[367,2900,2778],{"class":736},[367,2902,740],{"class":384},[367,2904,394],{"class":373},[367,2906,969],{"class":384},[367,2908,778],{"class":373},[367,2910,2911],{"class":736},"whereError",[367,2913,784],{"class":384},[367,2915,778],{"class":373},[367,2917,2823],{"class":736},[367,2919,2920],{"class":384},"((f) ",[367,2922,769],{"class":373},[367,2924,2925],{"class":736}," logError",[367,2927,2928],{"class":384},"(f",[367,2930,778],{"class":373},[367,2932,2933],{"class":384},"error))",[367,2935,498],{"class":373},[367,2937,2938],{"class":369,"line":501},[367,2939,404],{"emptyLinePlaceholder":403},[367,2941,2942],{"class":369,"line":507},[367,2943,2944],{"class":410},"// Extraire les données comme T? (null pour les états sans données)\n",[367,2946,2947,2949,2951,2953,2955,2957,2959,2961,2964,2966,2968,2970,2972,2974,2976],{"class":369,"line":512},[367,2948,2801],{"class":384},[367,2950,778],{"class":373},[367,2952,2778],{"class":736},[367,2954,740],{"class":384},[367,2956,394],{"class":373},[367,2958,969],{"class":384},[367,2960,778],{"class":373},[367,2962,2963],{"class":736},"dataOrNull",[367,2965,784],{"class":384},[367,2967,778],{"class":373},[367,2969,2823],{"class":736},[367,2971,740],{"class":384},[367,2973,394],{"class":373},[367,2975,969],{"class":384},[367,2977,498],{"class":373},[367,2979,2980],{"class":369,"line":518},[367,2981,404],{"emptyLinePlaceholder":403},[367,2983,2984],{"class":369,"line":544},[367,2985,2986],{"class":410},"// Extraire les données : ignorer les états sans données\n",[367,2988,2989,2991,2993,2995,2997,2999,3001,3003,3005,3007,3009,3011,3014,3016,3019,3022],{"class":369,"line":556},[367,2990,2801],{"class":384},[367,2992,778],{"class":373},[367,2994,2778],{"class":736},[367,2996,740],{"class":384},[367,2998,394],{"class":373},[367,3000,969],{"class":384},[367,3002,778],{"class":373},[367,3004,1661],{"class":736},[367,3006,784],{"class":384},[367,3008,778],{"class":373},[367,3010,2823],{"class":736},[367,3012,3013],{"class":384},"((user) ",[367,3015,769],{"class":373},[367,3017,3018],{"class":736}," render",[367,3020,3021],{"class":384},"(user))",[367,3023,498],{"class":373},[367,3025,3026],{"class":369,"line":569},[367,3027,404],{"emptyLinePlaceholder":403},[367,3029,3030],{"class":369,"line":574},[367,3031,3032],{"class":410},"// Mapper le type de données\n",[367,3034,3035,3037,3039,3041,3043,3046,3048,3050,3053,3055,3057,3059,3061,3063,3065,3067,3069,3071],{"class":369,"line":579},[367,3036,2801],{"class":384},[367,3038,778],{"class":373},[367,3040,2778],{"class":736},[367,3042,385],{"class":384},[367,3044,3045],{"class":380},"List",[367,3047,385],{"class":384},[367,3049,1251],{"class":380},[367,3051,3052],{"class":384},">>(",[367,3054,394],{"class":373},[367,3056,969],{"class":384},[367,3058,778],{"class":373},[367,3060,2433],{"class":736},[367,3062,2383],{"class":384},[367,3064,769],{"class":373},[367,3066,2388],{"class":384},[367,3068,778],{"class":373},[367,3070,2444],{"class":384},[367,3072,498],{"class":373},[367,3074,3075],{"class":369,"line":585},[367,3076,404],{"emptyLinePlaceholder":403},[367,3078,3079],{"class":369,"line":611},[367,3080,3081],{"class":410},"// Retarder les émissions Loading pour éviter le scintillement sur les connexions rapides\n",[367,3083,3084,3086,3088,3090,3092,3094,3096,3098,3101,3103,3105,3108,3110,3113,3116],{"class":369,"line":624},[367,3085,2801],{"class":384},[367,3087,778],{"class":373},[367,3089,2778],{"class":736},[367,3091,740],{"class":384},[367,3093,394],{"class":373},[367,3095,969],{"class":384},[367,3097,778],{"class":373},[367,3099,3100],{"class":736},"delayLoading",[367,3102,740],{"class":384},[367,3104,1849],{"class":380},[367,3106,3107],{"class":384},"(milliseconds",[367,3109,797],{"class":373},[367,3111,3112],{"class":1262}," 300",[367,3114,3115],{"class":384},"))",[367,3117,498],{"class":373},[668,3119],{},[348,3121,3123],{"id":3122},"sérialisation","Sérialisation",[352,3125,3126,3127,902],{},"Persister et restaurer les états de requête entre les sessions avec ",[364,3128,3129],{},"QoraStateCodec",[356,3131,3134],{"className":358,"code":3132,"filename":3133,"language":361,"meta":362,"style":362},"final codec = QoraStateCodec\u003CUser>(\n  encode: (user) => user.toJson(),\n  decode: (json) => User.fromJson(json as Map\u003CString, dynamic>),\n);\n\n// Sauvegarder en stockage\nfinal json = codec.encodeState(state);\nawait prefs.setString('user_state', jsonEncode(json));\n\n// Restaurer depuis le stockage\nfinal jsonStr = prefs.getString('user_state');\nif (jsonStr != null) {\n  final restored = codec.decodeState(jsonDecode(jsonStr) as Map\u003CString, dynamic>);\n  client.setQueryData(['users', userId], (restored as Success\u003CUser>).data);\n}\n","cache_storage.dart",[364,3135,3136,3155,3179,3222,3228,3232,3237,3258,3286,3290,3295,3319,3333,3373,3414],{"__ignoreMap":362},[367,3137,3138,3140,3143,3145,3148,3150,3152],{"class":369,"line":370},[367,3139,418],{"class":417},[367,3141,3142],{"class":384}," codec ",[367,3144,1156],{"class":373},[367,3146,3147],{"class":380}," QoraStateCodec",[367,3149,385],{"class":384},[367,3151,1251],{"class":380},[367,3153,3154],{"class":384},">(\n",[367,3156,3157,3160,3162,3165,3167,3170,3172,3175,3177],{"class":369,"line":400},[367,3158,3159],{"class":384},"  encode",[367,3161,797],{"class":373},[367,3163,3164],{"class":384}," (user) ",[367,3166,769],{"class":373},[367,3168,3169],{"class":384}," user",[367,3171,778],{"class":373},[367,3173,3174],{"class":736},"toJson",[367,3176,784],{"class":384},[367,3178,787],{"class":373},[367,3180,3181,3184,3186,3189,3191,3193,3195,3198,3201,3203,3206,3208,3211,3214,3217,3220],{"class":369,"line":407},[367,3182,3183],{"class":384},"  decode",[367,3185,797],{"class":373},[367,3187,3188],{"class":384}," (json) ",[367,3190,769],{"class":373},[367,3192,1398],{"class":380},[367,3194,778],{"class":373},[367,3196,3197],{"class":736},"fromJson",[367,3199,3200],{"class":384},"(json ",[367,3202,1783],{"class":373},[367,3204,3205],{"class":380}," Map",[367,3207,385],{"class":384},[367,3209,3210],{"class":380},"String",[367,3212,3213],{"class":384},", ",[367,3215,3216],{"class":380},"dynamic",[367,3218,3219],{"class":384},">)",[367,3221,787],{"class":373},[367,3223,3224,3226],{"class":369,"line":414},[367,3225,969],{"class":384},[367,3227,498],{"class":373},[367,3229,3230],{"class":369,"line":445},[367,3231,404],{"emptyLinePlaceholder":403},[367,3233,3234],{"class":369,"line":450},[367,3235,3236],{"class":410},"// Sauvegarder en stockage\n",[367,3238,3239,3241,3244,3246,3249,3251,3254,3256],{"class":369,"line":456},[367,3240,418],{"class":417},[367,3242,3243],{"class":384}," json ",[367,3245,1156],{"class":373},[367,3247,3248],{"class":384}," codec",[367,3250,778],{"class":373},[367,3252,3253],{"class":736},"encodeState",[367,3255,1276],{"class":384},[367,3257,498],{"class":373},[367,3259,3260,3263,3266,3268,3271,3273,3276,3278,3281,3284],{"class":369,"line":483},[367,3261,3262],{"class":751},"await",[367,3264,3265],{"class":384}," prefs",[367,3267,778],{"class":373},[367,3269,3270],{"class":736},"setString",[367,3272,740],{"class":384},[367,3274,3275],{"class":956},"'user_state'",[367,3277,838],{"class":373},[367,3279,3280],{"class":736}," jsonEncode",[367,3282,3283],{"class":384},"(json))",[367,3285,498],{"class":373},[367,3287,3288],{"class":369,"line":501},[367,3289,404],{"emptyLinePlaceholder":403},[367,3291,3292],{"class":369,"line":507},[367,3293,3294],{"class":410},"// Restaurer depuis le stockage\n",[367,3296,3297,3299,3302,3304,3306,3308,3311,3313,3315,3317],{"class":369,"line":512},[367,3298,418],{"class":417},[367,3300,3301],{"class":384}," jsonStr ",[367,3303,1156],{"class":373},[367,3305,3265],{"class":384},[367,3307,778],{"class":373},[367,3309,3310],{"class":736},"getString",[367,3312,740],{"class":384},[367,3314,3275],{"class":956},[367,3316,969],{"class":384},[367,3318,498],{"class":373},[367,3320,3321,3324,3327,3329,3331],{"class":369,"line":518},[367,3322,3323],{"class":751},"if",[367,3325,3326],{"class":384}," (jsonStr ",[367,3328,810],{"class":373},[367,3330,937],{"class":373},[367,3332,1460],{"class":384},[367,3334,3335,3337,3340,3342,3344,3346,3349,3351,3354,3357,3359,3361,3363,3365,3367,3369,3371],{"class":369,"line":544},[367,3336,486],{"class":417},[367,3338,3339],{"class":384}," restored ",[367,3341,1156],{"class":373},[367,3343,3248],{"class":384},[367,3345,778],{"class":373},[367,3347,3348],{"class":736},"decodeState",[367,3350,740],{"class":384},[367,3352,3353],{"class":736},"jsonDecode",[367,3355,3356],{"class":384},"(jsonStr) ",[367,3358,1783],{"class":373},[367,3360,3205],{"class":380},[367,3362,385],{"class":384},[367,3364,3210],{"class":380},[367,3366,3213],{"class":384},[367,3368,3216],{"class":380},[367,3370,3219],{"class":384},[367,3372,498],{"class":373},[367,3374,3375,3378,3380,3383,3385,3387,3389,3392,3394,3397,3399,3401,3403,3405,3407,3409,3412],{"class":369,"line":556},[367,3376,3377],{"class":384},"  client",[367,3379,778],{"class":373},[367,3381,3382],{"class":736},"setQueryData",[367,3384,2083],{"class":384},[367,3386,1257],{"class":956},[367,3388,838],{"class":373},[367,3390,3391],{"class":384}," userId]",[367,3393,838],{"class":373},[367,3395,3396],{"class":384}," (restored ",[367,3398,1783],{"class":373},[367,3400,525],{"class":380},[367,3402,385],{"class":384},[367,3404,1251],{"class":380},[367,3406,3219],{"class":384},[367,3408,778],{"class":373},[367,3410,3411],{"class":384},"data)",[367,3413,498],{"class":373},[367,3415,3416],{"class":369,"line":569},[367,3417,504],{"class":384},[668,3419],{},[348,3421,187],{"id":3422},"tests",[356,3424,3427],{"className":358,"code":3425,"filename":3426,"language":361,"meta":362,"style":362},"import 'package:test/test.dart';\nimport 'package:mocktail/mocktail.dart';\nimport 'package:qora/qora.dart';\n\nclass MockUserApi extends Mock implements UserApi {}\n\nvoid main() {\n  late QoraClient client;\n  late MockUserApi api;\n\n  setUp(() {\n    api = MockUserApi();\n    client = QoraClient();\n  });\n\n  tearDown(() => client.dispose());\n\n  test('transitions vers Success sur un fetch réussi', () async {\n    when(() => api.getUser(1)).thenAnswer((_) async => User(id: 1, name: 'Alice'));\n\n    final states = \u003CQoraState\u003CUser>>[];\n    final sub = client\n        .watchQuery\u003CUser>(key: ['users', 1], fetcher: () => api.getUser(1))\n        .listen(states.add);\n\n    await Future\u003Cvoid>.delayed(Duration.zero);\n    await sub.cancel();\n\n    expect(states, [\n      isA\u003CInitial\u003CUser>>(),\n      isA\u003CLoading\u003CUser>>(),\n      isA\u003CSuccess\u003CUser>>(),\n    ]);\n    expect((states.last as Success\u003CUser>).data.name, 'Alice');\n  });\n\n  test('transitions vers Failure sur erreur après retries', () async {\n    when(() => api.getUser(1)).thenThrow(Exception('Erreur réseau'));\n\n    final failClient = QoraClient(\n      config: const QoraClientConfig(\n        defaultOptions: QoraOptions(retryCount: 0),\n      ),\n    );\n    addTearDown(failClient.dispose);\n\n    final states = \u003CQoraState\u003CUser>>[];\n    final sub = failClient\n        .watchQuery\u003CUser>(key: ['users', 1], fetcher: () => api.getUser(1))\n        .listen(states.add);\n\n    await Future\u003Cvoid>.delayed(Duration.zero);\n    await sub.cancel();\n\n    expect(states.last, isA\u003CFailure\u003CUser>>());\n  });\n}\n","test/user_repository_test.dart",[364,3428,3429,3439,3448,3457,3461,3484,3488,3498,3510,3521,3525,3533,3546,3559,3566,3570,3591,3595,3615,3671,3675,3703,3715,3767,3784,3789,3820,3837,3842,3854,3873,3890,3907,3915,3954,3961,3966,3984,4024,4029,4043,4058,4080,4087,4094,4110,4115,4140,4152,4199,4214,4219,4246,4261,4266,4296,4303],{"__ignoreMap":362},[367,3430,3431,3434,3437],{"class":369,"line":370},[367,3432,3433],{"class":1262},"import",[367,3435,3436],{"class":956}," 'package:test/test.dart'",[367,3438,498],{"class":373},[367,3440,3441,3443,3446],{"class":369,"line":400},[367,3442,3433],{"class":1262},[367,3444,3445],{"class":956}," 'package:mocktail/mocktail.dart'",[367,3447,498],{"class":373},[367,3449,3450,3452,3455],{"class":369,"line":407},[367,3451,3433],{"class":1262},[367,3453,3454],{"class":956}," 'package:qora/qora.dart'",[367,3456,498],{"class":373},[367,3458,3459],{"class":369,"line":414},[367,3460,404],{"emptyLinePlaceholder":403},[367,3462,3463,3466,3469,3472,3475,3478,3481],{"class":369,"line":445},[367,3464,3465],{"class":373},"class",[367,3467,3468],{"class":380}," MockUserApi",[367,3470,3471],{"class":373}," extends",[367,3473,3474],{"class":380}," Mock",[367,3476,3477],{"class":373}," implements",[367,3479,3480],{"class":380}," UserApi",[367,3482,3483],{"class":384}," {}\n",[367,3485,3486],{"class":369,"line":450},[367,3487,404],{"emptyLinePlaceholder":403},[367,3489,3490,3492,3495],{"class":369,"line":456},[367,3491,1012],{"class":417},[367,3493,3494],{"class":736}," main",[367,3496,3497],{"class":384},"() {\n",[367,3499,3500,3503,3506,3508],{"class":369,"line":483},[367,3501,3502],{"class":417},"  late",[367,3504,3505],{"class":380}," QoraClient",[367,3507,1241],{"class":384},[367,3509,498],{"class":373},[367,3511,3512,3514,3516,3519],{"class":369,"line":501},[367,3513,3502],{"class":417},[367,3515,3468],{"class":380},[367,3517,3518],{"class":384}," api",[367,3520,498],{"class":373},[367,3522,3523],{"class":369,"line":507},[367,3524,404],{"emptyLinePlaceholder":403},[367,3526,3527,3530],{"class":369,"line":512},[367,3528,3529],{"class":736},"  setUp",[367,3531,3532],{"class":384},"(() {\n",[367,3534,3535,3538,3540,3542,3544],{"class":369,"line":518},[367,3536,3537],{"class":384},"    api ",[367,3539,1156],{"class":373},[367,3541,3468],{"class":380},[367,3543,784],{"class":384},[367,3545,498],{"class":373},[367,3547,3548,3551,3553,3555,3557],{"class":369,"line":544},[367,3549,3550],{"class":384},"    client ",[367,3552,1156],{"class":373},[367,3554,3505],{"class":380},[367,3556,784],{"class":384},[367,3558,498],{"class":373},[367,3560,3561,3564],{"class":369,"line":556},[367,3562,3563],{"class":384},"  })",[367,3565,498],{"class":373},[367,3567,3568],{"class":369,"line":569},[367,3569,404],{"emptyLinePlaceholder":403},[367,3571,3572,3575,3578,3580,3582,3584,3587,3589],{"class":369,"line":574},[367,3573,3574],{"class":736},"  tearDown",[367,3576,3577],{"class":384},"(() ",[367,3579,769],{"class":373},[367,3581,1241],{"class":384},[367,3583,778],{"class":373},[367,3585,3586],{"class":736},"dispose",[367,3588,2401],{"class":384},[367,3590,498],{"class":373},[367,3592,3593],{"class":369,"line":579},[367,3594,404],{"emptyLinePlaceholder":403},[367,3596,3597,3600,3602,3605,3607,3609,3612],{"class":369,"line":585},[367,3598,3599],{"class":736},"  test",[367,3601,740],{"class":384},[367,3603,3604],{"class":956},"'transitions vers Success sur un fetch réussi'",[367,3606,838],{"class":373},[367,3608,1196],{"class":384},[367,3610,3611],{"class":751},"async",[367,3613,3614],{"class":384}," {\n",[367,3616,3617,3620,3622,3624,3626,3628,3631,3633,3636,3638,3640,3643,3646,3648,3651,3653,3655,3657,3659,3661,3663,3665,3667,3669],{"class":369,"line":611},[367,3618,3619],{"class":751},"    when",[367,3621,3577],{"class":384},[367,3623,769],{"class":373},[367,3625,3518],{"class":384},[367,3627,778],{"class":373},[367,3629,3630],{"class":736},"getUser",[367,3632,740],{"class":384},[367,3634,3635],{"class":1262},"1",[367,3637,3115],{"class":384},[367,3639,778],{"class":373},[367,3641,3642],{"class":736},"thenAnswer",[367,3644,3645],{"class":384},"((_) ",[367,3647,3611],{"class":751},[367,3649,3650],{"class":373}," =>",[367,3652,1398],{"class":380},[367,3654,1401],{"class":384},[367,3656,797],{"class":373},[367,3658,1406],{"class":1262},[367,3660,838],{"class":373},[367,3662,1411],{"class":384},[367,3664,797],{"class":373},[367,3666,1416],{"class":956},[367,3668,3115],{"class":384},[367,3670,498],{"class":373},[367,3672,3673],{"class":369,"line":624},[367,3674,404],{"emptyLinePlaceholder":403},[367,3676,3677,3680,3683,3685,3688,3690,3692,3694,3696,3698,3701],{"class":369,"line":639},[367,3678,3679],{"class":417},"    final",[367,3681,3682],{"class":384}," states ",[367,3684,1156],{"class":373},[367,3686,3687],{"class":373}," \u003C",[367,3689,211],{"class":380},[367,3691,385],{"class":384},[367,3693,1251],{"class":380},[367,3695,1792],{"class":384},[367,3697,1792],{"class":373},[367,3699,3700],{"class":384},"[]",[367,3702,498],{"class":373},[367,3704,3705,3707,3710,3712],{"class":369,"line":652},[367,3706,3679],{"class":417},[367,3708,3709],{"class":384}," sub ",[367,3711,1156],{"class":373},[367,3713,3714],{"class":384}," client\n",[367,3716,3718,3721,3723,3725,3727,3730,3732,3734,3736,3738,3740,3743,3745,3748,3750,3752,3754,3756,3758,3760,3762,3764],{"class":369,"line":3717},23,[367,3719,3720],{"class":373},"        .",[367,3722,2778],{"class":736},[367,3724,385],{"class":384},[367,3726,1251],{"class":380},[367,3728,3729],{"class":384},">(key",[367,3731,797],{"class":373},[367,3733,829],{"class":384},[367,3735,1257],{"class":956},[367,3737,838],{"class":373},[367,3739,1406],{"class":1262},[367,3741,3742],{"class":384},"]",[367,3744,838],{"class":373},[367,3746,3747],{"class":384}," fetcher",[367,3749,797],{"class":373},[367,3751,1196],{"class":384},[367,3753,769],{"class":373},[367,3755,3518],{"class":384},[367,3757,778],{"class":373},[367,3759,3630],{"class":736},[367,3761,740],{"class":384},[367,3763,3635],{"class":1262},[367,3765,3766],{"class":384},"))\n",[367,3768,3770,3772,3774,3777,3779,3782],{"class":369,"line":3769},24,[367,3771,3720],{"class":373},[367,3773,2823],{"class":736},[367,3775,3776],{"class":384},"(states",[367,3778,778],{"class":373},[367,3780,3781],{"class":384},"add)",[367,3783,498],{"class":373},[367,3785,3787],{"class":369,"line":3786},25,[367,3788,404],{"emptyLinePlaceholder":403},[367,3790,3792,3795,3798,3800,3802,3804,3806,3809,3811,3813,3815,3818],{"class":369,"line":3791},26,[367,3793,3794],{"class":751},"    await",[367,3796,3797],{"class":380}," Future",[367,3799,385],{"class":384},[367,3801,1012],{"class":417},[367,3803,1792],{"class":384},[367,3805,778],{"class":373},[367,3807,3808],{"class":736},"delayed",[367,3810,740],{"class":384},[367,3812,1849],{"class":380},[367,3814,778],{"class":373},[367,3816,3817],{"class":384},"zero)",[367,3819,498],{"class":373},[367,3821,3823,3825,3828,3830,3833,3835],{"class":369,"line":3822},27,[367,3824,3794],{"class":751},[367,3826,3827],{"class":384}," sub",[367,3829,778],{"class":373},[367,3831,3832],{"class":736},"cancel",[367,3834,784],{"class":384},[367,3836,498],{"class":373},[367,3838,3840],{"class":369,"line":3839},28,[367,3841,404],{"emptyLinePlaceholder":403},[367,3843,3845,3848,3850,3852],{"class":369,"line":3844},29,[367,3846,3847],{"class":736},"    expect",[367,3849,3776],{"class":384},[367,3851,838],{"class":373},[367,3853,924],{"class":384},[367,3855,3857,3860,3862,3864,3866,3868,3871],{"class":369,"line":3856},30,[367,3858,3859],{"class":736},"      isA",[367,3861,385],{"class":384},[367,3863,1220],{"class":380},[367,3865,385],{"class":384},[367,3867,1251],{"class":380},[367,3869,3870],{"class":384},">>()",[367,3872,787],{"class":373},[367,3874,3876,3878,3880,3882,3884,3886,3888],{"class":369,"line":3875},31,[367,3877,3859],{"class":736},[367,3879,385],{"class":384},[367,3881,699],{"class":380},[367,3883,385],{"class":384},[367,3885,1251],{"class":380},[367,3887,3870],{"class":384},[367,3889,787],{"class":373},[367,3891,3893,3895,3897,3899,3901,3903,3905],{"class":369,"line":3892},32,[367,3894,3859],{"class":736},[367,3896,385],{"class":384},[367,3898,1655],{"class":380},[367,3900,385],{"class":384},[367,3902,1251],{"class":380},[367,3904,3870],{"class":384},[367,3906,787],{"class":373},[367,3908,3910,3913],{"class":369,"line":3909},33,[367,3911,3912],{"class":384},"    ])",[367,3914,498],{"class":373},[367,3916,3918,3920,3923,3925,3928,3930,3932,3934,3936,3938,3940,3942,3944,3946,3948,3950,3952],{"class":369,"line":3917},34,[367,3919,3847],{"class":736},[367,3921,3922],{"class":384},"((states",[367,3924,778],{"class":373},[367,3926,3927],{"class":384},"last ",[367,3929,1783],{"class":373},[367,3931,525],{"class":380},[367,3933,385],{"class":384},[367,3935,1251],{"class":380},[367,3937,3219],{"class":384},[367,3939,778],{"class":373},[367,3941,1661],{"class":384},[367,3943,778],{"class":373},[367,3945,2547],{"class":384},[367,3947,838],{"class":373},[367,3949,1416],{"class":956},[367,3951,969],{"class":384},[367,3953,498],{"class":373},[367,3955,3957,3959],{"class":369,"line":3956},35,[367,3958,3563],{"class":384},[367,3960,498],{"class":373},[367,3962,3964],{"class":369,"line":3963},36,[367,3965,404],{"emptyLinePlaceholder":403},[367,3967,3969,3971,3973,3976,3978,3980,3982],{"class":369,"line":3968},37,[367,3970,3599],{"class":736},[367,3972,740],{"class":384},[367,3974,3975],{"class":956},"'transitions vers Failure sur erreur après retries'",[367,3977,838],{"class":373},[367,3979,1196],{"class":384},[367,3981,3611],{"class":751},[367,3983,3614],{"class":384},[367,3985,3987,3989,3991,3993,3995,3997,3999,4001,4003,4005,4007,4010,4012,4015,4017,4020,4022],{"class":369,"line":3986},38,[367,3988,3619],{"class":751},[367,3990,3577],{"class":384},[367,3992,769],{"class":373},[367,3994,3518],{"class":384},[367,3996,778],{"class":373},[367,3998,3630],{"class":736},[367,4000,740],{"class":384},[367,4002,3635],{"class":1262},[367,4004,3115],{"class":384},[367,4006,778],{"class":373},[367,4008,4009],{"class":736},"thenThrow",[367,4011,740],{"class":384},[367,4013,4014],{"class":380},"Exception",[367,4016,740],{"class":384},[367,4018,4019],{"class":956},"'Erreur réseau'",[367,4021,3115],{"class":384},[367,4023,498],{"class":373},[367,4025,4027],{"class":369,"line":4026},39,[367,4028,404],{"emptyLinePlaceholder":403},[367,4030,4032,4034,4037,4039,4041],{"class":369,"line":4031},40,[367,4033,3679],{"class":417},[367,4035,4036],{"class":384}," failClient ",[367,4038,1156],{"class":373},[367,4040,3505],{"class":380},[367,4042,914],{"class":384},[367,4044,4046,4049,4051,4053,4056],{"class":369,"line":4045},41,[367,4047,4048],{"class":384},"      config",[367,4050,797],{"class":373},[367,4052,772],{"class":417},[367,4054,4055],{"class":380}," QoraClientConfig",[367,4057,914],{"class":384},[367,4059,4061,4064,4066,4069,4072,4074,4076,4078],{"class":369,"line":4060},42,[367,4062,4063],{"class":384},"        defaultOptions",[367,4065,797],{"class":373},[367,4067,4068],{"class":380}," QoraOptions",[367,4070,4071],{"class":384},"(retryCount",[367,4073,797],{"class":373},[367,4075,1507],{"class":1262},[367,4077,969],{"class":384},[367,4079,787],{"class":373},[367,4081,4083,4085],{"class":369,"line":4082},43,[367,4084,983],{"class":384},[367,4086,787],{"class":373},[367,4088,4090,4092],{"class":369,"line":4089},44,[367,4091,1559],{"class":384},[367,4093,498],{"class":373},[367,4095,4097,4100,4103,4105,4108],{"class":369,"line":4096},45,[367,4098,4099],{"class":736},"    addTearDown",[367,4101,4102],{"class":384},"(failClient",[367,4104,778],{"class":373},[367,4106,4107],{"class":384},"dispose)",[367,4109,498],{"class":373},[367,4111,4113],{"class":369,"line":4112},46,[367,4114,404],{"emptyLinePlaceholder":403},[367,4116,4118,4120,4122,4124,4126,4128,4130,4132,4134,4136,4138],{"class":369,"line":4117},47,[367,4119,3679],{"class":417},[367,4121,3682],{"class":384},[367,4123,1156],{"class":373},[367,4125,3687],{"class":373},[367,4127,211],{"class":380},[367,4129,385],{"class":384},[367,4131,1251],{"class":380},[367,4133,1792],{"class":384},[367,4135,1792],{"class":373},[367,4137,3700],{"class":384},[367,4139,498],{"class":373},[367,4141,4143,4145,4147,4149],{"class":369,"line":4142},48,[367,4144,3679],{"class":417},[367,4146,3709],{"class":384},[367,4148,1156],{"class":373},[367,4150,4151],{"class":384}," failClient\n",[367,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175,4177,4179,4181,4183,4185,4187,4189,4191,4193,4195,4197],{"class":369,"line":4154},49,[367,4156,3720],{"class":373},[367,4158,2778],{"class":736},[367,4160,385],{"class":384},[367,4162,1251],{"class":380},[367,4164,3729],{"class":384},[367,4166,797],{"class":373},[367,4168,829],{"class":384},[367,4170,1257],{"class":956},[367,4172,838],{"class":373},[367,4174,1406],{"class":1262},[367,4176,3742],{"class":384},[367,4178,838],{"class":373},[367,4180,3747],{"class":384},[367,4182,797],{"class":373},[367,4184,1196],{"class":384},[367,4186,769],{"class":373},[367,4188,3518],{"class":384},[367,4190,778],{"class":373},[367,4192,3630],{"class":736},[367,4194,740],{"class":384},[367,4196,3635],{"class":1262},[367,4198,3766],{"class":384},[367,4200,4202,4204,4206,4208,4210,4212],{"class":369,"line":4201},50,[367,4203,3720],{"class":373},[367,4205,2823],{"class":736},[367,4207,3776],{"class":384},[367,4209,778],{"class":373},[367,4211,3781],{"class":384},[367,4213,498],{"class":373},[367,4215,4217],{"class":369,"line":4216},51,[367,4218,404],{"emptyLinePlaceholder":403},[367,4220,4222,4224,4226,4228,4230,4232,4234,4236,4238,4240,4242,4244],{"class":369,"line":4221},52,[367,4223,3794],{"class":751},[367,4225,3797],{"class":380},[367,4227,385],{"class":384},[367,4229,1012],{"class":417},[367,4231,1792],{"class":384},[367,4233,778],{"class":373},[367,4235,3808],{"class":736},[367,4237,740],{"class":384},[367,4239,1849],{"class":380},[367,4241,778],{"class":373},[367,4243,3817],{"class":384},[367,4245,498],{"class":373},[367,4247,4249,4251,4253,4255,4257,4259],{"class":369,"line":4248},53,[367,4250,3794],{"class":751},[367,4252,3827],{"class":384},[367,4254,778],{"class":373},[367,4256,3832],{"class":736},[367,4258,784],{"class":384},[367,4260,498],{"class":373},[367,4262,4264],{"class":369,"line":4263},54,[367,4265,404],{"emptyLinePlaceholder":403},[367,4267,4269,4271,4273,4275,4278,4280,4283,4285,4287,4289,4291,4294],{"class":369,"line":4268},55,[367,4270,3847],{"class":736},[367,4272,3776],{"class":384},[367,4274,778],{"class":373},[367,4276,4277],{"class":384},"last",[367,4279,838],{"class":373},[367,4281,4282],{"class":736}," isA",[367,4284,385],{"class":384},[367,4286,703],{"class":380},[367,4288,385],{"class":384},[367,4290,1251],{"class":380},[367,4292,4293],{"class":384},">>())",[367,4295,498],{"class":373},[367,4297,4299,4301],{"class":369,"line":4298},56,[367,4300,3563],{"class":384},[367,4302,498],{"class":373},[367,4304,4306],{"class":369,"line":4305},57,[367,4307,504],{"class":384},[668,4309],{},[348,4311,133],{"id":4312},"bonnes-pratiques",[683,4314,4316],{"id":4315},"à-faire","À faire",[356,4318,4320],{"className":358,"code":4319,"filename":1227,"language":361,"meta":362,"style":362},"// Traiter les quatre états de façon exhaustive\nswitch (state) {\n  case Initial(): return const Placeholder();\n  case Loading(): return const Spinner();\n  case Success(): return DataWidget(state.data);\n  case Failure(): return ErrorWidget(state.error);\n}\n\n// Utiliser previousData dans les états Loading et Failure\ncase Failure(:final error, :final previousData):\n  return previousData != null\n    ? DataWidget(previousData)\n    : ErrorScreen(error);\n",[364,4321,4322,4327,4333,4356,4377,4400,4424,4428,4432,4437,4461,4471,4481],{"__ignoreMap":362},[367,4323,4324],{"class":369,"line":370},[367,4325,4326],{"class":410},"// Traiter les quatre états de façon exhaustive\n",[367,4328,4329,4331],{"class":369,"line":400},[367,4330,665],{"class":751},[367,4332,758],{"class":384},[367,4334,4335,4338,4340,4342,4344,4347,4349,4352,4354],{"class":369,"line":407},[367,4336,4337],{"class":751},"  case",[367,4339,423],{"class":380},[367,4341,784],{"class":384},[367,4343,797],{"class":373},[367,4345,4346],{"class":751}," return",[367,4348,772],{"class":417},[367,4350,4351],{"class":380}," Placeholder",[367,4353,784],{"class":384},[367,4355,498],{"class":373},[367,4357,4358,4360,4362,4364,4366,4368,4370,4373,4375],{"class":369,"line":414},[367,4359,4337],{"class":751},[367,4361,463],{"class":380},[367,4363,784],{"class":384},[367,4365,797],{"class":373},[367,4367,4346],{"class":751},[367,4369,772],{"class":417},[367,4371,4372],{"class":380}," Spinner",[367,4374,784],{"class":384},[367,4376,498],{"class":373},[367,4378,4379,4381,4383,4385,4387,4389,4392,4394,4396,4398],{"class":369,"line":445},[367,4380,4337],{"class":751},[367,4382,525],{"class":380},[367,4384,784],{"class":384},[367,4386,797],{"class":373},[367,4388,4346],{"class":751},[367,4390,4391],{"class":380}," DataWidget",[367,4393,1293],{"class":384},[367,4395,778],{"class":373},[367,4397,3411],{"class":384},[367,4399,498],{"class":373},[367,4401,4402,4404,4406,4408,4410,4412,4415,4417,4419,4422],{"class":369,"line":450},[367,4403,4337],{"class":751},[367,4405,592],{"class":380},[367,4407,784],{"class":384},[367,4409,797],{"class":373},[367,4411,4346],{"class":751},[367,4413,4414],{"class":380}," ErrorWidget",[367,4416,1293],{"class":384},[367,4418,778],{"class":373},[367,4420,4421],{"class":384},"error)",[367,4423,498],{"class":373},[367,4425,4426],{"class":369,"line":456},[367,4427,504],{"class":384},[367,4429,4430],{"class":369,"line":483},[367,4431,404],{"emptyLinePlaceholder":403},[367,4433,4434],{"class":369,"line":501},[367,4435,4436],{"class":410},"// Utiliser previousData dans les états Loading et Failure\n",[367,4438,4439,4441,4443,4445,4447,4449,4451,4453,4455,4457,4459],{"class":369,"line":507},[367,4440,1432],{"class":751},[367,4442,592],{"class":380},[367,4444,740],{"class":384},[367,4446,797],{"class":373},[367,4448,418],{"class":417},[367,4450,619],{"class":384},[367,4452,838],{"class":373},[367,4454,902],{"class":373},[367,4456,418],{"class":417},[367,4458,1443],{"class":384},[367,4460,1446],{"class":373},[367,4462,4463,4465,4467,4469],{"class":369,"line":512},[367,4464,752],{"class":751},[367,4466,807],{"class":384},[367,4468,810],{"class":373},[367,4470,813],{"class":373},[367,4472,4473,4476,4478],{"class":369,"line":518},[367,4474,4475],{"class":373},"    ?",[367,4477,4391],{"class":380},[367,4479,4480],{"class":384},"(previousData)\n",[367,4482,4483,4486,4489,4492],{"class":369,"line":544},[367,4484,4485],{"class":373},"    :",[367,4487,4488],{"class":380}," ErrorScreen",[367,4490,4491],{"class":384},"(error)",[367,4493,498],{"class":373},[683,4495,4497],{"id":4496},"à-éviter","À éviter",[356,4499,4501],{"className":358,"code":4500,"filename":1227,"language":361,"meta":362,"style":362},"// Gestion partielle des états\nif (state is Success) render(state.data); // Failure est ignoré silencieusement\n\n// Cast non sécurisé sans vérification de type préalable\nfinal data = (state as Success\u003CUser>).data; // Lève une exception sur Loading ou Failure\n",[364,4502,4503,4508,4536,4540,4545],{"__ignoreMap":362},[367,4504,4505],{"class":369,"line":370},[367,4506,4507],{"class":410},"// Gestion partielle des états\n",[367,4509,4510,4512,4515,4518,4520,4522,4525,4527,4529,4531,4533],{"class":369,"line":400},[367,4511,3323],{"class":751},[367,4513,4514],{"class":384}," (state ",[367,4516,4517],{"class":373},"is",[367,4519,525],{"class":380},[367,4521,940],{"class":384},[367,4523,4524],{"class":736},"render",[367,4526,1293],{"class":384},[367,4528,778],{"class":373},[367,4530,3411],{"class":384},[367,4532,1279],{"class":373},[367,4534,4535],{"class":410}," // Failure est ignoré silencieusement\n",[367,4537,4538],{"class":369,"line":407},[367,4539,404],{"emptyLinePlaceholder":403},[367,4541,4542],{"class":369,"line":414},[367,4543,4544],{"class":410},"// Cast non sécurisé sans vérification de type préalable\n",[367,4546,4547,4549,4552,4554,4556,4558,4560,4562,4564,4566,4568,4570,4572],{"class":369,"line":445},[367,4548,418],{"class":417},[367,4550,4551],{"class":384}," data ",[367,4553,1156],{"class":373},[367,4555,4514],{"class":384},[367,4557,1783],{"class":373},[367,4559,525],{"class":380},[367,4561,385],{"class":384},[367,4563,1251],{"class":380},[367,4565,3219],{"class":384},[367,4567,778],{"class":373},[367,4569,1661],{"class":384},[367,4571,1279],{"class":373},[367,4573,4574],{"class":410}," // Lève une exception sur Loading ou Failure\n",[668,4576],{},[348,4578,4580],{"id":4579},"étapes-suivantes","Étapes suivantes",[4582,4583,4584,4591,4597],"ul",{},[691,4585,4586,4590],{},[4587,4588,67],"a",{"href":4589},"./caching"," : Éviction LRU, timers GC et cycle de vie du cache",[691,4592,4593,4596],{},[4587,4594,72],{"href":4595},"./stale-while-revalidate"," : Revalidation en arrière-plan",[691,4598,4599,4602],{},[4587,4600,4601],{"href":212},"Référence API QoraState"," : Documentation API complète",[4604,4605,4606],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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 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":362,"searchDepth":400,"depth":400,"links":4608},[4609,4610,4613,4620,4621,4622,4623,4624,4630,4631,4632,4633,4637],{"id":350,"depth":400,"text":243},{"id":672,"depth":400,"text":673,"children":4611},[4612],{"id":685,"depth":407,"text":686},{"id":717,"depth":400,"text":718,"children":4614},[4615,4616,4618],{"id":721,"depth":407,"text":722},{"id":999,"depth":407,"text":4617},"when : dispatch d'effets de bord",{"id":1124,"depth":407,"text":4619},"maybeWhen : mapping vers une valeur avec fallback",{"id":1217,"depth":400,"text":1220},{"id":1343,"depth":400,"text":699},{"id":1652,"depth":400,"text":1655},{"id":1934,"depth":400,"text":703},{"id":2176,"depth":400,"text":2177,"children":4625},[4626,4627,4628,4629],{"id":2190,"depth":407,"text":2191},{"id":2247,"depth":407,"text":2248},{"id":2340,"depth":407,"text":2341},{"id":2593,"depth":407,"text":2594},{"id":2772,"depth":400,"text":2773},{"id":3122,"depth":400,"text":3123},{"id":3422,"depth":400,"text":187},{"id":4312,"depth":400,"text":133,"children":4634},[4635,4636],{"id":4315,"depth":407,"text":4316},{"id":4496,"depth":407,"text":4497},{"id":4579,"depth":400,"text":4580},"Les états des requêtes représentent le cycle de vie des opérations de récupération de données. Qora utilise des classes scellées pour fournir une gestion des états exhaustive et sûre au niveau des types, éliminant des catégories entières d'erreurs à l'exécution.","md",null,{},{"icon":65},{"title":62,"description":4638},"KqDHdtLArM2lqfMkq3ze6UKZhnvosTw5H6hT6RYQEa8",[4646,4648],{"title":57,"path":58,"stem":59,"description":4647,"icon":60,"children":-1},"Les clés de requête sont le fondement du système de cache de Qora. Elles identifient les requêtes de façon unique et permettent la gestion automatique du cache, l'invalidation et le refetch.",{"title":67,"path":68,"stem":69,"description":4649,"icon":70,"children":-1},"Le cache de Qora permet un accès instantané aux données. Apprenez comment les entrées de cache sont créées, vieillissent et sont collectées par le GC, comment le partage structurel évite les reconstructions inutiles, et comment contrôler chaque comportement.",1794040406977]