[{"data":1,"prerenderedAt":3873},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-third-party-with-dio":342,"-fr-third-party-with-dio-surround":3868},[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":283,"body":344,"description":3858,"extension":3859,"links":3860,"meta":3861,"navigation":459,"path":284,"seo":3862,"stem":285,"__hash__":3867},"docs_fr/fr/07.third-party/5.with-dio.md",{"type":345,"value":346,"toc":3845},"minimark",[347,351,354,358,406,408,412,426,740,931,933,937,959,964,1545,1549,1763,1765,1769,1772,1991,1993,1997,2000,2742,2755,2757,2761,2764,3088,3388,3390,3394,3408,3786,3788,3792,3841],[348,349,350],"p",{},"Dio est le client HTTP le plus populaire dans l'écosystème Dart/Flutter. Ce guide couvre l'utilisation idiomatique de Qora+Dio: mapping d'erreurs, intercepteurs pour les tokens d'authentification, et des fonctions fetcher prêtes à l'emploi.",[352,353],"hr",{},[355,356,98],"h2",{"id":357},"configuration",[359,360,366],"pre",{"className":361,"code":362,"filename":363,"language":364,"meta":365,"style":365},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependencies:\n  qora: ^1.3.1\n  dio: ^5.0.0\n","pubspec.yaml","yaml","",[367,368,369,382,395],"code",{"__ignoreMap":365},[370,371,374,378],"span",{"class":372,"line":373},"line",1,[370,375,377],{"class":376},"swJcz","dependencies",[370,379,381],{"class":380},"sMK4o",":\n",[370,383,385,388,391],{"class":372,"line":384},2,[370,386,387],{"class":376},"  qora",[370,389,390],{"class":380},":",[370,392,394],{"class":393},"sfazB"," ^1.3.1\n",[370,396,398,401,403],{"class":372,"line":397},3,[370,399,400],{"class":376},"  dio",[370,402,390],{"class":380},[370,404,405],{"class":393}," ^5.0.0\n",[352,407],{},[355,409,411],{"id":410},"pattern-de-base-dio-comme-fetcher","Pattern de Base: Dio comme Fetcher",[348,413,414,415,418,419,421,422,425],{},"La fonction fetcher passée à ",[367,416,417],{},"QoraClient.fetchQuery"," ou ",[367,420,108],{}," doit utiliser Dio pour l'appel HTTP et laisser les exceptions Dio se propager. Qora les intercepte, applique la logique de retry et expose l'erreur via ",[367,423,424],{},"QoraState\u003CFailure>",".",[359,427,432],{"className":428,"code":429,"filename":430,"language":431,"meta":365,"style":365},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:dio/dio.dart';\nimport 'package:qora/qora.dart';\n\nfinal api = Dio(BaseOptions(baseUrl: 'https://api.example.com'));\n\nclass UserApi {\n  Future\u003CUser> getUser(String id) async {\n    final res = await api.get('/users/$id');\n    return User.fromJson(res.data);\n  }\n\n  Future\u003CList\u003CUser>> listUsers() async {\n    final res = await api.get('/users');\n    return (res.data as List).map((j) => User.fromJson(j)).toList();\n  }\n}\n","lib/data/user_api.dart","dart",[367,433,434,446,455,461,498,503,515,548,590,614,620,625,652,678,729,734],{"__ignoreMap":365},[370,435,436,440,443],{"class":372,"line":373},[370,437,439],{"class":438},"sbssI","import",[370,441,442],{"class":393}," 'package:dio/dio.dart'",[370,444,445],{"class":380},";\n",[370,447,448,450,453],{"class":372,"line":384},[370,449,439],{"class":438},[370,451,452],{"class":393}," 'package:qora/qora.dart'",[370,454,445],{"class":380},[370,456,457],{"class":372,"line":397},[370,458,460],{"emptyLinePlaceholder":459},true,"\n",[370,462,464,468,472,475,479,482,485,488,490,493,496],{"class":372,"line":463},4,[370,465,467],{"class":466},"spNyl","final",[370,469,471],{"class":470},"sTEyZ"," api ",[370,473,474],{"class":380},"=",[370,476,478],{"class":477},"sBMFI"," Dio",[370,480,481],{"class":470},"(",[370,483,484],{"class":477},"BaseOptions",[370,486,487],{"class":470},"(baseUrl",[370,489,390],{"class":380},[370,491,492],{"class":393}," 'https://api.example.com'",[370,494,495],{"class":470},"))",[370,497,445],{"class":380},[370,499,501],{"class":372,"line":500},5,[370,502,460],{"emptyLinePlaceholder":459},[370,504,506,509,512],{"class":372,"line":505},6,[370,507,508],{"class":380},"class",[370,510,511],{"class":477}," UserApi",[370,513,514],{"class":470}," {\n",[370,516,518,521,524,527,530,534,536,539,542,546],{"class":372,"line":517},7,[370,519,520],{"class":477},"  Future",[370,522,523],{"class":470},"\u003C",[370,525,526],{"class":477},"User",[370,528,529],{"class":470},"> ",[370,531,533],{"class":532},"s2Zo4","getUser",[370,535,481],{"class":470},[370,537,538],{"class":477},"String",[370,540,541],{"class":470}," id) ",[370,543,545],{"class":544},"s7zQu","async",[370,547,514],{"class":470},[370,549,551,554,557,559,562,565,567,570,572,575,578,582,585,588],{"class":372,"line":550},8,[370,552,553],{"class":466},"    final",[370,555,556],{"class":470}," res ",[370,558,474],{"class":380},[370,560,561],{"class":544}," await",[370,563,564],{"class":470}," api",[370,566,425],{"class":380},[370,568,569],{"class":532},"get",[370,571,481],{"class":470},[370,573,574],{"class":393},"'/users/",[370,576,577],{"class":470},"$",[370,579,581],{"class":580},"sHdIc","id",[370,583,584],{"class":393},"'",[370,586,587],{"class":470},")",[370,589,445],{"class":380},[370,591,593,596,599,601,604,607,609,612],{"class":372,"line":592},9,[370,594,595],{"class":544},"    return",[370,597,598],{"class":477}," User",[370,600,425],{"class":380},[370,602,603],{"class":532},"fromJson",[370,605,606],{"class":470},"(res",[370,608,425],{"class":380},[370,610,611],{"class":470},"data)",[370,613,445],{"class":380},[370,615,617],{"class":372,"line":616},10,[370,618,619],{"class":470},"  }\n",[370,621,623],{"class":372,"line":622},11,[370,624,460],{"emptyLinePlaceholder":459},[370,626,628,630,632,635,637,639,642,645,648,650],{"class":372,"line":627},12,[370,629,520],{"class":477},[370,631,523],{"class":470},[370,633,634],{"class":477},"List",[370,636,523],{"class":470},[370,638,526],{"class":477},[370,640,641],{"class":470},">> ",[370,643,644],{"class":532},"listUsers",[370,646,647],{"class":470},"() ",[370,649,545],{"class":544},[370,651,514],{"class":470},[370,653,655,657,659,661,663,665,667,669,671,674,676],{"class":372,"line":654},13,[370,656,553],{"class":466},[370,658,556],{"class":470},[370,660,474],{"class":380},[370,662,561],{"class":544},[370,664,564],{"class":470},[370,666,425],{"class":380},[370,668,569],{"class":532},[370,670,481],{"class":470},[370,672,673],{"class":393},"'/users'",[370,675,587],{"class":470},[370,677,445],{"class":380},[370,679,681,683,686,688,691,694,697,699,701,704,707,710,712,714,716,719,721,724,727],{"class":372,"line":680},14,[370,682,595],{"class":544},[370,684,685],{"class":470}," (res",[370,687,425],{"class":380},[370,689,690],{"class":470},"data ",[370,692,693],{"class":380},"as",[370,695,696],{"class":477}," List",[370,698,587],{"class":470},[370,700,425],{"class":380},[370,702,703],{"class":532},"map",[370,705,706],{"class":470},"((j) ",[370,708,709],{"class":380},"=>",[370,711,598],{"class":477},[370,713,425],{"class":380},[370,715,603],{"class":532},[370,717,718],{"class":470},"(j))",[370,720,425],{"class":380},[370,722,723],{"class":532},"toList",[370,725,726],{"class":470},"()",[370,728,445],{"class":380},[370,730,732],{"class":372,"line":731},15,[370,733,619],{"class":470},[370,735,737],{"class":372,"line":736},16,[370,738,739],{"class":470},"}\n",[359,741,744],{"className":428,"code":742,"filename":743,"language":431,"meta":365,"style":365},"QoraBuilder\u003CUser>(\n  queryKey: ['user', userId],\n  fetcher: () => userApi.getUser(userId),\n  builder: (context, state, _) => switch (state) {\n    Success(:final data) => UserCard(data),\n    Loading() => const CircularProgressIndicator(),\n    Failure(:final error) => ErrorView(error),\n    _ => const SizedBox.shrink(),\n  },\n)\n","lib/features/user_screen.dart",[367,745,746,757,779,803,831,855,874,898,919,926],{"__ignoreMap":365},[370,747,748,750,752,754],{"class":372,"line":373},[370,749,108],{"class":477},[370,751,523],{"class":470},[370,753,526],{"class":477},[370,755,756],{"class":470},">(\n",[370,758,759,762,764,767,770,773,776],{"class":372,"line":384},[370,760,761],{"class":470},"  queryKey",[370,763,390],{"class":380},[370,765,766],{"class":470}," [",[370,768,769],{"class":393},"'user'",[370,771,772],{"class":380},",",[370,774,775],{"class":470}," userId]",[370,777,778],{"class":380},",\n",[370,780,781,784,786,789,791,794,796,798,801],{"class":372,"line":397},[370,782,783],{"class":470},"  fetcher",[370,785,390],{"class":380},[370,787,788],{"class":470}," () ",[370,790,709],{"class":380},[370,792,793],{"class":470}," userApi",[370,795,425],{"class":380},[370,797,533],{"class":532},[370,799,800],{"class":470},"(userId)",[370,802,778],{"class":380},[370,804,805,808,810,813,815,818,820,823,825,828],{"class":372,"line":463},[370,806,807],{"class":470},"  builder",[370,809,390],{"class":380},[370,811,812],{"class":470}," (context",[370,814,772],{"class":380},[370,816,817],{"class":470}," state",[370,819,772],{"class":380},[370,821,822],{"class":470}," _) ",[370,824,709],{"class":380},[370,826,827],{"class":544}," switch",[370,829,830],{"class":470}," (state) {\n",[370,832,833,836,838,840,842,845,847,850,853],{"class":372,"line":500},[370,834,835],{"class":477},"    Success",[370,837,481],{"class":470},[370,839,390],{"class":380},[370,841,467],{"class":466},[370,843,844],{"class":470}," data) ",[370,846,709],{"class":380},[370,848,849],{"class":477}," UserCard",[370,851,852],{"class":470},"(data)",[370,854,778],{"class":380},[370,856,857,860,862,864,867,870,872],{"class":372,"line":505},[370,858,859],{"class":477},"    Loading",[370,861,647],{"class":470},[370,863,709],{"class":380},[370,865,866],{"class":466}," const",[370,868,869],{"class":477}," CircularProgressIndicator",[370,871,726],{"class":470},[370,873,778],{"class":380},[370,875,876,879,881,883,885,888,890,893,896],{"class":372,"line":517},[370,877,878],{"class":477},"    Failure",[370,880,481],{"class":470},[370,882,390],{"class":380},[370,884,467],{"class":466},[370,886,887],{"class":470}," error) ",[370,889,709],{"class":380},[370,891,892],{"class":477}," ErrorView",[370,894,895],{"class":470},"(error)",[370,897,778],{"class":380},[370,899,900,903,905,907,910,912,915,917],{"class":372,"line":550},[370,901,902],{"class":470},"    _ ",[370,904,709],{"class":380},[370,906,866],{"class":466},[370,908,909],{"class":477}," SizedBox",[370,911,425],{"class":380},[370,913,914],{"class":532},"shrink",[370,916,726],{"class":470},[370,918,778],{"class":380},[370,920,921,924],{"class":372,"line":592},[370,922,923],{"class":470},"  }",[370,925,778],{"class":380},[370,927,928],{"class":372,"line":616},[370,929,930],{"class":470},")\n",[352,932],{},[355,934,936],{"id":935},"mapping-derreurs-dioexception-vers-erreurs-applicatives","Mapping d'Erreurs: DioException vers Erreurs Applicatives",[348,938,939,940,943,944,947,948,951,952,954,955,958],{},"Par défaut, Qora stocke le ",[367,941,942],{},"DioException"," brut dans l'état ",[367,945,946],{},"Failure",". Enregistrez un ",[367,949,950],{},"errorMapper"," global sur ",[367,953,220],{}," pour convertir les erreurs Dio en erreurs applicatives typées, ou utilisez ",[367,956,957],{},"QoraOptions.transformError"," par requête.",[960,961,963],"h3",{"id":962},"error-mapper-global","Error Mapper Global",[359,965,968],{"className":428,"code":966,"filename":967,"language":431,"meta":365,"style":365},"import 'package:dio/dio.dart';\nimport 'package:qora/qora.dart';\n\n/// Erreur applicative typée. `errorMapper` doit retourner une `QoraException`, d'où l'héritage.\nclass AppError extends QoraException {\n  final int? statusCode;\n  const AppError(super.message, {this.statusCode, super.originalError, super.stackTrace});\n}\n\nfinal client = QoraClient(\n  config: QoraClientConfig(\n    errorMapper: (Object error, StackTrace? stackTrace) {\n      if (error is DioException) {\n        return switch (error.type) {\n          DioExceptionType.connectionTimeout => AppError('Connection timed out', originalError: error),\n          DioExceptionType.receiveTimeout => AppError('Server is not responding', originalError: error),\n          DioExceptionType.badResponse => _mapHttpStatus(error),\n          DioExceptionType.connectionError => AppError('No internet connection', originalError: error),\n          _ => AppError(error.message ?? 'Request failed', originalError: error),\n        };\n      }\n      if (error is QoraException) return error;\n      return QoraException(error.toString(), originalError: error, stackTrace: stackTrace);\n    },\n  ),\n);\n\nAppError _mapHttpStatus(DioException error) {\n  final status = error.response?.statusCode ?? 0;\n  final message = error.response?.data?['message'] as String? ?? 'Request failed';\n  return AppError(message, statusCode: status, originalError: error);\n}\n","lib/core/qora_setup.dart",[367,969,970,978,986,990,1008,1023,1039,1085,1089,1093,1108,1120,1146,1163,1178,1209,1237,1256,1285,1319,1327,1333,1354,1391,1399,1407,1414,1419,1434,1464,1510,1540],{"__ignoreMap":365},[370,971,972,974,976],{"class":372,"line":373},[370,973,439],{"class":438},[370,975,442],{"class":393},[370,977,445],{"class":380},[370,979,980,982,984],{"class":372,"line":384},[370,981,439],{"class":438},[370,983,452],{"class":393},[370,985,445],{"class":380},[370,987,988],{"class":372,"line":397},[370,989,460],{"emptyLinePlaceholder":459},[370,991,992,996,999,1002,1005],{"class":372,"line":463},[370,993,995],{"class":994},"sHwdD","/// Erreur applicative typée. ",[370,997,998],{"class":580},"`errorMapper`",[370,1000,1001],{"class":994}," doit retourner une ",[370,1003,1004],{"class":580},"`QoraException`",[370,1006,1007],{"class":994},", d'où l'héritage.\n",[370,1009,1010,1012,1015,1018,1021],{"class":372,"line":500},[370,1011,508],{"class":380},[370,1013,1014],{"class":477}," AppError",[370,1016,1017],{"class":380}," extends",[370,1019,1020],{"class":477}," QoraException",[370,1022,514],{"class":470},[370,1024,1025,1028,1031,1034,1037],{"class":372,"line":505},[370,1026,1027],{"class":466},"  final",[370,1029,1030],{"class":477}," int",[370,1032,1033],{"class":380},"?",[370,1035,1036],{"class":470}," statusCode",[370,1038,445],{"class":380},[370,1040,1041,1044,1046,1049,1051,1054,1056,1059,1061,1064,1066,1069,1071,1074,1076,1078,1080,1083],{"class":372,"line":517},[370,1042,1043],{"class":466},"  const",[370,1045,1014],{"class":477},[370,1047,1048],{"class":470},"(super",[370,1050,425],{"class":380},[370,1052,1053],{"class":470},"message",[370,1055,772],{"class":380},[370,1057,1058],{"class":470}," {this",[370,1060,425],{"class":380},[370,1062,1063],{"class":470},"statusCode",[370,1065,772],{"class":380},[370,1067,1068],{"class":470}," super",[370,1070,425],{"class":380},[370,1072,1073],{"class":470},"originalError",[370,1075,772],{"class":380},[370,1077,1068],{"class":470},[370,1079,425],{"class":380},[370,1081,1082],{"class":470},"stackTrace})",[370,1084,445],{"class":380},[370,1086,1087],{"class":372,"line":550},[370,1088,739],{"class":470},[370,1090,1091],{"class":372,"line":592},[370,1092,460],{"emptyLinePlaceholder":459},[370,1094,1095,1097,1100,1102,1105],{"class":372,"line":616},[370,1096,467],{"class":466},[370,1098,1099],{"class":470}," client ",[370,1101,474],{"class":380},[370,1103,1104],{"class":477}," QoraClient",[370,1106,1107],{"class":470},"(\n",[370,1109,1110,1113,1115,1118],{"class":372,"line":622},[370,1111,1112],{"class":470},"  config",[370,1114,390],{"class":380},[370,1116,1117],{"class":477}," QoraClientConfig",[370,1119,1107],{"class":470},[370,1121,1122,1125,1127,1130,1133,1136,1138,1141,1143],{"class":372,"line":627},[370,1123,1124],{"class":470},"    errorMapper",[370,1126,390],{"class":380},[370,1128,1129],{"class":470}," (",[370,1131,1132],{"class":477},"Object",[370,1134,1135],{"class":470}," error",[370,1137,772],{"class":380},[370,1139,1140],{"class":477}," StackTrace",[370,1142,1033],{"class":380},[370,1144,1145],{"class":470}," stackTrace) {\n",[370,1147,1148,1151,1154,1157,1160],{"class":372,"line":654},[370,1149,1150],{"class":544},"      if",[370,1152,1153],{"class":470}," (error ",[370,1155,1156],{"class":380},"is",[370,1158,1159],{"class":477}," DioException",[370,1161,1162],{"class":470},") {\n",[370,1164,1165,1168,1170,1173,1175],{"class":372,"line":680},[370,1166,1167],{"class":544},"        return",[370,1169,827],{"class":544},[370,1171,1172],{"class":470}," (error",[370,1174,425],{"class":380},[370,1176,1177],{"class":470},"type) {\n",[370,1179,1180,1183,1185,1188,1190,1192,1194,1197,1199,1202,1204,1207],{"class":372,"line":731},[370,1181,1182],{"class":477},"          DioExceptionType",[370,1184,425],{"class":380},[370,1186,1187],{"class":470},"connectionTimeout ",[370,1189,709],{"class":380},[370,1191,1014],{"class":477},[370,1193,481],{"class":470},[370,1195,1196],{"class":393},"'Connection timed out'",[370,1198,772],{"class":380},[370,1200,1201],{"class":470}," originalError",[370,1203,390],{"class":380},[370,1205,1206],{"class":470}," error)",[370,1208,778],{"class":380},[370,1210,1211,1213,1215,1218,1220,1222,1224,1227,1229,1231,1233,1235],{"class":372,"line":736},[370,1212,1182],{"class":477},[370,1214,425],{"class":380},[370,1216,1217],{"class":470},"receiveTimeout ",[370,1219,709],{"class":380},[370,1221,1014],{"class":477},[370,1223,481],{"class":470},[370,1225,1226],{"class":393},"'Server is not responding'",[370,1228,772],{"class":380},[370,1230,1201],{"class":470},[370,1232,390],{"class":380},[370,1234,1206],{"class":470},[370,1236,778],{"class":380},[370,1238,1240,1242,1244,1247,1249,1252,1254],{"class":372,"line":1239},17,[370,1241,1182],{"class":477},[370,1243,425],{"class":380},[370,1245,1246],{"class":470},"badResponse ",[370,1248,709],{"class":380},[370,1250,1251],{"class":532}," _mapHttpStatus",[370,1253,895],{"class":470},[370,1255,778],{"class":380},[370,1257,1259,1261,1263,1266,1268,1270,1272,1275,1277,1279,1281,1283],{"class":372,"line":1258},18,[370,1260,1182],{"class":477},[370,1262,425],{"class":380},[370,1264,1265],{"class":470},"connectionError ",[370,1267,709],{"class":380},[370,1269,1014],{"class":477},[370,1271,481],{"class":470},[370,1273,1274],{"class":393},"'No internet connection'",[370,1276,772],{"class":380},[370,1278,1201],{"class":470},[370,1280,390],{"class":380},[370,1282,1206],{"class":470},[370,1284,778],{"class":380},[370,1286,1288,1291,1293,1295,1298,1300,1303,1306,1309,1311,1313,1315,1317],{"class":372,"line":1287},19,[370,1289,1290],{"class":470},"          _ ",[370,1292,709],{"class":380},[370,1294,1014],{"class":477},[370,1296,1297],{"class":470},"(error",[370,1299,425],{"class":380},[370,1301,1302],{"class":470},"message ",[370,1304,1305],{"class":380},"??",[370,1307,1308],{"class":393}," 'Request failed'",[370,1310,772],{"class":380},[370,1312,1201],{"class":470},[370,1314,390],{"class":380},[370,1316,1206],{"class":470},[370,1318,778],{"class":380},[370,1320,1322,1325],{"class":372,"line":1321},20,[370,1323,1324],{"class":470},"        }",[370,1326,445],{"class":380},[370,1328,1330],{"class":372,"line":1329},21,[370,1331,1332],{"class":470},"      }\n",[370,1334,1336,1338,1340,1342,1344,1347,1350,1352],{"class":372,"line":1335},22,[370,1337,1150],{"class":544},[370,1339,1153],{"class":470},[370,1341,1156],{"class":380},[370,1343,1020],{"class":477},[370,1345,1346],{"class":470},") ",[370,1348,1349],{"class":544},"return",[370,1351,1135],{"class":470},[370,1353,445],{"class":380},[370,1355,1357,1360,1362,1364,1366,1369,1371,1373,1375,1377,1379,1381,1384,1386,1389],{"class":372,"line":1356},23,[370,1358,1359],{"class":544},"      return",[370,1361,1020],{"class":477},[370,1363,1297],{"class":470},[370,1365,425],{"class":380},[370,1367,1368],{"class":532},"toString",[370,1370,726],{"class":470},[370,1372,772],{"class":380},[370,1374,1201],{"class":470},[370,1376,390],{"class":380},[370,1378,1135],{"class":470},[370,1380,772],{"class":380},[370,1382,1383],{"class":470}," stackTrace",[370,1385,390],{"class":380},[370,1387,1388],{"class":470}," stackTrace)",[370,1390,445],{"class":380},[370,1392,1394,1397],{"class":372,"line":1393},24,[370,1395,1396],{"class":470},"    }",[370,1398,778],{"class":380},[370,1400,1402,1405],{"class":372,"line":1401},25,[370,1403,1404],{"class":470},"  )",[370,1406,778],{"class":380},[370,1408,1410,1412],{"class":372,"line":1409},26,[370,1411,587],{"class":470},[370,1413,445],{"class":380},[370,1415,1417],{"class":372,"line":1416},27,[370,1418,460],{"emptyLinePlaceholder":459},[370,1420,1422,1425,1427,1429,1431],{"class":372,"line":1421},28,[370,1423,1424],{"class":477},"AppError",[370,1426,1251],{"class":532},[370,1428,481],{"class":470},[370,1430,942],{"class":477},[370,1432,1433],{"class":470}," error) {\n",[370,1435,1437,1439,1442,1444,1446,1448,1451,1454,1457,1459,1462],{"class":372,"line":1436},29,[370,1438,1027],{"class":466},[370,1440,1441],{"class":470}," status ",[370,1443,474],{"class":380},[370,1445,1135],{"class":470},[370,1447,425],{"class":380},[370,1449,1450],{"class":470},"response",[370,1452,1453],{"class":380},"?.",[370,1455,1456],{"class":470},"statusCode ",[370,1458,1305],{"class":380},[370,1460,1461],{"class":438}," 0",[370,1463,445],{"class":380},[370,1465,1467,1469,1472,1474,1476,1478,1480,1482,1485,1487,1490,1493,1496,1498,1501,1503,1506,1508],{"class":372,"line":1466},30,[370,1468,1027],{"class":466},[370,1470,1471],{"class":470}," message ",[370,1473,474],{"class":380},[370,1475,1135],{"class":470},[370,1477,425],{"class":380},[370,1479,1450],{"class":470},[370,1481,1453],{"class":380},[370,1483,1484],{"class":470},"data",[370,1486,1033],{"class":380},[370,1488,1489],{"class":470},"[",[370,1491,1492],{"class":393},"'message'",[370,1494,1495],{"class":470},"] ",[370,1497,693],{"class":380},[370,1499,1500],{"class":477}," String",[370,1502,1033],{"class":380},[370,1504,1505],{"class":380}," ??",[370,1507,1308],{"class":393},[370,1509,445],{"class":380},[370,1511,1513,1516,1518,1521,1523,1525,1527,1530,1532,1534,1536,1538],{"class":372,"line":1512},31,[370,1514,1515],{"class":544},"  return",[370,1517,1014],{"class":477},[370,1519,1520],{"class":470},"(message",[370,1522,772],{"class":380},[370,1524,1036],{"class":470},[370,1526,390],{"class":380},[370,1528,1529],{"class":470}," status",[370,1531,772],{"class":380},[370,1533,1201],{"class":470},[370,1535,390],{"class":380},[370,1537,1206],{"class":470},[370,1539,445],{"class":380},[370,1541,1543],{"class":372,"line":1542},32,[370,1544,739],{"class":470},[960,1546,1548],{"id":1547},"transformation-derreur-par-requête","Transformation d'Erreur par Requête",[359,1550,1553],{"className":428,"code":1551,"filename":1552,"language":431,"meta":365,"style":365},"QoraBuilder\u003CProfile>(\n  queryKey: ['profile'],\n  fetcher: () => api.get('/profile').then((r) => Profile.fromJson(r.data)),\n  options: QoraOptions(\n    transformError: (error) {\n      if (error is DioException && error.type == DioExceptionType.badResponse) {\n        return ApiError.fromResponse(error.response!);\n      }\n      return error;\n    },\n  ),\n  builder: (context, state, _) { ... },\n)\n","lib/features/profile_screen.dart",[367,1554,1555,1566,1582,1632,1644,1654,1685,1710,1714,1722,1728,1734,1759],{"__ignoreMap":365},[370,1556,1557,1559,1561,1564],{"class":372,"line":373},[370,1558,108],{"class":477},[370,1560,523],{"class":470},[370,1562,1563],{"class":477},"Profile",[370,1565,756],{"class":470},[370,1567,1568,1570,1572,1574,1577,1580],{"class":372,"line":384},[370,1569,761],{"class":470},[370,1571,390],{"class":380},[370,1573,766],{"class":470},[370,1575,1576],{"class":393},"'profile'",[370,1578,1579],{"class":470},"]",[370,1581,778],{"class":380},[370,1583,1584,1586,1588,1590,1592,1594,1596,1598,1600,1603,1605,1607,1610,1613,1615,1618,1620,1622,1625,1627,1630],{"class":372,"line":397},[370,1585,783],{"class":470},[370,1587,390],{"class":380},[370,1589,788],{"class":470},[370,1591,709],{"class":380},[370,1593,564],{"class":470},[370,1595,425],{"class":380},[370,1597,569],{"class":532},[370,1599,481],{"class":470},[370,1601,1602],{"class":393},"'/profile'",[370,1604,587],{"class":470},[370,1606,425],{"class":380},[370,1608,1609],{"class":532},"then",[370,1611,1612],{"class":470},"((r) ",[370,1614,709],{"class":380},[370,1616,1617],{"class":477}," Profile",[370,1619,425],{"class":380},[370,1621,603],{"class":532},[370,1623,1624],{"class":470},"(r",[370,1626,425],{"class":380},[370,1628,1629],{"class":470},"data))",[370,1631,778],{"class":380},[370,1633,1634,1637,1639,1642],{"class":372,"line":463},[370,1635,1636],{"class":470},"  options",[370,1638,390],{"class":380},[370,1640,1641],{"class":477}," QoraOptions",[370,1643,1107],{"class":470},[370,1645,1646,1649,1651],{"class":372,"line":500},[370,1647,1648],{"class":470},"    transformError",[370,1650,390],{"class":380},[370,1652,1653],{"class":470}," (error) {\n",[370,1655,1656,1658,1660,1662,1664,1667,1669,1671,1674,1677,1680,1682],{"class":372,"line":505},[370,1657,1150],{"class":544},[370,1659,1153],{"class":470},[370,1661,1156],{"class":380},[370,1663,1159],{"class":477},[370,1665,1666],{"class":380}," &&",[370,1668,1135],{"class":470},[370,1670,425],{"class":380},[370,1672,1673],{"class":470},"type ",[370,1675,1676],{"class":380},"==",[370,1678,1679],{"class":477}," DioExceptionType",[370,1681,425],{"class":380},[370,1683,1684],{"class":470},"badResponse) {\n",[370,1686,1687,1689,1692,1694,1697,1699,1701,1703,1706,1708],{"class":372,"line":517},[370,1688,1167],{"class":544},[370,1690,1691],{"class":477}," ApiError",[370,1693,425],{"class":380},[370,1695,1696],{"class":532},"fromResponse",[370,1698,1297],{"class":470},[370,1700,425],{"class":380},[370,1702,1450],{"class":470},[370,1704,1705],{"class":380},"!",[370,1707,587],{"class":470},[370,1709,445],{"class":380},[370,1711,1712],{"class":372,"line":550},[370,1713,1332],{"class":470},[370,1715,1716,1718,1720],{"class":372,"line":592},[370,1717,1359],{"class":544},[370,1719,1135],{"class":470},[370,1721,445],{"class":380},[370,1723,1724,1726],{"class":372,"line":616},[370,1725,1396],{"class":470},[370,1727,778],{"class":380},[370,1729,1730,1732],{"class":372,"line":622},[370,1731,1404],{"class":470},[370,1733,778],{"class":380},[370,1735,1736,1738,1740,1742,1744,1746,1748,1751,1754,1757],{"class":372,"line":627},[370,1737,807],{"class":470},[370,1739,390],{"class":380},[370,1741,812],{"class":470},[370,1743,772],{"class":380},[370,1745,817],{"class":470},[370,1747,772],{"class":380},[370,1749,1750],{"class":470}," _) { ",[370,1752,1753],{"class":380},"...",[370,1755,1756],{"class":470}," }",[370,1758,778],{"class":380},[370,1760,1761],{"class":372,"line":654},[370,1762,930],{"class":470},[352,1764],{},[355,1766,1768],{"id":1767},"intercepteur-dauthentification","Intercepteur d'Authentification",[348,1770,1771],{},"Utilisez un intercepteur Dio pour attacher un token d'accès à chaque requête. La source du token (ex: stockage sécurisé) est consultée à chaque requête:",[359,1773,1776],{"className":428,"code":1774,"filename":1775,"language":431,"meta":365,"style":365},"import 'package:dio/dio.dart';\nimport 'package:flutter_secure_storage/flutter_secure_storage.dart';\n\nfinal storage = const FlutterSecureStorage();\n\nfinal api = Dio(BaseOptions(baseUrl: 'https://api.example.com'))\n  ..interceptors.add(InterceptorsWrapper(\n    onRequest: (options, handler) async {\n      final token = await storage.read(key: 'access_token');\n      if (token != null) {\n        options.headers['Authorization'] = 'Bearer $token';\n      }\n      handler.next(options);\n    },\n  ));\n","lib/core/dio_setup.dart",[367,1777,1778,1786,1795,1799,1817,1821,1844,1864,1883,1915,1930,1959,1963,1978,1984],{"__ignoreMap":365},[370,1779,1780,1782,1784],{"class":372,"line":373},[370,1781,439],{"class":438},[370,1783,442],{"class":393},[370,1785,445],{"class":380},[370,1787,1788,1790,1793],{"class":372,"line":384},[370,1789,439],{"class":438},[370,1791,1792],{"class":393}," 'package:flutter_secure_storage/flutter_secure_storage.dart'",[370,1794,445],{"class":380},[370,1796,1797],{"class":372,"line":397},[370,1798,460],{"emptyLinePlaceholder":459},[370,1800,1801,1803,1806,1808,1810,1813,1815],{"class":372,"line":463},[370,1802,467],{"class":466},[370,1804,1805],{"class":470}," storage ",[370,1807,474],{"class":380},[370,1809,866],{"class":466},[370,1811,1812],{"class":477}," FlutterSecureStorage",[370,1814,726],{"class":470},[370,1816,445],{"class":380},[370,1818,1819],{"class":372,"line":500},[370,1820,460],{"emptyLinePlaceholder":459},[370,1822,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841],{"class":372,"line":505},[370,1824,467],{"class":466},[370,1826,471],{"class":470},[370,1828,474],{"class":380},[370,1830,478],{"class":477},[370,1832,481],{"class":470},[370,1834,484],{"class":477},[370,1836,487],{"class":470},[370,1838,390],{"class":380},[370,1840,492],{"class":393},[370,1842,1843],{"class":470},"))\n",[370,1845,1846,1849,1852,1854,1857,1859,1862],{"class":372,"line":517},[370,1847,1848],{"class":380},"  ..",[370,1850,1851],{"class":470},"interceptors",[370,1853,425],{"class":380},[370,1855,1856],{"class":532},"add",[370,1858,481],{"class":470},[370,1860,1861],{"class":477},"InterceptorsWrapper",[370,1863,1107],{"class":470},[370,1865,1866,1869,1871,1874,1876,1879,1881],{"class":372,"line":550},[370,1867,1868],{"class":470},"    onRequest",[370,1870,390],{"class":380},[370,1872,1873],{"class":470}," (options",[370,1875,772],{"class":380},[370,1877,1878],{"class":470}," handler) ",[370,1880,545],{"class":544},[370,1882,514],{"class":470},[370,1884,1885,1888,1891,1893,1895,1898,1900,1903,1906,1908,1911,1913],{"class":372,"line":592},[370,1886,1887],{"class":466},"      final",[370,1889,1890],{"class":470}," token ",[370,1892,474],{"class":380},[370,1894,561],{"class":544},[370,1896,1897],{"class":470}," storage",[370,1899,425],{"class":380},[370,1901,1902],{"class":532},"read",[370,1904,1905],{"class":470},"(key",[370,1907,390],{"class":380},[370,1909,1910],{"class":393}," 'access_token'",[370,1912,587],{"class":470},[370,1914,445],{"class":380},[370,1916,1917,1919,1922,1925,1928],{"class":372,"line":616},[370,1918,1150],{"class":544},[370,1920,1921],{"class":470}," (token ",[370,1923,1924],{"class":380},"!=",[370,1926,1927],{"class":380}," null",[370,1929,1162],{"class":470},[370,1931,1932,1935,1937,1940,1943,1945,1947,1950,1952,1955,1957],{"class":372,"line":622},[370,1933,1934],{"class":470},"        options",[370,1936,425],{"class":380},[370,1938,1939],{"class":470},"headers[",[370,1941,1942],{"class":393},"'Authorization'",[370,1944,1495],{"class":470},[370,1946,474],{"class":380},[370,1948,1949],{"class":393}," 'Bearer ",[370,1951,577],{"class":470},[370,1953,1954],{"class":580},"token",[370,1956,584],{"class":393},[370,1958,445],{"class":380},[370,1960,1961],{"class":372,"line":627},[370,1962,1332],{"class":470},[370,1964,1965,1968,1970,1973,1976],{"class":372,"line":654},[370,1966,1967],{"class":470},"      handler",[370,1969,425],{"class":380},[370,1971,1972],{"class":532},"next",[370,1974,1975],{"class":470},"(options)",[370,1977,445],{"class":380},[370,1979,1980,1982],{"class":372,"line":680},[370,1981,1396],{"class":470},[370,1983,778],{"class":380},[370,1985,1986,1989],{"class":372,"line":731},[370,1987,1988],{"class":470},"  ))",[370,1990,445],{"class":380},[352,1992],{},[355,1994,1996],{"id":1995},"intercepteur-de-rafraîchissement-de-token","Intercepteur de Rafraîchissement de Token",[348,1998,1999],{},"Quand le serveur retourne un 401, tentez un rafraîchissement silencieux du token, puis réessayez la requête originale exactement une fois:",[359,2001,2003],{"className":428,"code":2002,"filename":1775,"language":431,"meta":365,"style":365},"final api = Dio(BaseOptions(baseUrl: 'https://api.example.com'))\n  ..interceptors.addAll([\n    _AuthInterceptor(),\n    _TokenRefreshInterceptor(api, storage),\n  ]);\n\nclass _AuthInterceptor extends Interceptor {\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) async {\n    final token = await storage.read(key: 'access_token');\n    if (token != null) {\n      options.headers['Authorization'] = 'Bearer $token';\n    }\n    handler.next(options);\n  }\n}\n\nclass _TokenRefreshInterceptor extends QueuedInterceptor {\n  _TokenRefreshInterceptor(this._dio, this._storage);\n\n  final Dio _dio;\n  final FlutterSecureStorage _storage;\n  bool _isRefreshing = false;\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) async {\n    if (err.response?.statusCode != 401 || _isRefreshing) {\n      return handler.next(err);\n    }\n\n    _isRefreshing = true;\n    try {\n      final refreshToken = await _storage.read(key: 'refresh_token');\n      if (refreshToken == null) {\n        _isRefreshing = false;\n        return handler.next(err);\n      }\n\n      final res = await _dio.post('/auth/refresh',\n          data: {'refresh_token': refreshToken});\n      final newAccessToken = res.data['access_token'] as String;\n      await _storage.write(key: 'access_token', value: newAccessToken);\n\n      _isRefreshing = false;\n\n      // Réessayer la requête originale avec le nouveau token.\n      final opts = err.requestOptions;\n      opts.headers['Authorization'] = 'Bearer $newAccessToken';\n      final retryResponse = await _dio.fetch(opts);\n      return handler.resolve(retryResponse);\n    } catch (e) {\n      _isRefreshing = false;\n      return handler.next(err);\n    }\n  }\n}\n",[367,2004,2005,2027,2041,2050,2065,2072,2076,2090,2095,2122,2148,2161,2186,2191,2204,2208,2212,2216,2230,2255,2259,2270,2281,2294,2298,2302,2327,2353,2369,2373,2377,2387,2394,2423,2437,2447,2462,2467,2472,2497,2518,2547,2578,2583,2593,2598,2604,2623,2650,2674,2691,2703,2712,2727,2732,2737],{"__ignoreMap":365},[370,2006,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025],{"class":372,"line":373},[370,2008,467],{"class":466},[370,2010,471],{"class":470},[370,2012,474],{"class":380},[370,2014,478],{"class":477},[370,2016,481],{"class":470},[370,2018,484],{"class":477},[370,2020,487],{"class":470},[370,2022,390],{"class":380},[370,2024,492],{"class":393},[370,2026,1843],{"class":470},[370,2028,2029,2031,2033,2035,2038],{"class":372,"line":384},[370,2030,1848],{"class":380},[370,2032,1851],{"class":470},[370,2034,425],{"class":380},[370,2036,2037],{"class":532},"addAll",[370,2039,2040],{"class":470},"([\n",[370,2042,2043,2046,2048],{"class":372,"line":397},[370,2044,2045],{"class":477},"    _AuthInterceptor",[370,2047,726],{"class":470},[370,2049,778],{"class":380},[370,2051,2052,2055,2058,2060,2063],{"class":372,"line":463},[370,2053,2054],{"class":477},"    _TokenRefreshInterceptor",[370,2056,2057],{"class":470},"(api",[370,2059,772],{"class":380},[370,2061,2062],{"class":470}," storage)",[370,2064,778],{"class":380},[370,2066,2067,2070],{"class":372,"line":500},[370,2068,2069],{"class":470},"  ])",[370,2071,445],{"class":380},[370,2073,2074],{"class":372,"line":505},[370,2075,460],{"emptyLinePlaceholder":459},[370,2077,2078,2080,2083,2085,2088],{"class":372,"line":517},[370,2079,508],{"class":380},[370,2081,2082],{"class":477}," _AuthInterceptor",[370,2084,1017],{"class":380},[370,2086,2087],{"class":477}," Interceptor",[370,2089,514],{"class":470},[370,2091,2092],{"class":372,"line":550},[370,2093,2094],{"class":466},"  @override\n",[370,2096,2097,2100,2103,2105,2108,2111,2113,2116,2118,2120],{"class":372,"line":592},[370,2098,2099],{"class":466},"  void",[370,2101,2102],{"class":532}," onRequest",[370,2104,481],{"class":470},[370,2106,2107],{"class":477},"RequestOptions",[370,2109,2110],{"class":470}," options",[370,2112,772],{"class":380},[370,2114,2115],{"class":477}," RequestInterceptorHandler",[370,2117,1878],{"class":470},[370,2119,545],{"class":544},[370,2121,514],{"class":470},[370,2123,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144,2146],{"class":372,"line":616},[370,2125,553],{"class":466},[370,2127,1890],{"class":470},[370,2129,474],{"class":380},[370,2131,561],{"class":544},[370,2133,1897],{"class":470},[370,2135,425],{"class":380},[370,2137,1902],{"class":532},[370,2139,1905],{"class":470},[370,2141,390],{"class":380},[370,2143,1910],{"class":393},[370,2145,587],{"class":470},[370,2147,445],{"class":380},[370,2149,2150,2153,2155,2157,2159],{"class":372,"line":622},[370,2151,2152],{"class":544},"    if",[370,2154,1921],{"class":470},[370,2156,1924],{"class":380},[370,2158,1927],{"class":380},[370,2160,1162],{"class":470},[370,2162,2163,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184],{"class":372,"line":627},[370,2164,2165],{"class":470},"      options",[370,2167,425],{"class":380},[370,2169,1939],{"class":470},[370,2171,1942],{"class":393},[370,2173,1495],{"class":470},[370,2175,474],{"class":380},[370,2177,1949],{"class":393},[370,2179,577],{"class":470},[370,2181,1954],{"class":580},[370,2183,584],{"class":393},[370,2185,445],{"class":380},[370,2187,2188],{"class":372,"line":654},[370,2189,2190],{"class":470},"    }\n",[370,2192,2193,2196,2198,2200,2202],{"class":372,"line":680},[370,2194,2195],{"class":470},"    handler",[370,2197,425],{"class":380},[370,2199,1972],{"class":532},[370,2201,1975],{"class":470},[370,2203,445],{"class":380},[370,2205,2206],{"class":372,"line":731},[370,2207,619],{"class":470},[370,2209,2210],{"class":372,"line":736},[370,2211,739],{"class":470},[370,2213,2214],{"class":372,"line":1239},[370,2215,460],{"emptyLinePlaceholder":459},[370,2217,2218,2220,2223,2225,2228],{"class":372,"line":1258},[370,2219,508],{"class":380},[370,2221,2222],{"class":477}," _TokenRefreshInterceptor",[370,2224,1017],{"class":380},[370,2226,2227],{"class":477}," QueuedInterceptor",[370,2229,514],{"class":470},[370,2231,2232,2235,2238,2240,2243,2245,2248,2250,2253],{"class":372,"line":1287},[370,2233,2234],{"class":477},"  _TokenRefreshInterceptor",[370,2236,2237],{"class":470},"(this",[370,2239,425],{"class":380},[370,2241,2242],{"class":470},"_dio",[370,2244,772],{"class":380},[370,2246,2247],{"class":470}," this",[370,2249,425],{"class":380},[370,2251,2252],{"class":470},"_storage)",[370,2254,445],{"class":380},[370,2256,2257],{"class":372,"line":1321},[370,2258,460],{"emptyLinePlaceholder":459},[370,2260,2261,2263,2265,2268],{"class":372,"line":1329},[370,2262,1027],{"class":466},[370,2264,478],{"class":477},[370,2266,2267],{"class":470}," _dio",[370,2269,445],{"class":380},[370,2271,2272,2274,2276,2279],{"class":372,"line":1335},[370,2273,1027],{"class":466},[370,2275,1812],{"class":477},[370,2277,2278],{"class":470}," _storage",[370,2280,445],{"class":380},[370,2282,2283,2286,2289,2291],{"class":372,"line":1356},[370,2284,2285],{"class":477},"  bool",[370,2287,2288],{"class":470}," _isRefreshing ",[370,2290,474],{"class":380},[370,2292,2293],{"class":380}," false;\n",[370,2295,2296],{"class":372,"line":1393},[370,2297,460],{"emptyLinePlaceholder":459},[370,2299,2300],{"class":372,"line":1401},[370,2301,2094],{"class":466},[370,2303,2304,2306,2309,2311,2313,2316,2318,2321,2323,2325],{"class":372,"line":1409},[370,2305,2099],{"class":466},[370,2307,2308],{"class":532}," onError",[370,2310,481],{"class":470},[370,2312,942],{"class":477},[370,2314,2315],{"class":470}," err",[370,2317,772],{"class":380},[370,2319,2320],{"class":477}," ErrorInterceptorHandler",[370,2322,1878],{"class":470},[370,2324,545],{"class":544},[370,2326,514],{"class":470},[370,2328,2329,2331,2334,2336,2338,2340,2342,2344,2347,2350],{"class":372,"line":1416},[370,2330,2152],{"class":544},[370,2332,2333],{"class":470}," (err",[370,2335,425],{"class":380},[370,2337,1450],{"class":470},[370,2339,1453],{"class":380},[370,2341,1456],{"class":470},[370,2343,1924],{"class":380},[370,2345,2346],{"class":438}," 401",[370,2348,2349],{"class":380}," ||",[370,2351,2352],{"class":470}," _isRefreshing) {\n",[370,2354,2355,2357,2360,2362,2364,2367],{"class":372,"line":1421},[370,2356,1359],{"class":544},[370,2358,2359],{"class":470}," handler",[370,2361,425],{"class":380},[370,2363,1972],{"class":532},[370,2365,2366],{"class":470},"(err)",[370,2368,445],{"class":380},[370,2370,2371],{"class":372,"line":1436},[370,2372,2190],{"class":470},[370,2374,2375],{"class":372,"line":1466},[370,2376,460],{"emptyLinePlaceholder":459},[370,2378,2379,2382,2384],{"class":372,"line":1512},[370,2380,2381],{"class":470},"    _isRefreshing ",[370,2383,474],{"class":380},[370,2385,2386],{"class":380}," true;\n",[370,2388,2389,2392],{"class":372,"line":1542},[370,2390,2391],{"class":544},"    try",[370,2393,514],{"class":470},[370,2395,2397,2399,2402,2404,2406,2408,2410,2412,2414,2416,2419,2421],{"class":372,"line":2396},33,[370,2398,1887],{"class":466},[370,2400,2401],{"class":470}," refreshToken ",[370,2403,474],{"class":380},[370,2405,561],{"class":544},[370,2407,2278],{"class":470},[370,2409,425],{"class":380},[370,2411,1902],{"class":532},[370,2413,1905],{"class":470},[370,2415,390],{"class":380},[370,2417,2418],{"class":393}," 'refresh_token'",[370,2420,587],{"class":470},[370,2422,445],{"class":380},[370,2424,2426,2428,2431,2433,2435],{"class":372,"line":2425},34,[370,2427,1150],{"class":544},[370,2429,2430],{"class":470}," (refreshToken ",[370,2432,1676],{"class":380},[370,2434,1927],{"class":380},[370,2436,1162],{"class":470},[370,2438,2440,2443,2445],{"class":372,"line":2439},35,[370,2441,2442],{"class":470},"        _isRefreshing ",[370,2444,474],{"class":380},[370,2446,2293],{"class":380},[370,2448,2450,2452,2454,2456,2458,2460],{"class":372,"line":2449},36,[370,2451,1167],{"class":544},[370,2453,2359],{"class":470},[370,2455,425],{"class":380},[370,2457,1972],{"class":532},[370,2459,2366],{"class":470},[370,2461,445],{"class":380},[370,2463,2465],{"class":372,"line":2464},37,[370,2466,1332],{"class":470},[370,2468,2470],{"class":372,"line":2469},38,[370,2471,460],{"emptyLinePlaceholder":459},[370,2473,2475,2477,2479,2481,2483,2485,2487,2490,2492,2495],{"class":372,"line":2474},39,[370,2476,1887],{"class":466},[370,2478,556],{"class":470},[370,2480,474],{"class":380},[370,2482,561],{"class":544},[370,2484,2267],{"class":470},[370,2486,425],{"class":380},[370,2488,2489],{"class":532},"post",[370,2491,481],{"class":470},[370,2493,2494],{"class":393},"'/auth/refresh'",[370,2496,778],{"class":380},[370,2498,2500,2503,2505,2508,2511,2513,2516],{"class":372,"line":2499},40,[370,2501,2502],{"class":470},"          data",[370,2504,390],{"class":380},[370,2506,2507],{"class":470}," {",[370,2509,2510],{"class":393},"'refresh_token'",[370,2512,390],{"class":380},[370,2514,2515],{"class":470}," refreshToken})",[370,2517,445],{"class":380},[370,2519,2521,2523,2526,2528,2531,2533,2536,2539,2541,2543,2545],{"class":372,"line":2520},41,[370,2522,1887],{"class":466},[370,2524,2525],{"class":470}," newAccessToken ",[370,2527,474],{"class":380},[370,2529,2530],{"class":470}," res",[370,2532,425],{"class":380},[370,2534,2535],{"class":470},"data[",[370,2537,2538],{"class":393},"'access_token'",[370,2540,1495],{"class":470},[370,2542,693],{"class":380},[370,2544,1500],{"class":477},[370,2546,445],{"class":380},[370,2548,2550,2553,2555,2557,2560,2562,2564,2566,2568,2571,2573,2576],{"class":372,"line":2549},42,[370,2551,2552],{"class":544},"      await",[370,2554,2278],{"class":470},[370,2556,425],{"class":380},[370,2558,2559],{"class":532},"write",[370,2561,1905],{"class":470},[370,2563,390],{"class":380},[370,2565,1910],{"class":393},[370,2567,772],{"class":380},[370,2569,2570],{"class":470}," value",[370,2572,390],{"class":380},[370,2574,2575],{"class":470}," newAccessToken)",[370,2577,445],{"class":380},[370,2579,2581],{"class":372,"line":2580},43,[370,2582,460],{"emptyLinePlaceholder":459},[370,2584,2586,2589,2591],{"class":372,"line":2585},44,[370,2587,2588],{"class":470},"      _isRefreshing ",[370,2590,474],{"class":380},[370,2592,2293],{"class":380},[370,2594,2596],{"class":372,"line":2595},45,[370,2597,460],{"emptyLinePlaceholder":459},[370,2599,2601],{"class":372,"line":2600},46,[370,2602,2603],{"class":994},"      // Réessayer la requête originale avec le nouveau token.\n",[370,2605,2607,2609,2612,2614,2616,2618,2621],{"class":372,"line":2606},47,[370,2608,1887],{"class":466},[370,2610,2611],{"class":470}," opts ",[370,2613,474],{"class":380},[370,2615,2315],{"class":470},[370,2617,425],{"class":380},[370,2619,2620],{"class":470},"requestOptions",[370,2622,445],{"class":380},[370,2624,2626,2629,2631,2633,2635,2637,2639,2641,2643,2646,2648],{"class":372,"line":2625},48,[370,2627,2628],{"class":470},"      opts",[370,2630,425],{"class":380},[370,2632,1939],{"class":470},[370,2634,1942],{"class":393},[370,2636,1495],{"class":470},[370,2638,474],{"class":380},[370,2640,1949],{"class":393},[370,2642,577],{"class":470},[370,2644,2645],{"class":580},"newAccessToken",[370,2647,584],{"class":393},[370,2649,445],{"class":380},[370,2651,2653,2655,2658,2660,2662,2664,2666,2669,2672],{"class":372,"line":2652},49,[370,2654,1887],{"class":466},[370,2656,2657],{"class":470}," retryResponse ",[370,2659,474],{"class":380},[370,2661,561],{"class":544},[370,2663,2267],{"class":470},[370,2665,425],{"class":380},[370,2667,2668],{"class":532},"fetch",[370,2670,2671],{"class":470},"(opts)",[370,2673,445],{"class":380},[370,2675,2677,2679,2681,2683,2686,2689],{"class":372,"line":2676},50,[370,2678,1359],{"class":544},[370,2680,2359],{"class":470},[370,2682,425],{"class":380},[370,2684,2685],{"class":532},"resolve",[370,2687,2688],{"class":470},"(retryResponse)",[370,2690,445],{"class":380},[370,2692,2694,2697,2700],{"class":372,"line":2693},51,[370,2695,2696],{"class":470},"    } ",[370,2698,2699],{"class":544},"catch",[370,2701,2702],{"class":470}," (e) {\n",[370,2704,2706,2708,2710],{"class":372,"line":2705},52,[370,2707,2588],{"class":470},[370,2709,474],{"class":380},[370,2711,2293],{"class":380},[370,2713,2715,2717,2719,2721,2723,2725],{"class":372,"line":2714},53,[370,2716,1359],{"class":544},[370,2718,2359],{"class":470},[370,2720,425],{"class":380},[370,2722,1972],{"class":532},[370,2724,2366],{"class":470},[370,2726,445],{"class":380},[370,2728,2730],{"class":372,"line":2729},54,[370,2731,2190],{"class":470},[370,2733,2735],{"class":372,"line":2734},55,[370,2736,619],{"class":470},[370,2738,2740],{"class":372,"line":2739},56,[370,2741,739],{"class":470},[348,2743,2744,2745,2747,2748,2751,2752,425],{},"Le mécanisme de retry de Qora fonctionne au-dessus de cette couche. Si le rafraîchissement du token échoue ou que la requête réessayée échoue encore, le ",[367,2746,942],{}," se propage à Qora, qui applique sa propre logique ",[367,2749,2750],{},"retryCount"," / ",[367,2753,2754],{},"retryDelay",[352,2756],{},[355,2758,2760],{"id":2759},"fetcher-complet-avec-typage-derreur","Fetcher Complet avec Typage d'Erreur",[348,2762,2763],{},"Pour un fetcher entièrement typé retournant des modèles domaine:",[359,2765,2768],{"className":428,"code":2766,"filename":2767,"language":431,"meta":365,"style":365},"class TodoApi {\n  TodoApi(this._api);\n  final Dio _api;\n\n  Future\u003CTodo> getTodo(String id) async {\n    try {\n      final res = await _api.get('/todos/$id');\n      return Todo.fromJson(res.data);\n    } on DioException {\n      rethrow; // laisser errorMapper de Qora le gérer\n    }\n  }\n\n  Future\u003CList\u003CTodo>> listTodos({String? filter}) async {\n    try {\n      final res = await _api.get('/todos', queryParameters: {\n        if (filter != null) 'filter': filter,\n      });\n      return (res.data as List).map((j) => Todo.fromJson(j)).toList();\n    } on DioException {\n      rethrow;\n    }\n  }\n}\n","lib/data/todo_api.dart",[367,2769,2770,2779,2793,2804,2808,2832,2838,2869,2888,2899,2910,2914,2918,2922,2953,2959,2989,3013,3020,3060,3070,3076,3080,3084],{"__ignoreMap":365},[370,2771,2772,2774,2777],{"class":372,"line":373},[370,2773,508],{"class":380},[370,2775,2776],{"class":477}," TodoApi",[370,2778,514],{"class":470},[370,2780,2781,2784,2786,2788,2791],{"class":372,"line":384},[370,2782,2783],{"class":477},"  TodoApi",[370,2785,2237],{"class":470},[370,2787,425],{"class":380},[370,2789,2790],{"class":470},"_api)",[370,2792,445],{"class":380},[370,2794,2795,2797,2799,2802],{"class":372,"line":397},[370,2796,1027],{"class":466},[370,2798,478],{"class":477},[370,2800,2801],{"class":470}," _api",[370,2803,445],{"class":380},[370,2805,2806],{"class":372,"line":463},[370,2807,460],{"emptyLinePlaceholder":459},[370,2809,2810,2812,2814,2817,2819,2822,2824,2826,2828,2830],{"class":372,"line":500},[370,2811,520],{"class":477},[370,2813,523],{"class":470},[370,2815,2816],{"class":477},"Todo",[370,2818,529],{"class":470},[370,2820,2821],{"class":532},"getTodo",[370,2823,481],{"class":470},[370,2825,538],{"class":477},[370,2827,541],{"class":470},[370,2829,545],{"class":544},[370,2831,514],{"class":470},[370,2833,2834,2836],{"class":372,"line":505},[370,2835,2391],{"class":544},[370,2837,514],{"class":470},[370,2839,2840,2842,2844,2846,2848,2850,2852,2854,2856,2859,2861,2863,2865,2867],{"class":372,"line":517},[370,2841,1887],{"class":466},[370,2843,556],{"class":470},[370,2845,474],{"class":380},[370,2847,561],{"class":544},[370,2849,2801],{"class":470},[370,2851,425],{"class":380},[370,2853,569],{"class":532},[370,2855,481],{"class":470},[370,2857,2858],{"class":393},"'/todos/",[370,2860,577],{"class":470},[370,2862,581],{"class":580},[370,2864,584],{"class":393},[370,2866,587],{"class":470},[370,2868,445],{"class":380},[370,2870,2871,2873,2876,2878,2880,2882,2884,2886],{"class":372,"line":550},[370,2872,1359],{"class":544},[370,2874,2875],{"class":477}," Todo",[370,2877,425],{"class":380},[370,2879,603],{"class":532},[370,2881,606],{"class":470},[370,2883,425],{"class":380},[370,2885,611],{"class":470},[370,2887,445],{"class":380},[370,2889,2890,2892,2895,2897],{"class":372,"line":592},[370,2891,2696],{"class":470},[370,2893,2894],{"class":544},"on",[370,2896,1159],{"class":477},[370,2898,514],{"class":470},[370,2900,2901,2904,2907],{"class":372,"line":616},[370,2902,2903],{"class":544},"      rethrow",[370,2905,2906],{"class":380},";",[370,2908,2909],{"class":994}," // laisser errorMapper de Qora le gérer\n",[370,2911,2912],{"class":372,"line":622},[370,2913,2190],{"class":470},[370,2915,2916],{"class":372,"line":627},[370,2917,619],{"class":470},[370,2919,2920],{"class":372,"line":654},[370,2921,460],{"emptyLinePlaceholder":459},[370,2923,2924,2926,2928,2930,2932,2934,2936,2939,2942,2944,2946,2949,2951],{"class":372,"line":680},[370,2925,520],{"class":477},[370,2927,523],{"class":470},[370,2929,634],{"class":477},[370,2931,523],{"class":470},[370,2933,2816],{"class":477},[370,2935,641],{"class":470},[370,2937,2938],{"class":532},"listTodos",[370,2940,2941],{"class":470},"({",[370,2943,538],{"class":477},[370,2945,1033],{"class":380},[370,2947,2948],{"class":470}," filter}) ",[370,2950,545],{"class":544},[370,2952,514],{"class":470},[370,2954,2955,2957],{"class":372,"line":731},[370,2956,2391],{"class":544},[370,2958,514],{"class":470},[370,2960,2961,2963,2965,2967,2969,2971,2973,2975,2977,2980,2982,2985,2987],{"class":372,"line":736},[370,2962,1887],{"class":466},[370,2964,556],{"class":470},[370,2966,474],{"class":380},[370,2968,561],{"class":544},[370,2970,2801],{"class":470},[370,2972,425],{"class":380},[370,2974,569],{"class":532},[370,2976,481],{"class":470},[370,2978,2979],{"class":393},"'/todos'",[370,2981,772],{"class":380},[370,2983,2984],{"class":470}," queryParameters",[370,2986,390],{"class":380},[370,2988,514],{"class":470},[370,2990,2991,2994,2997,2999,3001,3003,3006,3008,3011],{"class":372,"line":1239},[370,2992,2993],{"class":544},"        if",[370,2995,2996],{"class":470}," (filter ",[370,2998,1924],{"class":380},[370,3000,1927],{"class":380},[370,3002,1346],{"class":470},[370,3004,3005],{"class":393},"'filter'",[370,3007,390],{"class":380},[370,3009,3010],{"class":470}," filter",[370,3012,778],{"class":380},[370,3014,3015,3018],{"class":372,"line":1258},[370,3016,3017],{"class":470},"      })",[370,3019,445],{"class":380},[370,3021,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058],{"class":372,"line":1287},[370,3023,1359],{"class":544},[370,3025,685],{"class":470},[370,3027,425],{"class":380},[370,3029,690],{"class":470},[370,3031,693],{"class":380},[370,3033,696],{"class":477},[370,3035,587],{"class":470},[370,3037,425],{"class":380},[370,3039,703],{"class":532},[370,3041,706],{"class":470},[370,3043,709],{"class":380},[370,3045,2875],{"class":477},[370,3047,425],{"class":380},[370,3049,603],{"class":532},[370,3051,718],{"class":470},[370,3053,425],{"class":380},[370,3055,723],{"class":532},[370,3057,726],{"class":470},[370,3059,445],{"class":380},[370,3061,3062,3064,3066,3068],{"class":372,"line":1321},[370,3063,2696],{"class":470},[370,3065,2894],{"class":544},[370,3067,1159],{"class":477},[370,3069,514],{"class":470},[370,3071,3072,3074],{"class":372,"line":1329},[370,3073,2903],{"class":544},[370,3075,445],{"class":380},[370,3077,3078],{"class":372,"line":1335},[370,3079,2190],{"class":470},[370,3081,3082],{"class":372,"line":1356},[370,3083,619],{"class":470},[370,3085,3086],{"class":372,"line":1393},[370,3087,739],{"class":470},[359,3089,3092],{"className":428,"code":3090,"filename":3091,"language":431,"meta":365,"style":365},"QoraBuilder\u003CList\u003CTodo>>(\n  queryKey: ['todos', filter],\n  fetcher: () => todoApi.listTodos(filter: filter),\n  options: const QoraOptions(\n    staleTime: Duration(minutes: 1),\n    retryCount: 2,\n  ),\n  builder: (context, state, _) {\n    if (state.errorOrNull case final error?) {\n      return TodoErrorView(error, onRetry: () => context.qora.invalidate(['todos', filter]));\n    }\n    return ListView.builder(\n      itemCount: (state.dataOrNull ?? []).length,\n      itemBuilder: (_, i) => TodoTile(state.dataOrNull![i]),\n    );\n  },\n)\n","lib/features/todo_screen.dart",[367,3093,3094,3109,3127,3154,3166,3188,3200,3206,3223,3247,3292,3296,3310,3336,3371,3378,3384],{"__ignoreMap":365},[370,3095,3096,3098,3100,3102,3104,3106],{"class":372,"line":373},[370,3097,108],{"class":477},[370,3099,523],{"class":470},[370,3101,634],{"class":477},[370,3103,523],{"class":470},[370,3105,2816],{"class":477},[370,3107,3108],{"class":470},">>(\n",[370,3110,3111,3113,3115,3117,3120,3122,3125],{"class":372,"line":384},[370,3112,761],{"class":470},[370,3114,390],{"class":380},[370,3116,766],{"class":470},[370,3118,3119],{"class":393},"'todos'",[370,3121,772],{"class":380},[370,3123,3124],{"class":470}," filter]",[370,3126,778],{"class":380},[370,3128,3129,3131,3133,3135,3137,3140,3142,3144,3147,3149,3152],{"class":372,"line":397},[370,3130,783],{"class":470},[370,3132,390],{"class":380},[370,3134,788],{"class":470},[370,3136,709],{"class":380},[370,3138,3139],{"class":470}," todoApi",[370,3141,425],{"class":380},[370,3143,2938],{"class":532},[370,3145,3146],{"class":470},"(filter",[370,3148,390],{"class":380},[370,3150,3151],{"class":470}," filter)",[370,3153,778],{"class":380},[370,3155,3156,3158,3160,3162,3164],{"class":372,"line":463},[370,3157,1636],{"class":470},[370,3159,390],{"class":380},[370,3161,866],{"class":466},[370,3163,1641],{"class":477},[370,3165,1107],{"class":470},[370,3167,3168,3171,3173,3176,3179,3181,3184,3186],{"class":372,"line":500},[370,3169,3170],{"class":470},"    staleTime",[370,3172,390],{"class":380},[370,3174,3175],{"class":477}," Duration",[370,3177,3178],{"class":470},"(minutes",[370,3180,390],{"class":380},[370,3182,3183],{"class":438}," 1",[370,3185,587],{"class":470},[370,3187,778],{"class":380},[370,3189,3190,3193,3195,3198],{"class":372,"line":505},[370,3191,3192],{"class":470},"    retryCount",[370,3194,390],{"class":380},[370,3196,3197],{"class":438}," 2",[370,3199,778],{"class":380},[370,3201,3202,3204],{"class":372,"line":517},[370,3203,1404],{"class":470},[370,3205,778],{"class":380},[370,3207,3208,3210,3212,3214,3216,3218,3220],{"class":372,"line":550},[370,3209,807],{"class":470},[370,3211,390],{"class":380},[370,3213,812],{"class":470},[370,3215,772],{"class":380},[370,3217,817],{"class":470},[370,3219,772],{"class":380},[370,3221,3222],{"class":470}," _) {\n",[370,3224,3225,3227,3230,3232,3235,3238,3241,3243,3245],{"class":372,"line":592},[370,3226,2152],{"class":544},[370,3228,3229],{"class":470}," (state",[370,3231,425],{"class":380},[370,3233,3234],{"class":470},"errorOrNull ",[370,3236,3237],{"class":544},"case",[370,3239,3240],{"class":466}," final",[370,3242,1135],{"class":470},[370,3244,1033],{"class":380},[370,3246,1162],{"class":470},[370,3248,3249,3251,3254,3256,3258,3261,3263,3265,3267,3270,3272,3275,3277,3280,3283,3285,3287,3290],{"class":372,"line":616},[370,3250,1359],{"class":544},[370,3252,3253],{"class":477}," TodoErrorView",[370,3255,1297],{"class":470},[370,3257,772],{"class":380},[370,3259,3260],{"class":470}," onRetry",[370,3262,390],{"class":380},[370,3264,788],{"class":470},[370,3266,709],{"class":380},[370,3268,3269],{"class":470}," context",[370,3271,425],{"class":380},[370,3273,3274],{"class":470},"qora",[370,3276,425],{"class":380},[370,3278,3279],{"class":532},"invalidate",[370,3281,3282],{"class":470},"([",[370,3284,3119],{"class":393},[370,3286,772],{"class":380},[370,3288,3289],{"class":470}," filter]))",[370,3291,445],{"class":380},[370,3293,3294],{"class":372,"line":622},[370,3295,2190],{"class":470},[370,3297,3298,3300,3303,3305,3308],{"class":372,"line":627},[370,3299,595],{"class":544},[370,3301,3302],{"class":477}," ListView",[370,3304,425],{"class":380},[370,3306,3307],{"class":532},"builder",[370,3309,1107],{"class":470},[370,3311,3312,3315,3317,3319,3321,3324,3326,3329,3331,3334],{"class":372,"line":654},[370,3313,3314],{"class":470},"      itemCount",[370,3316,390],{"class":380},[370,3318,3229],{"class":470},[370,3320,425],{"class":380},[370,3322,3323],{"class":470},"dataOrNull ",[370,3325,1305],{"class":380},[370,3327,3328],{"class":470}," [])",[370,3330,425],{"class":380},[370,3332,3333],{"class":470},"length",[370,3335,778],{"class":380},[370,3337,3338,3341,3343,3346,3348,3351,3353,3356,3359,3361,3364,3366,3369],{"class":372,"line":680},[370,3339,3340],{"class":470},"      itemBuilder",[370,3342,390],{"class":380},[370,3344,3345],{"class":470}," (_",[370,3347,772],{"class":380},[370,3349,3350],{"class":470}," i) ",[370,3352,709],{"class":380},[370,3354,3355],{"class":477}," TodoTile",[370,3357,3358],{"class":470},"(state",[370,3360,425],{"class":380},[370,3362,3363],{"class":470},"dataOrNull",[370,3365,1705],{"class":380},[370,3367,3368],{"class":470},"[i])",[370,3370,778],{"class":380},[370,3372,3373,3376],{"class":372,"line":731},[370,3374,3375],{"class":470},"    )",[370,3377,445],{"class":380},[370,3379,3380,3382],{"class":372,"line":736},[370,3381,923],{"class":470},[370,3383,778],{"class":380},[370,3385,3386],{"class":372,"line":1239},[370,3387,930],{"class":470},[352,3389],{},[355,3391,3393],{"id":3392},"tester-les-fetchers-dio","Tester les Fetchers Dio",[348,3395,3396,3397,3400,3401,418,3404,3407],{},"Utilisez ",[367,3398,3399],{},"Dio"," avec un adaptateur remplacé (",[367,3402,3403],{},"HttpClientAdapter",[367,3405,3406],{},"DioMixin",") pour que les tests s'exécutent sans vrai réseau:",[359,3409,3412],{"className":428,"code":3410,"filename":3411,"language":431,"meta":365,"style":365},"import 'package:dio/dio.dart';\nimport 'package:qora/qora.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  late Dio dio;\n  late QoraClient client;\n\n  setUp(() {\n    dio = Dio(BaseOptions(baseUrl: 'https://test.example.com'));\n    // Remplacer par un adaptateur mock pour les tests hors-ligne.\n    dio.httpClientAdapter = _MockAdapter();\n\n    client = QoraClient();\n  });\n\n  test('le succès du fetcher arrive dans l\\'état Success de Qora', () async {\n    final result = await client.fetchQuery\u003CTodo>(\n      key: ['todo', 1],\n      fetcher: () async {\n        final res = await dio.get('/todos/1');\n        return Todo.fromJson(res.data);\n      },\n    );\n\n    expect(result.title, 'Test Todo');\n    expect(client.getQueryState\u003CTodo>(['todo', 1]), isA\u003CSuccess\u003CTodo>>());\n  });\n}\n","test/data/todo_api_test.dart",[367,3413,3414,3422,3430,3439,3443,3454,3466,3477,3481,3489,3513,3518,3537,3541,3554,3561,3565,3589,3613,3633,3646,3672,3690,3697,3703,3707,3729,3776,3782],{"__ignoreMap":365},[370,3415,3416,3418,3420],{"class":372,"line":373},[370,3417,439],{"class":438},[370,3419,442],{"class":393},[370,3421,445],{"class":380},[370,3423,3424,3426,3428],{"class":372,"line":384},[370,3425,439],{"class":438},[370,3427,452],{"class":393},[370,3429,445],{"class":380},[370,3431,3432,3434,3437],{"class":372,"line":397},[370,3433,439],{"class":438},[370,3435,3436],{"class":393}," 'package:test/test.dart'",[370,3438,445],{"class":380},[370,3440,3441],{"class":372,"line":463},[370,3442,460],{"emptyLinePlaceholder":459},[370,3444,3445,3448,3451],{"class":372,"line":500},[370,3446,3447],{"class":466},"void",[370,3449,3450],{"class":532}," main",[370,3452,3453],{"class":470},"() {\n",[370,3455,3456,3459,3461,3464],{"class":372,"line":505},[370,3457,3458],{"class":466},"  late",[370,3460,478],{"class":477},[370,3462,3463],{"class":470}," dio",[370,3465,445],{"class":380},[370,3467,3468,3470,3472,3475],{"class":372,"line":517},[370,3469,3458],{"class":466},[370,3471,1104],{"class":477},[370,3473,3474],{"class":470}," client",[370,3476,445],{"class":380},[370,3478,3479],{"class":372,"line":550},[370,3480,460],{"emptyLinePlaceholder":459},[370,3482,3483,3486],{"class":372,"line":592},[370,3484,3485],{"class":532},"  setUp",[370,3487,3488],{"class":470},"(() {\n",[370,3490,3491,3494,3496,3498,3500,3502,3504,3506,3509,3511],{"class":372,"line":616},[370,3492,3493],{"class":470},"    dio ",[370,3495,474],{"class":380},[370,3497,478],{"class":477},[370,3499,481],{"class":470},[370,3501,484],{"class":477},[370,3503,487],{"class":470},[370,3505,390],{"class":380},[370,3507,3508],{"class":393}," 'https://test.example.com'",[370,3510,495],{"class":470},[370,3512,445],{"class":380},[370,3514,3515],{"class":372,"line":622},[370,3516,3517],{"class":994},"    // Remplacer par un adaptateur mock pour les tests hors-ligne.\n",[370,3519,3520,3523,3525,3528,3530,3533,3535],{"class":372,"line":627},[370,3521,3522],{"class":470},"    dio",[370,3524,425],{"class":380},[370,3526,3527],{"class":470},"httpClientAdapter ",[370,3529,474],{"class":380},[370,3531,3532],{"class":477}," _MockAdapter",[370,3534,726],{"class":470},[370,3536,445],{"class":380},[370,3538,3539],{"class":372,"line":654},[370,3540,460],{"emptyLinePlaceholder":459},[370,3542,3543,3546,3548,3550,3552],{"class":372,"line":680},[370,3544,3545],{"class":470},"    client ",[370,3547,474],{"class":380},[370,3549,1104],{"class":477},[370,3551,726],{"class":470},[370,3553,445],{"class":380},[370,3555,3556,3559],{"class":372,"line":731},[370,3557,3558],{"class":470},"  })",[370,3560,445],{"class":380},[370,3562,3563],{"class":372,"line":736},[370,3564,460],{"emptyLinePlaceholder":459},[370,3566,3567,3570,3572,3575,3578,3581,3583,3585,3587],{"class":372,"line":1239},[370,3568,3569],{"class":532},"  test",[370,3571,481],{"class":470},[370,3573,3574],{"class":393},"'le succès du fetcher arrive dans l",[370,3576,3577],{"class":470},"\\'",[370,3579,3580],{"class":393},"état Success de Qora'",[370,3582,772],{"class":380},[370,3584,788],{"class":470},[370,3586,545],{"class":544},[370,3588,514],{"class":470},[370,3590,3591,3593,3596,3598,3600,3602,3604,3607,3609,3611],{"class":372,"line":1258},[370,3592,553],{"class":466},[370,3594,3595],{"class":470}," result ",[370,3597,474],{"class":380},[370,3599,561],{"class":544},[370,3601,3474],{"class":470},[370,3603,425],{"class":380},[370,3605,3606],{"class":532},"fetchQuery",[370,3608,523],{"class":470},[370,3610,2816],{"class":477},[370,3612,756],{"class":470},[370,3614,3615,3618,3620,3622,3625,3627,3629,3631],{"class":372,"line":1287},[370,3616,3617],{"class":470},"      key",[370,3619,390],{"class":380},[370,3621,766],{"class":470},[370,3623,3624],{"class":393},"'todo'",[370,3626,772],{"class":380},[370,3628,3183],{"class":438},[370,3630,1579],{"class":470},[370,3632,778],{"class":380},[370,3634,3635,3638,3640,3642,3644],{"class":372,"line":1321},[370,3636,3637],{"class":470},"      fetcher",[370,3639,390],{"class":380},[370,3641,788],{"class":470},[370,3643,545],{"class":544},[370,3645,514],{"class":470},[370,3647,3648,3651,3653,3655,3657,3659,3661,3663,3665,3668,3670],{"class":372,"line":1329},[370,3649,3650],{"class":466},"        final",[370,3652,556],{"class":470},[370,3654,474],{"class":380},[370,3656,561],{"class":544},[370,3658,3463],{"class":470},[370,3660,425],{"class":380},[370,3662,569],{"class":532},[370,3664,481],{"class":470},[370,3666,3667],{"class":393},"'/todos/1'",[370,3669,587],{"class":470},[370,3671,445],{"class":380},[370,3673,3674,3676,3678,3680,3682,3684,3686,3688],{"class":372,"line":1335},[370,3675,1167],{"class":544},[370,3677,2875],{"class":477},[370,3679,425],{"class":380},[370,3681,603],{"class":532},[370,3683,606],{"class":470},[370,3685,425],{"class":380},[370,3687,611],{"class":470},[370,3689,445],{"class":380},[370,3691,3692,3695],{"class":372,"line":1356},[370,3693,3694],{"class":470},"      }",[370,3696,778],{"class":380},[370,3698,3699,3701],{"class":372,"line":1393},[370,3700,3375],{"class":470},[370,3702,445],{"class":380},[370,3704,3705],{"class":372,"line":1401},[370,3706,460],{"emptyLinePlaceholder":459},[370,3708,3709,3712,3715,3717,3720,3722,3725,3727],{"class":372,"line":1409},[370,3710,3711],{"class":532},"    expect",[370,3713,3714],{"class":470},"(result",[370,3716,425],{"class":380},[370,3718,3719],{"class":470},"title",[370,3721,772],{"class":380},[370,3723,3724],{"class":393}," 'Test Todo'",[370,3726,587],{"class":470},[370,3728,445],{"class":380},[370,3730,3731,3733,3736,3738,3741,3743,3745,3748,3750,3752,3754,3757,3759,3762,3764,3767,3769,3771,3774],{"class":372,"line":1416},[370,3732,3711],{"class":532},[370,3734,3735],{"class":470},"(client",[370,3737,425],{"class":380},[370,3739,3740],{"class":532},"getQueryState",[370,3742,523],{"class":470},[370,3744,2816],{"class":477},[370,3746,3747],{"class":470},">([",[370,3749,3624],{"class":393},[370,3751,772],{"class":380},[370,3753,3183],{"class":438},[370,3755,3756],{"class":470},"])",[370,3758,772],{"class":380},[370,3760,3761],{"class":532}," isA",[370,3763,523],{"class":470},[370,3765,3766],{"class":477},"Success",[370,3768,523],{"class":470},[370,3770,2816],{"class":477},[370,3772,3773],{"class":470},">>())",[370,3775,445],{"class":380},[370,3777,3778,3780],{"class":372,"line":1421},[370,3779,3558],{"class":470},[370,3781,445],{"class":380},[370,3783,3784],{"class":372,"line":1436},[370,3785,739],{"class":470},[352,3787],{},[355,3789,3791],{"id":3790},"étapes-suivantes","Étapes Suivantes",[3793,3794,3795,3811,3825,3831],"ul",{},[3796,3797,3798,3803,3804,3806,3807,3810],"li",{},[3799,3800,3802],"a",{"href":3801},"../recipes/error-handling","Gestion d'Erreurs",": ",[367,3805,950],{}," global et ",[367,3808,3809],{},"transformError"," par requête",[3796,3812,3813,3803,3817,3819,3820,3819,3822],{},[3799,3814,3816],{"href":3815},"../api-reference/qora-options","API QoraOptions",[367,3818,2750],{},", ",[367,3821,2754],{},[367,3823,3824],{},"retryCondition",[3796,3826,3827,3830],{},[3799,3828,144],{"href":3829},"../recipes/mutations",": Opérations d'écriture avec Dio et mises à jour optimistes",[3796,3832,3833,3837,3838],{},[3799,3834,3836],{"href":3835},"../recipes/network-aware","Réseau Adaptatif",": Dio avec patterns offline-first et ",[367,3839,3840],{},"NetworkMode",[3842,3843,3844],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":365,"searchDepth":384,"depth":384,"links":3846},[3847,3848,3849,3853,3854,3855,3856,3857],{"id":357,"depth":384,"text":98},{"id":410,"depth":384,"text":411},{"id":935,"depth":384,"text":936,"children":3850},[3851,3852],{"id":962,"depth":397,"text":963},{"id":1547,"depth":397,"text":1548},{"id":1767,"depth":384,"text":1768},{"id":1995,"depth":384,"text":1996},{"id":2759,"depth":384,"text":2760},{"id":3392,"depth":384,"text":3393},{"id":3790,"depth":384,"text":3791},"[object Object]","md",null,{},{"title":283,"description":3863},{"Configurer Dio comme client HTTP pour Qora":3864,"navigation":3865},"intercepteurs, rafraîchissement de token d'authentification, mapping d'erreurs et patterns de fetcher idiomatiques.",{"icon":3866},"i-lucide-globe","kjFcnRtCar6W3t6WBglp4Ni_egERtClXB0OIKezcM2Y",[3869,3871],{"title":278,"path":279,"stem":280,"description":3870,"icon":281,"children":-1},"Gestion réactive des clés avec RxDart et QoraClient, commutation dynamique de requêtes avec nettoyage garanti des ressources.",{"title":287,"path":288,"stem":289,"description":3872,"icon":290,"children":-1},"Envelopper les clients GraphQL graphql ou ferry dans des fetchers Qora pour une gestion fluide des requêtes avec stale-while-revalidate, invalidation de cache et pagination.",1794040395585]