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