[{"data":1,"prerenderedAt":3865},["ShallowReactive",2],{"navigation_docs_en":3,"-en-third-party-with-dio":342,"-en-third-party-with-dio-surround":3860},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","/en/getting-started","en/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"What is Qora?","/en/getting-started/what-is-qora","en/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/en/getting-started/installation","en/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick Start","/en/getting-started/quick-start","en/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparison","/en/getting-started/comparison","en/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Coming from TanStack Query","/en/getting-started/coming-from-tanstack-query","en/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrating from Other Libraries","/en/getting-started/migrating-from-other-libraries","en/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"AI Assistants","/en/getting-started/ai-assistants","en/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Core Concepts","i-lucide-book-open","/en/core-concepts","en/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Queries","/en/core-concepts/queries","en/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Query Keys","/en/core-concepts/query-keys","en/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"Query States","/en/core-concepts/query-states","en/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Caching","/en/core-concepts/caching","en/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/en/core-concepts/stale-while-revalidate","en/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Deduplication","/en/core-concepts/deduplication","en/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations & Invalidation","/en/core-concepts/mutations","en/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Offline & Network","/en/core-concepts/offline","en/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Flutter Integration","i-lucide-smartphone","/en/flutter-integration","en/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Setup","/en/flutter-integration/setup","en/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/en/flutter-integration/qora-scope","en/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/en/flutter-integration/qora-builder","en/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/en/flutter-integration/qora-mutation-builder","en/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/en/flutter-integration/infinite-query-builder","en/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/en/flutter-integration/hooks","en/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Network Status Widgets","/en/flutter-integration/network-status","en/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Best Practices","/en/flutter-integration/best-practices","en/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Recipes","i-lucide-chef-hat","/en/recipes","en/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/en/recipes/mutations","en/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Optimistic Updates","/en/recipes/optimistic-updates","en/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistence","/en/recipes/persistence","en/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Network Aware","/en/recipes/network-aware","en/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Infinite Queries","/en/recipes/infinite-queries","en/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Dependent Queries","/en/recipes/dependent-queries","en/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Cancellation","/en/recipes/cancel-token","en/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"SSR Hydration","/en/recipes/ssr-hydration","en/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Error Handling","/en/recipes/error-handling","en/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Testing","/en/recipes/testing","en/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Route-Level Prefetching","/en/recipes/prefetch","en/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"API Reference","i-lucide-file-code","/en/api-reference","en/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/en/api-reference/qora-client","en/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/en/api-reference/qora-key","en/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/en/api-reference/qora-state","en/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/en/api-reference/qora-options","en/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/en/api-reference/qora-client-config","en/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"Mutation API","/en/api-reference/qora-mutation","en/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/en/api-reference/persist-qora-client","en/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Infinite Query","/en/api-reference/infinite-query","en/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"DevTools","i-lucide-bug","/en/devtools","en/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Overview","/en/devtools/overview","en/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"In-App Overlay","/en/devtools/overlay","en/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Data Serialization","/en/devtools/data-display","en/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Third Party","i-lucide-puzzle","/en/third-party","en/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"With Provider","/en/third-party/with-provider","en/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"With BLoC","/en/third-party/with-bloc","en/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"With Riverpod","/en/third-party/with-riverpod","en/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"With RxDart","/en/third-party/with-rxdart","en/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"With Dio","/en/third-party/with-dio","en/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"With GraphQL","/en/third-party/with-graphql","en/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Examples","/en/examples","en/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Case Study: User List & Detail","/en/examples/basic-query","en/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Case Study: Optimistic Mutations & Rollback","/en/examples/mutations-optimistic","en/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Case Study: Infinite Scroll Feed","/en/examples/infinite-scroll","en/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Case Study: Offline-First Todo App","/en/examples/offline-first","en/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Case Study: Network Awareness","/en/examples/network-awareness","en/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Case Study: Hooks Integration","/en/examples/hooks-integration","en/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Case Study: Complete Todo App","/en/examples/complete-todo-app","en/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Help","i-lucide-life-buoy","/en/help","en/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/en/help/faq","en/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Troubleshooting","/en/help/troubleshooting","en/09.help/2.troubleshooting",{"id":343,"title":283,"body":344,"description":3850,"extension":3851,"links":3852,"meta":3853,"navigation":459,"path":284,"seo":3854,"stem":285,"__hash__":3859},"docs_en/en/07.third-party/5.with-dio.md",{"type":345,"value":346,"toc":3837},"minimark",[347,351,354,358,406,408,412,426,740,931,933,937,958,963,1544,1548,1762,1764,1768,1771,1990,1992,1996,1999,2741,2755,2757,2761,2764,3088,3388,3390,3394,3408,3780,3782,3786,3833],[348,349,350],"p",{},"Dio is the most popular HTTP client in the Dart/Flutter ecosystem. This guide covers idiomatic Qora+Dio usage: error mapping, interceptors for auth tokens and token refresh, and copy-paste ready fetcher functions.",[352,353],"hr",{},[355,356,98],"h2",{"id":357},"setup",[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},"core-pattern-dio-as-fetcher","Core Pattern: Dio as Fetcher",[348,413,414,415,418,419,421,422,425],{},"The fetcher function passed to ",[367,416,417],{},"QoraClient.fetchQuery"," or ",[367,420,108],{}," should use Dio for the HTTP call and let Dio exceptions propagate up. Qora catches them, applies retry logic, and surfaces the error 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},"error-mapping-dioexception-to-app-errors","Error Mapping: DioException to App Errors",[348,938,939,940,943,944,947,948,951,952,954,955,425],{},"By default, Qora stores the raw ",[367,941,942],{},"DioException"," in the ",[367,945,946],{},"Failure"," state. Register a global ",[367,949,950],{},"errorMapper"," on ",[367,953,220],{}," to convert Dio errors into typed app errors, or use per-query ",[367,956,957],{},"QoraOptions.transformError",[959,960,962],"h3",{"id":961},"global-error-mapper","Global Error Mapper",[359,964,967],{"className":428,"code":965,"filename":966,"language":431,"meta":365,"style":365},"import 'package:dio/dio.dart';\nimport 'package:qora/qora.dart';\n\n/// Typed app error. `errorMapper` must return a `QoraException`, so extend it.\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,968,969,977,985,989,1007,1022,1038,1084,1088,1092,1107,1119,1145,1162,1177,1208,1236,1255,1284,1318,1326,1332,1353,1390,1398,1406,1413,1418,1433,1463,1509,1539],{"__ignoreMap":365},[370,970,971,973,975],{"class":372,"line":373},[370,972,439],{"class":438},[370,974,442],{"class":393},[370,976,445],{"class":380},[370,978,979,981,983],{"class":372,"line":384},[370,980,439],{"class":438},[370,982,452],{"class":393},[370,984,445],{"class":380},[370,986,987],{"class":372,"line":397},[370,988,460],{"emptyLinePlaceholder":459},[370,990,991,995,998,1001,1004],{"class":372,"line":463},[370,992,994],{"class":993},"sHwdD","/// Typed app error. ",[370,996,997],{"class":580},"`errorMapper`",[370,999,1000],{"class":993}," must return a ",[370,1002,1003],{"class":580},"`QoraException`",[370,1005,1006],{"class":993},", so extend it.\n",[370,1008,1009,1011,1014,1017,1020],{"class":372,"line":500},[370,1010,508],{"class":380},[370,1012,1013],{"class":477}," AppError",[370,1015,1016],{"class":380}," extends",[370,1018,1019],{"class":477}," QoraException",[370,1021,514],{"class":470},[370,1023,1024,1027,1030,1033,1036],{"class":372,"line":505},[370,1025,1026],{"class":466},"  final",[370,1028,1029],{"class":477}," int",[370,1031,1032],{"class":380},"?",[370,1034,1035],{"class":470}," statusCode",[370,1037,445],{"class":380},[370,1039,1040,1043,1045,1048,1050,1053,1055,1058,1060,1063,1065,1068,1070,1073,1075,1077,1079,1082],{"class":372,"line":517},[370,1041,1042],{"class":466},"  const",[370,1044,1013],{"class":477},[370,1046,1047],{"class":470},"(super",[370,1049,425],{"class":380},[370,1051,1052],{"class":470},"message",[370,1054,772],{"class":380},[370,1056,1057],{"class":470}," {this",[370,1059,425],{"class":380},[370,1061,1062],{"class":470},"statusCode",[370,1064,772],{"class":380},[370,1066,1067],{"class":470}," super",[370,1069,425],{"class":380},[370,1071,1072],{"class":470},"originalError",[370,1074,772],{"class":380},[370,1076,1067],{"class":470},[370,1078,425],{"class":380},[370,1080,1081],{"class":470},"stackTrace})",[370,1083,445],{"class":380},[370,1085,1086],{"class":372,"line":550},[370,1087,739],{"class":470},[370,1089,1090],{"class":372,"line":592},[370,1091,460],{"emptyLinePlaceholder":459},[370,1093,1094,1096,1099,1101,1104],{"class":372,"line":616},[370,1095,467],{"class":466},[370,1097,1098],{"class":470}," client ",[370,1100,474],{"class":380},[370,1102,1103],{"class":477}," QoraClient",[370,1105,1106],{"class":470},"(\n",[370,1108,1109,1112,1114,1117],{"class":372,"line":622},[370,1110,1111],{"class":470},"  config",[370,1113,390],{"class":380},[370,1115,1116],{"class":477}," QoraClientConfig",[370,1118,1106],{"class":470},[370,1120,1121,1124,1126,1129,1132,1135,1137,1140,1142],{"class":372,"line":627},[370,1122,1123],{"class":470},"    errorMapper",[370,1125,390],{"class":380},[370,1127,1128],{"class":470}," (",[370,1130,1131],{"class":477},"Object",[370,1133,1134],{"class":470}," error",[370,1136,772],{"class":380},[370,1138,1139],{"class":477}," StackTrace",[370,1141,1032],{"class":380},[370,1143,1144],{"class":470}," stackTrace) {\n",[370,1146,1147,1150,1153,1156,1159],{"class":372,"line":654},[370,1148,1149],{"class":544},"      if",[370,1151,1152],{"class":470}," (error ",[370,1154,1155],{"class":380},"is",[370,1157,1158],{"class":477}," DioException",[370,1160,1161],{"class":470},") {\n",[370,1163,1164,1167,1169,1172,1174],{"class":372,"line":680},[370,1165,1166],{"class":544},"        return",[370,1168,827],{"class":544},[370,1170,1171],{"class":470}," (error",[370,1173,425],{"class":380},[370,1175,1176],{"class":470},"type) {\n",[370,1178,1179,1182,1184,1187,1189,1191,1193,1196,1198,1201,1203,1206],{"class":372,"line":731},[370,1180,1181],{"class":477},"          DioExceptionType",[370,1183,425],{"class":380},[370,1185,1186],{"class":470},"connectionTimeout ",[370,1188,709],{"class":380},[370,1190,1013],{"class":477},[370,1192,481],{"class":470},[370,1194,1195],{"class":393},"'Connection timed out'",[370,1197,772],{"class":380},[370,1199,1200],{"class":470}," originalError",[370,1202,390],{"class":380},[370,1204,1205],{"class":470}," error)",[370,1207,778],{"class":380},[370,1209,1210,1212,1214,1217,1219,1221,1223,1226,1228,1230,1232,1234],{"class":372,"line":736},[370,1211,1181],{"class":477},[370,1213,425],{"class":380},[370,1215,1216],{"class":470},"receiveTimeout ",[370,1218,709],{"class":380},[370,1220,1013],{"class":477},[370,1222,481],{"class":470},[370,1224,1225],{"class":393},"'Server is not responding'",[370,1227,772],{"class":380},[370,1229,1200],{"class":470},[370,1231,390],{"class":380},[370,1233,1205],{"class":470},[370,1235,778],{"class":380},[370,1237,1239,1241,1243,1246,1248,1251,1253],{"class":372,"line":1238},17,[370,1240,1181],{"class":477},[370,1242,425],{"class":380},[370,1244,1245],{"class":470},"badResponse ",[370,1247,709],{"class":380},[370,1249,1250],{"class":532}," _mapHttpStatus",[370,1252,895],{"class":470},[370,1254,778],{"class":380},[370,1256,1258,1260,1262,1265,1267,1269,1271,1274,1276,1278,1280,1282],{"class":372,"line":1257},18,[370,1259,1181],{"class":477},[370,1261,425],{"class":380},[370,1263,1264],{"class":470},"connectionError ",[370,1266,709],{"class":380},[370,1268,1013],{"class":477},[370,1270,481],{"class":470},[370,1272,1273],{"class":393},"'No internet connection'",[370,1275,772],{"class":380},[370,1277,1200],{"class":470},[370,1279,390],{"class":380},[370,1281,1205],{"class":470},[370,1283,778],{"class":380},[370,1285,1287,1290,1292,1294,1297,1299,1302,1305,1308,1310,1312,1314,1316],{"class":372,"line":1286},19,[370,1288,1289],{"class":470},"          _ ",[370,1291,709],{"class":380},[370,1293,1013],{"class":477},[370,1295,1296],{"class":470},"(error",[370,1298,425],{"class":380},[370,1300,1301],{"class":470},"message ",[370,1303,1304],{"class":380},"??",[370,1306,1307],{"class":393}," 'Request failed'",[370,1309,772],{"class":380},[370,1311,1200],{"class":470},[370,1313,390],{"class":380},[370,1315,1205],{"class":470},[370,1317,778],{"class":380},[370,1319,1321,1324],{"class":372,"line":1320},20,[370,1322,1323],{"class":470},"        }",[370,1325,445],{"class":380},[370,1327,1329],{"class":372,"line":1328},21,[370,1330,1331],{"class":470},"      }\n",[370,1333,1335,1337,1339,1341,1343,1346,1349,1351],{"class":372,"line":1334},22,[370,1336,1149],{"class":544},[370,1338,1152],{"class":470},[370,1340,1155],{"class":380},[370,1342,1019],{"class":477},[370,1344,1345],{"class":470},") ",[370,1347,1348],{"class":544},"return",[370,1350,1134],{"class":470},[370,1352,445],{"class":380},[370,1354,1356,1359,1361,1363,1365,1368,1370,1372,1374,1376,1378,1380,1383,1385,1388],{"class":372,"line":1355},23,[370,1357,1358],{"class":544},"      return",[370,1360,1019],{"class":477},[370,1362,1296],{"class":470},[370,1364,425],{"class":380},[370,1366,1367],{"class":532},"toString",[370,1369,726],{"class":470},[370,1371,772],{"class":380},[370,1373,1200],{"class":470},[370,1375,390],{"class":380},[370,1377,1134],{"class":470},[370,1379,772],{"class":380},[370,1381,1382],{"class":470}," stackTrace",[370,1384,390],{"class":380},[370,1386,1387],{"class":470}," stackTrace)",[370,1389,445],{"class":380},[370,1391,1393,1396],{"class":372,"line":1392},24,[370,1394,1395],{"class":470},"    }",[370,1397,778],{"class":380},[370,1399,1401,1404],{"class":372,"line":1400},25,[370,1402,1403],{"class":470},"  )",[370,1405,778],{"class":380},[370,1407,1409,1411],{"class":372,"line":1408},26,[370,1410,587],{"class":470},[370,1412,445],{"class":380},[370,1414,1416],{"class":372,"line":1415},27,[370,1417,460],{"emptyLinePlaceholder":459},[370,1419,1421,1424,1426,1428,1430],{"class":372,"line":1420},28,[370,1422,1423],{"class":477},"AppError",[370,1425,1250],{"class":532},[370,1427,481],{"class":470},[370,1429,942],{"class":477},[370,1431,1432],{"class":470}," error) {\n",[370,1434,1436,1438,1441,1443,1445,1447,1450,1453,1456,1458,1461],{"class":372,"line":1435},29,[370,1437,1026],{"class":466},[370,1439,1440],{"class":470}," status ",[370,1442,474],{"class":380},[370,1444,1134],{"class":470},[370,1446,425],{"class":380},[370,1448,1449],{"class":470},"response",[370,1451,1452],{"class":380},"?.",[370,1454,1455],{"class":470},"statusCode ",[370,1457,1304],{"class":380},[370,1459,1460],{"class":438}," 0",[370,1462,445],{"class":380},[370,1464,1466,1468,1471,1473,1475,1477,1479,1481,1484,1486,1489,1492,1495,1497,1500,1502,1505,1507],{"class":372,"line":1465},30,[370,1467,1026],{"class":466},[370,1469,1470],{"class":470}," message ",[370,1472,474],{"class":380},[370,1474,1134],{"class":470},[370,1476,425],{"class":380},[370,1478,1449],{"class":470},[370,1480,1452],{"class":380},[370,1482,1483],{"class":470},"data",[370,1485,1032],{"class":380},[370,1487,1488],{"class":470},"[",[370,1490,1491],{"class":393},"'message'",[370,1493,1494],{"class":470},"] ",[370,1496,693],{"class":380},[370,1498,1499],{"class":477}," String",[370,1501,1032],{"class":380},[370,1503,1504],{"class":380}," ??",[370,1506,1307],{"class":393},[370,1508,445],{"class":380},[370,1510,1512,1515,1517,1520,1522,1524,1526,1529,1531,1533,1535,1537],{"class":372,"line":1511},31,[370,1513,1514],{"class":544},"  return",[370,1516,1013],{"class":477},[370,1518,1519],{"class":470},"(message",[370,1521,772],{"class":380},[370,1523,1035],{"class":470},[370,1525,390],{"class":380},[370,1527,1528],{"class":470}," status",[370,1530,772],{"class":380},[370,1532,1200],{"class":470},[370,1534,390],{"class":380},[370,1536,1205],{"class":470},[370,1538,445],{"class":380},[370,1540,1542],{"class":372,"line":1541},32,[370,1543,739],{"class":470},[959,1545,1547],{"id":1546},"per-query-error-transform","Per-Query Error Transform",[359,1549,1552],{"className":428,"code":1550,"filename":1551,"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,1553,1554,1565,1581,1631,1643,1653,1684,1709,1713,1721,1727,1733,1758],{"__ignoreMap":365},[370,1555,1556,1558,1560,1563],{"class":372,"line":373},[370,1557,108],{"class":477},[370,1559,523],{"class":470},[370,1561,1562],{"class":477},"Profile",[370,1564,756],{"class":470},[370,1566,1567,1569,1571,1573,1576,1579],{"class":372,"line":384},[370,1568,761],{"class":470},[370,1570,390],{"class":380},[370,1572,766],{"class":470},[370,1574,1575],{"class":393},"'profile'",[370,1577,1578],{"class":470},"]",[370,1580,778],{"class":380},[370,1582,1583,1585,1587,1589,1591,1593,1595,1597,1599,1602,1604,1606,1609,1612,1614,1617,1619,1621,1624,1626,1629],{"class":372,"line":397},[370,1584,783],{"class":470},[370,1586,390],{"class":380},[370,1588,788],{"class":470},[370,1590,709],{"class":380},[370,1592,564],{"class":470},[370,1594,425],{"class":380},[370,1596,569],{"class":532},[370,1598,481],{"class":470},[370,1600,1601],{"class":393},"'/profile'",[370,1603,587],{"class":470},[370,1605,425],{"class":380},[370,1607,1608],{"class":532},"then",[370,1610,1611],{"class":470},"((r) ",[370,1613,709],{"class":380},[370,1615,1616],{"class":477}," Profile",[370,1618,425],{"class":380},[370,1620,603],{"class":532},[370,1622,1623],{"class":470},"(r",[370,1625,425],{"class":380},[370,1627,1628],{"class":470},"data))",[370,1630,778],{"class":380},[370,1632,1633,1636,1638,1641],{"class":372,"line":463},[370,1634,1635],{"class":470},"  options",[370,1637,390],{"class":380},[370,1639,1640],{"class":477}," QoraOptions",[370,1642,1106],{"class":470},[370,1644,1645,1648,1650],{"class":372,"line":500},[370,1646,1647],{"class":470},"    transformError",[370,1649,390],{"class":380},[370,1651,1652],{"class":470}," (error) {\n",[370,1654,1655,1657,1659,1661,1663,1666,1668,1670,1673,1676,1679,1681],{"class":372,"line":505},[370,1656,1149],{"class":544},[370,1658,1152],{"class":470},[370,1660,1155],{"class":380},[370,1662,1158],{"class":477},[370,1664,1665],{"class":380}," &&",[370,1667,1134],{"class":470},[370,1669,425],{"class":380},[370,1671,1672],{"class":470},"type ",[370,1674,1675],{"class":380},"==",[370,1677,1678],{"class":477}," DioExceptionType",[370,1680,425],{"class":380},[370,1682,1683],{"class":470},"badResponse) {\n",[370,1685,1686,1688,1691,1693,1696,1698,1700,1702,1705,1707],{"class":372,"line":517},[370,1687,1166],{"class":544},[370,1689,1690],{"class":477}," ApiError",[370,1692,425],{"class":380},[370,1694,1695],{"class":532},"fromResponse",[370,1697,1296],{"class":470},[370,1699,425],{"class":380},[370,1701,1449],{"class":470},[370,1703,1704],{"class":380},"!",[370,1706,587],{"class":470},[370,1708,445],{"class":380},[370,1710,1711],{"class":372,"line":550},[370,1712,1331],{"class":470},[370,1714,1715,1717,1719],{"class":372,"line":592},[370,1716,1358],{"class":544},[370,1718,1134],{"class":470},[370,1720,445],{"class":380},[370,1722,1723,1725],{"class":372,"line":616},[370,1724,1395],{"class":470},[370,1726,778],{"class":380},[370,1728,1729,1731],{"class":372,"line":622},[370,1730,1403],{"class":470},[370,1732,778],{"class":380},[370,1734,1735,1737,1739,1741,1743,1745,1747,1750,1753,1756],{"class":372,"line":627},[370,1736,807],{"class":470},[370,1738,390],{"class":380},[370,1740,812],{"class":470},[370,1742,772],{"class":380},[370,1744,817],{"class":470},[370,1746,772],{"class":380},[370,1748,1749],{"class":470}," _) { ",[370,1751,1752],{"class":380},"...",[370,1754,1755],{"class":470}," }",[370,1757,778],{"class":380},[370,1759,1760],{"class":372,"line":654},[370,1761,930],{"class":470},[352,1763],{},[355,1765,1767],{"id":1766},"auth-interceptor","Auth Interceptor",[348,1769,1770],{},"Use a Dio interceptor to attach an access token to every request. The token source (e.g., secure storage) is consulted on each request:",[359,1772,1775],{"className":428,"code":1773,"filename":1774,"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,1776,1777,1785,1794,1798,1816,1820,1843,1863,1882,1914,1929,1958,1962,1977,1983],{"__ignoreMap":365},[370,1778,1779,1781,1783],{"class":372,"line":373},[370,1780,439],{"class":438},[370,1782,442],{"class":393},[370,1784,445],{"class":380},[370,1786,1787,1789,1792],{"class":372,"line":384},[370,1788,439],{"class":438},[370,1790,1791],{"class":393}," 'package:flutter_secure_storage/flutter_secure_storage.dart'",[370,1793,445],{"class":380},[370,1795,1796],{"class":372,"line":397},[370,1797,460],{"emptyLinePlaceholder":459},[370,1799,1800,1802,1805,1807,1809,1812,1814],{"class":372,"line":463},[370,1801,467],{"class":466},[370,1803,1804],{"class":470}," storage ",[370,1806,474],{"class":380},[370,1808,866],{"class":466},[370,1810,1811],{"class":477}," FlutterSecureStorage",[370,1813,726],{"class":470},[370,1815,445],{"class":380},[370,1817,1818],{"class":372,"line":500},[370,1819,460],{"emptyLinePlaceholder":459},[370,1821,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840],{"class":372,"line":505},[370,1823,467],{"class":466},[370,1825,471],{"class":470},[370,1827,474],{"class":380},[370,1829,478],{"class":477},[370,1831,481],{"class":470},[370,1833,484],{"class":477},[370,1835,487],{"class":470},[370,1837,390],{"class":380},[370,1839,492],{"class":393},[370,1841,1842],{"class":470},"))\n",[370,1844,1845,1848,1851,1853,1856,1858,1861],{"class":372,"line":517},[370,1846,1847],{"class":380},"  ..",[370,1849,1850],{"class":470},"interceptors",[370,1852,425],{"class":380},[370,1854,1855],{"class":532},"add",[370,1857,481],{"class":470},[370,1859,1860],{"class":477},"InterceptorsWrapper",[370,1862,1106],{"class":470},[370,1864,1865,1868,1870,1873,1875,1878,1880],{"class":372,"line":550},[370,1866,1867],{"class":470},"    onRequest",[370,1869,390],{"class":380},[370,1871,1872],{"class":470}," (options",[370,1874,772],{"class":380},[370,1876,1877],{"class":470}," handler) ",[370,1879,545],{"class":544},[370,1881,514],{"class":470},[370,1883,1884,1887,1890,1892,1894,1897,1899,1902,1905,1907,1910,1912],{"class":372,"line":592},[370,1885,1886],{"class":466},"      final",[370,1888,1889],{"class":470}," token ",[370,1891,474],{"class":380},[370,1893,561],{"class":544},[370,1895,1896],{"class":470}," storage",[370,1898,425],{"class":380},[370,1900,1901],{"class":532},"read",[370,1903,1904],{"class":470},"(key",[370,1906,390],{"class":380},[370,1908,1909],{"class":393}," 'access_token'",[370,1911,587],{"class":470},[370,1913,445],{"class":380},[370,1915,1916,1918,1921,1924,1927],{"class":372,"line":616},[370,1917,1149],{"class":544},[370,1919,1920],{"class":470}," (token ",[370,1922,1923],{"class":380},"!=",[370,1925,1926],{"class":380}," null",[370,1928,1161],{"class":470},[370,1930,1931,1934,1936,1939,1942,1944,1946,1949,1951,1954,1956],{"class":372,"line":622},[370,1932,1933],{"class":470},"        options",[370,1935,425],{"class":380},[370,1937,1938],{"class":470},"headers[",[370,1940,1941],{"class":393},"'Authorization'",[370,1943,1494],{"class":470},[370,1945,474],{"class":380},[370,1947,1948],{"class":393}," 'Bearer ",[370,1950,577],{"class":470},[370,1952,1953],{"class":580},"token",[370,1955,584],{"class":393},[370,1957,445],{"class":380},[370,1959,1960],{"class":372,"line":627},[370,1961,1331],{"class":470},[370,1963,1964,1967,1969,1972,1975],{"class":372,"line":654},[370,1965,1966],{"class":470},"      handler",[370,1968,425],{"class":380},[370,1970,1971],{"class":532},"next",[370,1973,1974],{"class":470},"(options)",[370,1976,445],{"class":380},[370,1978,1979,1981],{"class":372,"line":680},[370,1980,1395],{"class":470},[370,1982,778],{"class":380},[370,1984,1985,1988],{"class":372,"line":731},[370,1986,1987],{"class":470},"  ))",[370,1989,445],{"class":380},[352,1991],{},[355,1993,1995],{"id":1994},"token-refresh-interceptor","Token Refresh Interceptor",[348,1997,1998],{},"When the server returns a 401, attempt a silent token refresh, then retry the original request exactly once:",[359,2000,2002],{"className":428,"code":2001,"filename":1774,"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      // Retry the original request with the new 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,2003,2004,2026,2040,2049,2064,2071,2075,2089,2094,2121,2147,2160,2185,2190,2203,2207,2211,2215,2229,2254,2258,2269,2280,2293,2297,2301,2326,2352,2368,2372,2376,2386,2393,2422,2436,2446,2461,2466,2471,2496,2517,2546,2577,2582,2592,2597,2603,2622,2649,2673,2690,2702,2711,2726,2731,2736],{"__ignoreMap":365},[370,2005,2006,2008,2010,2012,2014,2016,2018,2020,2022,2024],{"class":372,"line":373},[370,2007,467],{"class":466},[370,2009,471],{"class":470},[370,2011,474],{"class":380},[370,2013,478],{"class":477},[370,2015,481],{"class":470},[370,2017,484],{"class":477},[370,2019,487],{"class":470},[370,2021,390],{"class":380},[370,2023,492],{"class":393},[370,2025,1842],{"class":470},[370,2027,2028,2030,2032,2034,2037],{"class":372,"line":384},[370,2029,1847],{"class":380},[370,2031,1850],{"class":470},[370,2033,425],{"class":380},[370,2035,2036],{"class":532},"addAll",[370,2038,2039],{"class":470},"([\n",[370,2041,2042,2045,2047],{"class":372,"line":397},[370,2043,2044],{"class":477},"    _AuthInterceptor",[370,2046,726],{"class":470},[370,2048,778],{"class":380},[370,2050,2051,2054,2057,2059,2062],{"class":372,"line":463},[370,2052,2053],{"class":477},"    _TokenRefreshInterceptor",[370,2055,2056],{"class":470},"(api",[370,2058,772],{"class":380},[370,2060,2061],{"class":470}," storage)",[370,2063,778],{"class":380},[370,2065,2066,2069],{"class":372,"line":500},[370,2067,2068],{"class":470},"  ])",[370,2070,445],{"class":380},[370,2072,2073],{"class":372,"line":505},[370,2074,460],{"emptyLinePlaceholder":459},[370,2076,2077,2079,2082,2084,2087],{"class":372,"line":517},[370,2078,508],{"class":380},[370,2080,2081],{"class":477}," _AuthInterceptor",[370,2083,1016],{"class":380},[370,2085,2086],{"class":477}," Interceptor",[370,2088,514],{"class":470},[370,2090,2091],{"class":372,"line":550},[370,2092,2093],{"class":466},"  @override\n",[370,2095,2096,2099,2102,2104,2107,2110,2112,2115,2117,2119],{"class":372,"line":592},[370,2097,2098],{"class":466},"  void",[370,2100,2101],{"class":532}," onRequest",[370,2103,481],{"class":470},[370,2105,2106],{"class":477},"RequestOptions",[370,2108,2109],{"class":470}," options",[370,2111,772],{"class":380},[370,2113,2114],{"class":477}," RequestInterceptorHandler",[370,2116,1877],{"class":470},[370,2118,545],{"class":544},[370,2120,514],{"class":470},[370,2122,2123,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145],{"class":372,"line":616},[370,2124,553],{"class":466},[370,2126,1889],{"class":470},[370,2128,474],{"class":380},[370,2130,561],{"class":544},[370,2132,1896],{"class":470},[370,2134,425],{"class":380},[370,2136,1901],{"class":532},[370,2138,1904],{"class":470},[370,2140,390],{"class":380},[370,2142,1909],{"class":393},[370,2144,587],{"class":470},[370,2146,445],{"class":380},[370,2148,2149,2152,2154,2156,2158],{"class":372,"line":622},[370,2150,2151],{"class":544},"    if",[370,2153,1920],{"class":470},[370,2155,1923],{"class":380},[370,2157,1926],{"class":380},[370,2159,1161],{"class":470},[370,2161,2162,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183],{"class":372,"line":627},[370,2163,2164],{"class":470},"      options",[370,2166,425],{"class":380},[370,2168,1938],{"class":470},[370,2170,1941],{"class":393},[370,2172,1494],{"class":470},[370,2174,474],{"class":380},[370,2176,1948],{"class":393},[370,2178,577],{"class":470},[370,2180,1953],{"class":580},[370,2182,584],{"class":393},[370,2184,445],{"class":380},[370,2186,2187],{"class":372,"line":654},[370,2188,2189],{"class":470},"    }\n",[370,2191,2192,2195,2197,2199,2201],{"class":372,"line":680},[370,2193,2194],{"class":470},"    handler",[370,2196,425],{"class":380},[370,2198,1971],{"class":532},[370,2200,1974],{"class":470},[370,2202,445],{"class":380},[370,2204,2205],{"class":372,"line":731},[370,2206,619],{"class":470},[370,2208,2209],{"class":372,"line":736},[370,2210,739],{"class":470},[370,2212,2213],{"class":372,"line":1238},[370,2214,460],{"emptyLinePlaceholder":459},[370,2216,2217,2219,2222,2224,2227],{"class":372,"line":1257},[370,2218,508],{"class":380},[370,2220,2221],{"class":477}," _TokenRefreshInterceptor",[370,2223,1016],{"class":380},[370,2225,2226],{"class":477}," QueuedInterceptor",[370,2228,514],{"class":470},[370,2230,2231,2234,2237,2239,2242,2244,2247,2249,2252],{"class":372,"line":1286},[370,2232,2233],{"class":477},"  _TokenRefreshInterceptor",[370,2235,2236],{"class":470},"(this",[370,2238,425],{"class":380},[370,2240,2241],{"class":470},"_dio",[370,2243,772],{"class":380},[370,2245,2246],{"class":470}," this",[370,2248,425],{"class":380},[370,2250,2251],{"class":470},"_storage)",[370,2253,445],{"class":380},[370,2255,2256],{"class":372,"line":1320},[370,2257,460],{"emptyLinePlaceholder":459},[370,2259,2260,2262,2264,2267],{"class":372,"line":1328},[370,2261,1026],{"class":466},[370,2263,478],{"class":477},[370,2265,2266],{"class":470}," _dio",[370,2268,445],{"class":380},[370,2270,2271,2273,2275,2278],{"class":372,"line":1334},[370,2272,1026],{"class":466},[370,2274,1811],{"class":477},[370,2276,2277],{"class":470}," _storage",[370,2279,445],{"class":380},[370,2281,2282,2285,2288,2290],{"class":372,"line":1355},[370,2283,2284],{"class":477},"  bool",[370,2286,2287],{"class":470}," _isRefreshing ",[370,2289,474],{"class":380},[370,2291,2292],{"class":380}," false;\n",[370,2294,2295],{"class":372,"line":1392},[370,2296,460],{"emptyLinePlaceholder":459},[370,2298,2299],{"class":372,"line":1400},[370,2300,2093],{"class":466},[370,2302,2303,2305,2308,2310,2312,2315,2317,2320,2322,2324],{"class":372,"line":1408},[370,2304,2098],{"class":466},[370,2306,2307],{"class":532}," onError",[370,2309,481],{"class":470},[370,2311,942],{"class":477},[370,2313,2314],{"class":470}," err",[370,2316,772],{"class":380},[370,2318,2319],{"class":477}," ErrorInterceptorHandler",[370,2321,1877],{"class":470},[370,2323,545],{"class":544},[370,2325,514],{"class":470},[370,2327,2328,2330,2333,2335,2337,2339,2341,2343,2346,2349],{"class":372,"line":1415},[370,2329,2151],{"class":544},[370,2331,2332],{"class":470}," (err",[370,2334,425],{"class":380},[370,2336,1449],{"class":470},[370,2338,1452],{"class":380},[370,2340,1455],{"class":470},[370,2342,1923],{"class":380},[370,2344,2345],{"class":438}," 401",[370,2347,2348],{"class":380}," ||",[370,2350,2351],{"class":470}," _isRefreshing) {\n",[370,2353,2354,2356,2359,2361,2363,2366],{"class":372,"line":1420},[370,2355,1358],{"class":544},[370,2357,2358],{"class":470}," handler",[370,2360,425],{"class":380},[370,2362,1971],{"class":532},[370,2364,2365],{"class":470},"(err)",[370,2367,445],{"class":380},[370,2369,2370],{"class":372,"line":1435},[370,2371,2189],{"class":470},[370,2373,2374],{"class":372,"line":1465},[370,2375,460],{"emptyLinePlaceholder":459},[370,2377,2378,2381,2383],{"class":372,"line":1511},[370,2379,2380],{"class":470},"    _isRefreshing ",[370,2382,474],{"class":380},[370,2384,2385],{"class":380}," true;\n",[370,2387,2388,2391],{"class":372,"line":1541},[370,2389,2390],{"class":544},"    try",[370,2392,514],{"class":470},[370,2394,2396,2398,2401,2403,2405,2407,2409,2411,2413,2415,2418,2420],{"class":372,"line":2395},33,[370,2397,1886],{"class":466},[370,2399,2400],{"class":470}," refreshToken ",[370,2402,474],{"class":380},[370,2404,561],{"class":544},[370,2406,2277],{"class":470},[370,2408,425],{"class":380},[370,2410,1901],{"class":532},[370,2412,1904],{"class":470},[370,2414,390],{"class":380},[370,2416,2417],{"class":393}," 'refresh_token'",[370,2419,587],{"class":470},[370,2421,445],{"class":380},[370,2423,2425,2427,2430,2432,2434],{"class":372,"line":2424},34,[370,2426,1149],{"class":544},[370,2428,2429],{"class":470}," (refreshToken ",[370,2431,1675],{"class":380},[370,2433,1926],{"class":380},[370,2435,1161],{"class":470},[370,2437,2439,2442,2444],{"class":372,"line":2438},35,[370,2440,2441],{"class":470},"        _isRefreshing ",[370,2443,474],{"class":380},[370,2445,2292],{"class":380},[370,2447,2449,2451,2453,2455,2457,2459],{"class":372,"line":2448},36,[370,2450,1166],{"class":544},[370,2452,2358],{"class":470},[370,2454,425],{"class":380},[370,2456,1971],{"class":532},[370,2458,2365],{"class":470},[370,2460,445],{"class":380},[370,2462,2464],{"class":372,"line":2463},37,[370,2465,1331],{"class":470},[370,2467,2469],{"class":372,"line":2468},38,[370,2470,460],{"emptyLinePlaceholder":459},[370,2472,2474,2476,2478,2480,2482,2484,2486,2489,2491,2494],{"class":372,"line":2473},39,[370,2475,1886],{"class":466},[370,2477,556],{"class":470},[370,2479,474],{"class":380},[370,2481,561],{"class":544},[370,2483,2266],{"class":470},[370,2485,425],{"class":380},[370,2487,2488],{"class":532},"post",[370,2490,481],{"class":470},[370,2492,2493],{"class":393},"'/auth/refresh'",[370,2495,778],{"class":380},[370,2497,2499,2502,2504,2507,2510,2512,2515],{"class":372,"line":2498},40,[370,2500,2501],{"class":470},"          data",[370,2503,390],{"class":380},[370,2505,2506],{"class":470}," {",[370,2508,2509],{"class":393},"'refresh_token'",[370,2511,390],{"class":380},[370,2513,2514],{"class":470}," refreshToken})",[370,2516,445],{"class":380},[370,2518,2520,2522,2525,2527,2530,2532,2535,2538,2540,2542,2544],{"class":372,"line":2519},41,[370,2521,1886],{"class":466},[370,2523,2524],{"class":470}," newAccessToken ",[370,2526,474],{"class":380},[370,2528,2529],{"class":470}," res",[370,2531,425],{"class":380},[370,2533,2534],{"class":470},"data[",[370,2536,2537],{"class":393},"'access_token'",[370,2539,1494],{"class":470},[370,2541,693],{"class":380},[370,2543,1499],{"class":477},[370,2545,445],{"class":380},[370,2547,2549,2552,2554,2556,2559,2561,2563,2565,2567,2570,2572,2575],{"class":372,"line":2548},42,[370,2550,2551],{"class":544},"      await",[370,2553,2277],{"class":470},[370,2555,425],{"class":380},[370,2557,2558],{"class":532},"write",[370,2560,1904],{"class":470},[370,2562,390],{"class":380},[370,2564,1909],{"class":393},[370,2566,772],{"class":380},[370,2568,2569],{"class":470}," value",[370,2571,390],{"class":380},[370,2573,2574],{"class":470}," newAccessToken)",[370,2576,445],{"class":380},[370,2578,2580],{"class":372,"line":2579},43,[370,2581,460],{"emptyLinePlaceholder":459},[370,2583,2585,2588,2590],{"class":372,"line":2584},44,[370,2586,2587],{"class":470},"      _isRefreshing ",[370,2589,474],{"class":380},[370,2591,2292],{"class":380},[370,2593,2595],{"class":372,"line":2594},45,[370,2596,460],{"emptyLinePlaceholder":459},[370,2598,2600],{"class":372,"line":2599},46,[370,2601,2602],{"class":993},"      // Retry the original request with the new token.\n",[370,2604,2606,2608,2611,2613,2615,2617,2620],{"class":372,"line":2605},47,[370,2607,1886],{"class":466},[370,2609,2610],{"class":470}," opts ",[370,2612,474],{"class":380},[370,2614,2314],{"class":470},[370,2616,425],{"class":380},[370,2618,2619],{"class":470},"requestOptions",[370,2621,445],{"class":380},[370,2623,2625,2628,2630,2632,2634,2636,2638,2640,2642,2645,2647],{"class":372,"line":2624},48,[370,2626,2627],{"class":470},"      opts",[370,2629,425],{"class":380},[370,2631,1938],{"class":470},[370,2633,1941],{"class":393},[370,2635,1494],{"class":470},[370,2637,474],{"class":380},[370,2639,1948],{"class":393},[370,2641,577],{"class":470},[370,2643,2644],{"class":580},"newAccessToken",[370,2646,584],{"class":393},[370,2648,445],{"class":380},[370,2650,2652,2654,2657,2659,2661,2663,2665,2668,2671],{"class":372,"line":2651},49,[370,2653,1886],{"class":466},[370,2655,2656],{"class":470}," retryResponse ",[370,2658,474],{"class":380},[370,2660,561],{"class":544},[370,2662,2266],{"class":470},[370,2664,425],{"class":380},[370,2666,2667],{"class":532},"fetch",[370,2669,2670],{"class":470},"(opts)",[370,2672,445],{"class":380},[370,2674,2676,2678,2680,2682,2685,2688],{"class":372,"line":2675},50,[370,2677,1358],{"class":544},[370,2679,2358],{"class":470},[370,2681,425],{"class":380},[370,2683,2684],{"class":532},"resolve",[370,2686,2687],{"class":470},"(retryResponse)",[370,2689,445],{"class":380},[370,2691,2693,2696,2699],{"class":372,"line":2692},51,[370,2694,2695],{"class":470},"    } ",[370,2697,2698],{"class":544},"catch",[370,2700,2701],{"class":470}," (e) {\n",[370,2703,2705,2707,2709],{"class":372,"line":2704},52,[370,2706,2587],{"class":470},[370,2708,474],{"class":380},[370,2710,2292],{"class":380},[370,2712,2714,2716,2718,2720,2722,2724],{"class":372,"line":2713},53,[370,2715,1358],{"class":544},[370,2717,2358],{"class":470},[370,2719,425],{"class":380},[370,2721,1971],{"class":532},[370,2723,2365],{"class":470},[370,2725,445],{"class":380},[370,2727,2729],{"class":372,"line":2728},54,[370,2730,2189],{"class":470},[370,2732,2734],{"class":372,"line":2733},55,[370,2735,619],{"class":470},[370,2737,2739],{"class":372,"line":2738},56,[370,2740,739],{"class":470},[348,2742,2743,2744,2746,2747,2750,2751,2754],{},"Qora's retry mechanism works above this layer. If the token refresh fails or the retried request still fails, the ",[367,2745,942],{}," propagates to Qora, which applies its own ",[367,2748,2749],{},"retryCount"," / ",[367,2752,2753],{},"retryDelay"," logic.",[352,2756],{},[355,2758,2760],{"id":2759},"complete-fetcher-with-error-typing","Complete Fetcher with Error Typing",[348,2762,2763],{},"For a fully typed fetcher that returns domain models:",[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; // let Qora errorMapper handle it\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,2236],{"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,1026],{"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,2390],{"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,1886],{"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,1358],{"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,2695],{"class":470},[370,2893,2894],{"class":544},"on",[370,2896,1158],{"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":993}," // let Qora errorMapper handle it\n",[370,2911,2912],{"class":372,"line":622},[370,2913,2189],{"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,1032],{"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,2390],{"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,1886],{"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":1238},[370,2992,2993],{"class":544},"        if",[370,2995,2996],{"class":470}," (filter ",[370,2998,1923],{"class":380},[370,3000,1926],{"class":380},[370,3002,1345],{"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":1257},[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":1286},[370,3023,1358],{"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":1320},[370,3063,2695],{"class":470},[370,3065,2894],{"class":544},[370,3067,1158],{"class":477},[370,3069,514],{"class":470},[370,3071,3072,3074],{"class":372,"line":1328},[370,3073,2903],{"class":544},[370,3075,445],{"class":380},[370,3077,3078],{"class":372,"line":1334},[370,3079,2189],{"class":470},[370,3081,3082],{"class":372,"line":1355},[370,3083,619],{"class":470},[370,3085,3086],{"class":372,"line":1392},[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,1635],{"class":470},[370,3159,390],{"class":380},[370,3161,866],{"class":466},[370,3163,1640],{"class":477},[370,3165,1106],{"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,1403],{"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,2151],{"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,1134],{"class":470},[370,3244,1032],{"class":380},[370,3246,1161],{"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,1358],{"class":544},[370,3252,3253],{"class":477}," TodoErrorView",[370,3255,1296],{"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,2189],{"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,1106],{"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,1304],{"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,1704],{"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":1238},[370,3387,930],{"class":470},[352,3389],{},[355,3391,3393],{"id":3392},"testing-dio-fetchers","Testing Dio Fetchers",[348,3395,3396,3397,3400,3401,418,3404,3407],{},"Use ",[367,3398,3399],{},"Dio"," with an adapter override (",[367,3402,3403],{},"HttpClientAdapter",[367,3405,3406],{},"DioMixin",") so tests run without a real network:",[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    // Replace with a mock adapter for offline testing.\n    dio.httpClientAdapter = _MockAdapter();\n\n    client = QoraClient();\n  });\n\n  test('fetcher success flows into Qora Success state', () 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,3583,3607,3627,3640,3666,3684,3691,3697,3701,3723,3770,3776],{"__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,1103],{"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":993},"    // Replace with a mock adapter for offline testing.\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,1103],{"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,3577,3579,3581],{"class":372,"line":1238},[370,3568,3569],{"class":532},"  test",[370,3571,481],{"class":470},[370,3573,3574],{"class":393},"'fetcher success flows into Qora Success state'",[370,3576,772],{"class":380},[370,3578,788],{"class":470},[370,3580,545],{"class":544},[370,3582,514],{"class":470},[370,3584,3585,3587,3590,3592,3594,3596,3598,3601,3603,3605],{"class":372,"line":1257},[370,3586,553],{"class":466},[370,3588,3589],{"class":470}," result ",[370,3591,474],{"class":380},[370,3593,561],{"class":544},[370,3595,3474],{"class":470},[370,3597,425],{"class":380},[370,3599,3600],{"class":532},"fetchQuery",[370,3602,523],{"class":470},[370,3604,2816],{"class":477},[370,3606,756],{"class":470},[370,3608,3609,3612,3614,3616,3619,3621,3623,3625],{"class":372,"line":1286},[370,3610,3611],{"class":470},"      key",[370,3613,390],{"class":380},[370,3615,766],{"class":470},[370,3617,3618],{"class":393},"'todo'",[370,3620,772],{"class":380},[370,3622,3183],{"class":438},[370,3624,1578],{"class":470},[370,3626,778],{"class":380},[370,3628,3629,3632,3634,3636,3638],{"class":372,"line":1320},[370,3630,3631],{"class":470},"      fetcher",[370,3633,390],{"class":380},[370,3635,788],{"class":470},[370,3637,545],{"class":544},[370,3639,514],{"class":470},[370,3641,3642,3645,3647,3649,3651,3653,3655,3657,3659,3662,3664],{"class":372,"line":1328},[370,3643,3644],{"class":466},"        final",[370,3646,556],{"class":470},[370,3648,474],{"class":380},[370,3650,561],{"class":544},[370,3652,3463],{"class":470},[370,3654,425],{"class":380},[370,3656,569],{"class":532},[370,3658,481],{"class":470},[370,3660,3661],{"class":393},"'/todos/1'",[370,3663,587],{"class":470},[370,3665,445],{"class":380},[370,3667,3668,3670,3672,3674,3676,3678,3680,3682],{"class":372,"line":1334},[370,3669,1166],{"class":544},[370,3671,2875],{"class":477},[370,3673,425],{"class":380},[370,3675,603],{"class":532},[370,3677,606],{"class":470},[370,3679,425],{"class":380},[370,3681,611],{"class":470},[370,3683,445],{"class":380},[370,3685,3686,3689],{"class":372,"line":1355},[370,3687,3688],{"class":470},"      }",[370,3690,778],{"class":380},[370,3692,3693,3695],{"class":372,"line":1392},[370,3694,3375],{"class":470},[370,3696,445],{"class":380},[370,3698,3699],{"class":372,"line":1400},[370,3700,460],{"emptyLinePlaceholder":459},[370,3702,3703,3706,3709,3711,3714,3716,3719,3721],{"class":372,"line":1408},[370,3704,3705],{"class":532},"    expect",[370,3707,3708],{"class":470},"(result",[370,3710,425],{"class":380},[370,3712,3713],{"class":470},"title",[370,3715,772],{"class":380},[370,3717,3718],{"class":393}," 'Test Todo'",[370,3720,587],{"class":470},[370,3722,445],{"class":380},[370,3724,3725,3727,3730,3732,3735,3737,3739,3742,3744,3746,3748,3751,3753,3756,3758,3761,3763,3765,3768],{"class":372,"line":1415},[370,3726,3705],{"class":532},[370,3728,3729],{"class":470},"(client",[370,3731,425],{"class":380},[370,3733,3734],{"class":532},"getQueryState",[370,3736,523],{"class":470},[370,3738,2816],{"class":477},[370,3740,3741],{"class":470},">([",[370,3743,3618],{"class":393},[370,3745,772],{"class":380},[370,3747,3183],{"class":438},[370,3749,3750],{"class":470},"])",[370,3752,772],{"class":380},[370,3754,3755],{"class":532}," isA",[370,3757,523],{"class":470},[370,3759,3760],{"class":477},"Success",[370,3762,523],{"class":470},[370,3764,2816],{"class":477},[370,3766,3767],{"class":470},">>())",[370,3769,445],{"class":380},[370,3771,3772,3774],{"class":372,"line":1420},[370,3773,3558],{"class":470},[370,3775,445],{"class":380},[370,3777,3778],{"class":372,"line":1435},[370,3779,739],{"class":470},[352,3781],{},[355,3783,3785],{"id":3784},"next-steps","Next Steps",[3787,3788,3789,3803,3818,3824],"ul",{},[3790,3791,3792,3796,3797,3799,3800],"li",{},[3793,3794,182],"a",{"href":3795},"../recipes/error-handling",": Global ",[367,3798,950],{}," and per-query ",[367,3801,3802],{},"transformError",[3790,3804,3805,3809,3810,3812,3813,3812,3815],{},[3793,3806,3808],{"href":3807},"../api-reference/qora-options","QoraOptions API",": ",[367,3811,2749],{},", ",[367,3814,2753],{},[367,3816,3817],{},"retryCondition",[3790,3819,3820,3823],{},[3793,3821,144],{"href":3822},"../recipes/mutations",": Write operations with Dio and optimistic updates",[3790,3825,3826,3829,3830],{},[3793,3827,158],{"href":3828},"../recipes/network-aware",": Dio with offline-first patterns and ",[367,3831,3832],{},"NetworkMode",[3834,3835,3836],"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":3838},[3839,3840,3841,3845,3846,3847,3848,3849],{"id":357,"depth":384,"text":98},{"id":410,"depth":384,"text":411},{"id":935,"depth":384,"text":936,"children":3842},[3843,3844],{"id":961,"depth":397,"text":962},{"id":1546,"depth":397,"text":1547},{"id":1766,"depth":384,"text":1767},{"id":1994,"depth":384,"text":1995},{"id":2759,"depth":384,"text":2760},{"id":3392,"depth":384,"text":3393},{"id":3784,"depth":384,"text":3785},"[object Object]","md",null,{},{"title":283,"description":3855},{"Configure Dio as the HTTP client for Qora":3856,"navigation":3857},"interceptors, auth token refresh, error mapping, and idiomatic fetcher patterns.",{"icon":3858},"i-lucide-globe","JfQiYhynOYs89yIllLnfnX4xwcHKa5DiQ700FDQYIlw",[3861,3863],{"title":278,"path":279,"stem":280,"description":3862,"icon":281,"children":-1},"Reactive key management with RxDart and QoraClient, dynamic query switching with guaranteed resource cleanup.",{"title":287,"path":288,"stem":289,"description":3864,"icon":290,"children":-1},"Wrap graphql or ferry GraphQL clients in Qora fetchers for seamless query management with stale-while-revalidate, cache invalidation, and pagination.",1794040393901]