[{"data":1,"prerenderedAt":1331},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-getting-started-installation":342,"-fr-getting-started-installation-surround":1326},[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":16,"body":344,"description":1318,"extension":1319,"links":1320,"meta":1321,"navigation":1322,"path":17,"seo":1323,"stem":18,"__hash__":1325},"docs_fr/fr/01.getting-started/3.installation.md",{"type":345,"value":346,"toc":1306},"minimark",[347,352,685,689,710,835,840,843,847,857,876,885,887,891,894,910,1236,1245,1247,1251,1267,1277,1279,1283,1302],[348,349,351],"h2",{"id":350},"flutter","Flutter",[353,354,356,361,390,410,414,424,638,643,660,664],"steps",{"level":355},"3",[357,358,360],"h3",{"id":359},"ajouter-la-dépendance","Ajouter la dépendance",[362,363,369],"pre",{"className":364,"code":365,"filename":366,"language":367,"meta":368,"style":368},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flutter pub add qora_flutter\n","Terminal","bash","",[370,371,372],"code",{"__ignoreMap":368},[373,374,377,380,384,387],"span",{"class":375,"line":376},"line",1,[373,378,350],{"class":379},"sBMFI",[373,381,383],{"class":382},"sfazB"," pub",[373,385,386],{"class":382}," add",[373,388,389],{"class":382}," qora_flutter\n",[391,392,393,394,397,398,401,402,405,406,409],"p",{},"Cela ajoute ",[370,395,396],{},"qora_flutter: ^1.3.1"," au ",[370,399,400],{},"pubspec.yaml",". Le package apporte ",[370,403,404],{},"qora"," et ",[370,407,408],{},"connectivity_plus"," ; aucune autre entrée n'est nécessaire.",[357,411,413],{"id":412},"envelopper-lapplication","Envelopper l'application",[391,415,416,417,419,420,423],{},"Créez un seul ",[370,418,202],{}," et placez-le au-dessus de l'application avec ",[370,421,422],{},"QoraScope.auto"," :",[362,425,430],{"className":426,"code":427,"filename":428,"language":429,"meta":368,"style":368},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nvoid main() {\n  final client = QoraClient(\n    config: QoraClientConfig(\n      defaultOptions: const QoraOptions(staleTime: Duration(minutes: 5)),\n      debugMode: kDebugMode,\n    ),\n  );\n\n  runApp(QoraScope.auto(client: client, child: const MyApp()));\n}\n","main.dart","dart",[370,431,432,445,455,465,472,487,505,519,555,568,576,584,589,632],{"__ignoreMap":368},[373,433,434,438,441],{"class":375,"line":376},[373,435,437],{"class":436},"sbssI","import",[373,439,440],{"class":382}," 'package:flutter/foundation.dart'",[373,442,444],{"class":443},"sMK4o",";\n",[373,446,448,450,453],{"class":375,"line":447},2,[373,449,437],{"class":436},[373,451,452],{"class":382}," 'package:flutter/material.dart'",[373,454,444],{"class":443},[373,456,458,460,463],{"class":375,"line":457},3,[373,459,437],{"class":436},[373,461,462],{"class":382}," 'package:qora_flutter/qora_flutter.dart'",[373,464,444],{"class":443},[373,466,468],{"class":375,"line":467},4,[373,469,471],{"emptyLinePlaceholder":470},true,"\n",[373,473,475,479,483],{"class":375,"line":474},5,[373,476,478],{"class":477},"spNyl","void",[373,480,482],{"class":481},"s2Zo4"," main",[373,484,486],{"class":485},"sTEyZ","() {\n",[373,488,490,493,496,499,502],{"class":375,"line":489},6,[373,491,492],{"class":477},"  final",[373,494,495],{"class":485}," client ",[373,497,498],{"class":443},"=",[373,500,501],{"class":379}," QoraClient",[373,503,504],{"class":485},"(\n",[373,506,508,511,514,517],{"class":375,"line":507},7,[373,509,510],{"class":485},"    config",[373,512,513],{"class":443},":",[373,515,516],{"class":379}," QoraClientConfig",[373,518,504],{"class":485},[373,520,522,525,527,530,533,536,538,541,544,546,549,552],{"class":375,"line":521},8,[373,523,524],{"class":485},"      defaultOptions",[373,526,513],{"class":443},[373,528,529],{"class":477}," const",[373,531,532],{"class":379}," QoraOptions",[373,534,535],{"class":485},"(staleTime",[373,537,513],{"class":443},[373,539,540],{"class":379}," Duration",[373,542,543],{"class":485},"(minutes",[373,545,513],{"class":443},[373,547,548],{"class":436}," 5",[373,550,551],{"class":485},"))",[373,553,554],{"class":443},",\n",[373,556,558,561,563,566],{"class":375,"line":557},9,[373,559,560],{"class":485},"      debugMode",[373,562,513],{"class":443},[373,564,565],{"class":485}," kDebugMode",[373,567,554],{"class":443},[373,569,571,574],{"class":375,"line":570},10,[373,572,573],{"class":485},"    )",[373,575,554],{"class":443},[373,577,579,582],{"class":375,"line":578},11,[373,580,581],{"class":485},"  )",[373,583,444],{"class":443},[373,585,587],{"class":375,"line":586},12,[373,588,471],{"emptyLinePlaceholder":470},[373,590,592,595,598,600,603,606,609,611,614,617,620,622,624,627,630],{"class":375,"line":591},13,[373,593,594],{"class":481},"  runApp",[373,596,597],{"class":485},"(",[373,599,103],{"class":379},[373,601,602],{"class":443},".",[373,604,605],{"class":481},"auto",[373,607,608],{"class":485},"(client",[373,610,513],{"class":443},[373,612,613],{"class":485}," client",[373,615,616],{"class":443},",",[373,618,619],{"class":485}," child",[373,621,513],{"class":443},[373,623,529],{"class":477},[373,625,626],{"class":379}," MyApp",[373,628,629],{"class":485},"()))",[373,631,444],{"class":443},[373,633,635],{"class":375,"line":634},14,[373,636,637],{"class":485},"}\n",[391,639,640,642],{},[370,641,422],{}," démarre aussi deux managers, ce qui vous donne ces comportements sans code supplémentaire :",[644,645,646,654],"ul",{},[647,648,649,653],"li",{},[650,651,652],"strong",{},"Cycle de vie"," : quand l'application revient au premier plan après au moins 5 secondes, les requêtes périmées affichées à l'écran se relancent.",[647,655,656,659],{},[650,657,658],{},"Connectivité"," : les requêtes se mettent en pause quand l'appareil est hors-ligne et se relancent à la reconnexion.",[357,661,663],{"id":662},"lutiliser","L'utiliser",[391,665,666,667,669,670,672,673,675,676,679,680,684],{},"Tout widget sous ",[370,668,103],{}," peut maintenant utiliser ",[370,671,108],{},", ",[370,674,113],{},", ou ",[370,677,678],{},"context.qora"," pour les appels impératifs. Le ",[681,682,21],"a",{"href":683},"./quick-start"," construit un premier écran.",[357,686,688],{"id":687},"notes-de-configuration","Notes de configuration",[644,690,691,699,707],{},[647,692,693,698],{},[650,694,695],{},[370,696,697],{},"staleTime"," est la durée pendant laquelle une donnée récupérée est considérée comme fraîche. Par défaut elle vaut zéro : la donnée est toujours périmée et revalidée en arrière-plan quand un widget se monte. Cinq minutes est un bon point de départ pour la plupart des écrans.",[647,700,701,706],{},[650,702,703],{},[370,704,705],{},"debugMode: kDebugMode"," affiche l'activité du cache uniquement en mode debug.",[647,708,709],{},"Pour régler les managers (par exemple un délai d'arrière-plan plus long), passez-les vous-même avec le constructeur par défaut :",[362,711,713],{"className":426,"code":712,"filename":428,"language":429,"meta":368,"style":368},"runApp(\n  QoraScope(\n    client: client,\n    lifecycleManager: FlutterLifecycleManager(\n      qoraClient: client,\n      minBackgroundDuration: const Duration(seconds: 30),\n    ),\n    connectivityManager: FlutterConnectivityManager(),\n    child: const MyApp(),\n  ),\n);\n",[370,714,715,722,729,740,752,763,787,793,808,823,829],{"__ignoreMap":368},[373,716,717,720],{"class":375,"line":376},[373,718,719],{"class":481},"runApp",[373,721,504],{"class":485},[373,723,724,727],{"class":375,"line":447},[373,725,726],{"class":379},"  QoraScope",[373,728,504],{"class":485},[373,730,731,734,736,738],{"class":375,"line":457},[373,732,733],{"class":485},"    client",[373,735,513],{"class":443},[373,737,613],{"class":485},[373,739,554],{"class":443},[373,741,742,745,747,750],{"class":375,"line":467},[373,743,744],{"class":485},"    lifecycleManager",[373,746,513],{"class":443},[373,748,749],{"class":379}," FlutterLifecycleManager",[373,751,504],{"class":485},[373,753,754,757,759,761],{"class":375,"line":474},[373,755,756],{"class":485},"      qoraClient",[373,758,513],{"class":443},[373,760,613],{"class":485},[373,762,554],{"class":443},[373,764,765,768,770,772,774,777,779,782,785],{"class":375,"line":489},[373,766,767],{"class":485},"      minBackgroundDuration",[373,769,513],{"class":443},[373,771,529],{"class":477},[373,773,540],{"class":379},[373,775,776],{"class":485},"(seconds",[373,778,513],{"class":443},[373,780,781],{"class":436}," 30",[373,783,784],{"class":485},")",[373,786,554],{"class":443},[373,788,789,791],{"class":375,"line":507},[373,790,573],{"class":485},[373,792,554],{"class":443},[373,794,795,798,800,803,806],{"class":375,"line":521},[373,796,797],{"class":485},"    connectivityManager",[373,799,513],{"class":443},[373,801,802],{"class":379}," FlutterConnectivityManager",[373,804,805],{"class":485},"()",[373,807,554],{"class":443},[373,809,810,813,815,817,819,821],{"class":375,"line":557},[373,811,812],{"class":485},"    child",[373,814,513],{"class":443},[373,816,529],{"class":477},[373,818,626],{"class":379},[373,820,805],{"class":485},[373,822,554],{"class":443},[373,824,825,827],{"class":375,"line":570},[373,826,581],{"class":485},[373,828,554],{"class":443},[373,830,831,833],{"class":375,"line":578},[373,832,784],{"class":485},[373,834,444],{"class":443},[391,836,837,839],{},[370,838,103],{}," sans managers fonctionne aussi, mais rien ne se relance alors au retour au premier plan ni à la reconnexion.",[841,842],"hr",{},[348,844,846],{"id":845},"hooks","Hooks",[391,848,849,850,853,854,423],{},"Si votre application utilise ",[370,851,852],{},"flutter_hooks",", ajoutez aussi ",[370,855,856],{},"qora_hooks",[362,858,860],{"className":364,"code":859,"filename":366,"language":367,"meta":368,"style":368},"flutter pub add qora_hooks flutter_hooks\n",[370,861,862],{"__ignoreMap":368},[373,863,864,866,868,870,873],{"class":375,"line":376},[373,865,350],{"class":379},[373,867,383],{"class":382},[373,869,386],{"class":382},[373,871,872],{"class":382}," qora_hooks",[373,874,875],{"class":382}," flutter_hooks\n",[391,877,878,879,881,882,602],{},"La configuration reste le même ",[370,880,422],{},". Voir ",[681,883,846],{"href":884},"../flutter-integration/hooks",[841,886],{},[348,888,890],{"id":889},"dart-pur","Dart pur",[391,892,893],{},"Pour les CLI, les serveurs et les packages partagés, utilisez le package principal. Il n'a aucune dépendance Flutter :",[362,895,897],{"className":364,"code":896,"filename":366,"language":367,"meta":368,"style":368},"dart pub add qora\n",[370,898,899],{"__ignoreMap":368},[373,900,901,903,905,907],{"class":375,"line":376},[373,902,429],{"class":379},[373,904,383],{"class":382},[373,906,386],{"class":382},[373,908,909],{"class":382}," qora\n",[362,911,914],{"className":426,"code":912,"filename":913,"language":429,"meta":368,"style":368},"import 'package:qora/qora.dart';\n\nFuture\u003Cvoid> main() async {\n  final client = QoraClient(\n    config: const QoraClientConfig(\n      defaultOptions: QoraOptions(staleTime: Duration(minutes: 5)),\n    ),\n  );\n\n  // Fetch ponctuel : mis en cache, dédupliqué, relancé en cas d'échec.\n  final user = await client.fetchQuery\u003CUser>(\n    key: ['users', 1],\n    fetcher: () => api.getUser(1),\n  );\n  print('User: ${user.name}');\n\n  // Toujours frais : servi depuis le cache, sans appel réseau.\n  await client.fetchQuery\u003CUser>(key: ['users', 1], fetcher: () => api.getUser(1));\n\n  client.dispose();\n}\n","bin/main.dart",[370,915,916,925,929,955,967,979,1003,1009,1015,1019,1025,1052,1075,1105,1111,1144,1149,1155,1211,1216,1231],{"__ignoreMap":368},[373,917,918,920,923],{"class":375,"line":376},[373,919,437],{"class":436},[373,921,922],{"class":382}," 'package:qora/qora.dart'",[373,924,444],{"class":443},[373,926,927],{"class":375,"line":447},[373,928,471],{"emptyLinePlaceholder":470},[373,930,931,934,937,939,942,945,948,952],{"class":375,"line":457},[373,932,933],{"class":379},"Future",[373,935,936],{"class":485},"\u003C",[373,938,478],{"class":477},[373,940,941],{"class":485},"> ",[373,943,944],{"class":481},"main",[373,946,947],{"class":485},"() ",[373,949,951],{"class":950},"s7zQu","async",[373,953,954],{"class":485}," {\n",[373,956,957,959,961,963,965],{"class":375,"line":467},[373,958,492],{"class":477},[373,960,495],{"class":485},[373,962,498],{"class":443},[373,964,501],{"class":379},[373,966,504],{"class":485},[373,968,969,971,973,975,977],{"class":375,"line":474},[373,970,510],{"class":485},[373,972,513],{"class":443},[373,974,529],{"class":477},[373,976,516],{"class":379},[373,978,504],{"class":485},[373,980,981,983,985,987,989,991,993,995,997,999,1001],{"class":375,"line":489},[373,982,524],{"class":485},[373,984,513],{"class":443},[373,986,532],{"class":379},[373,988,535],{"class":485},[373,990,513],{"class":443},[373,992,540],{"class":379},[373,994,543],{"class":485},[373,996,513],{"class":443},[373,998,548],{"class":436},[373,1000,551],{"class":485},[373,1002,554],{"class":443},[373,1004,1005,1007],{"class":375,"line":507},[373,1006,573],{"class":485},[373,1008,554],{"class":443},[373,1010,1011,1013],{"class":375,"line":521},[373,1012,581],{"class":485},[373,1014,444],{"class":443},[373,1016,1017],{"class":375,"line":557},[373,1018,471],{"emptyLinePlaceholder":470},[373,1020,1021],{"class":375,"line":570},[373,1022,1024],{"class":1023},"sHwdD","  // Fetch ponctuel : mis en cache, dédupliqué, relancé en cas d'échec.\n",[373,1026,1027,1029,1032,1034,1037,1039,1041,1044,1046,1049],{"class":375,"line":578},[373,1028,492],{"class":477},[373,1030,1031],{"class":485}," user ",[373,1033,498],{"class":443},[373,1035,1036],{"class":950}," await",[373,1038,613],{"class":485},[373,1040,602],{"class":443},[373,1042,1043],{"class":481},"fetchQuery",[373,1045,936],{"class":485},[373,1047,1048],{"class":379},"User",[373,1050,1051],{"class":485},">(\n",[373,1053,1054,1057,1059,1062,1065,1067,1070,1073],{"class":375,"line":586},[373,1055,1056],{"class":485},"    key",[373,1058,513],{"class":443},[373,1060,1061],{"class":485}," [",[373,1063,1064],{"class":382},"'users'",[373,1066,616],{"class":443},[373,1068,1069],{"class":436}," 1",[373,1071,1072],{"class":485},"]",[373,1074,554],{"class":443},[373,1076,1077,1080,1082,1085,1088,1091,1093,1096,1098,1101,1103],{"class":375,"line":591},[373,1078,1079],{"class":485},"    fetcher",[373,1081,513],{"class":443},[373,1083,1084],{"class":485}," () ",[373,1086,1087],{"class":443},"=>",[373,1089,1090],{"class":485}," api",[373,1092,602],{"class":443},[373,1094,1095],{"class":481},"getUser",[373,1097,597],{"class":485},[373,1099,1100],{"class":436},"1",[373,1102,784],{"class":485},[373,1104,554],{"class":443},[373,1106,1107,1109],{"class":375,"line":634},[373,1108,581],{"class":485},[373,1110,444],{"class":443},[373,1112,1114,1117,1119,1122,1125,1129,1131,1134,1137,1140,1142],{"class":375,"line":1113},15,[373,1115,1116],{"class":481},"  print",[373,1118,597],{"class":485},[373,1120,1121],{"class":382},"'User: ",[373,1123,1124],{"class":485},"${",[373,1126,1128],{"class":1127},"sHdIc","user",[373,1130,602],{"class":485},[373,1132,1133],{"class":1127},"name",[373,1135,1136],{"class":485},"}",[373,1138,1139],{"class":382},"'",[373,1141,784],{"class":485},[373,1143,444],{"class":443},[373,1145,1147],{"class":375,"line":1146},16,[373,1148,471],{"emptyLinePlaceholder":470},[373,1150,1152],{"class":375,"line":1151},17,[373,1153,1154],{"class":1023},"  // Toujours frais : servi depuis le cache, sans appel réseau.\n",[373,1156,1158,1161,1163,1165,1167,1169,1171,1174,1176,1178,1180,1182,1184,1186,1188,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209],{"class":375,"line":1157},18,[373,1159,1160],{"class":950},"  await",[373,1162,613],{"class":485},[373,1164,602],{"class":443},[373,1166,1043],{"class":481},[373,1168,936],{"class":485},[373,1170,1048],{"class":379},[373,1172,1173],{"class":485},">(key",[373,1175,513],{"class":443},[373,1177,1061],{"class":485},[373,1179,1064],{"class":382},[373,1181,616],{"class":443},[373,1183,1069],{"class":436},[373,1185,1072],{"class":485},[373,1187,616],{"class":443},[373,1189,1190],{"class":485}," fetcher",[373,1192,513],{"class":443},[373,1194,1084],{"class":485},[373,1196,1087],{"class":443},[373,1198,1090],{"class":485},[373,1200,602],{"class":443},[373,1202,1095],{"class":481},[373,1204,597],{"class":485},[373,1206,1100],{"class":436},[373,1208,551],{"class":485},[373,1210,444],{"class":443},[373,1212,1214],{"class":375,"line":1213},19,[373,1215,471],{"emptyLinePlaceholder":470},[373,1217,1219,1222,1224,1227,1229],{"class":375,"line":1218},20,[373,1220,1221],{"class":485},"  client",[373,1223,602],{"class":443},[373,1225,1226],{"class":481},"dispose",[373,1228,805],{"class":485},[373,1230,444],{"class":443},[373,1232,1234],{"class":375,"line":1233},21,[373,1235,637],{"class":485},[391,1237,1238,1241,1242,602],{},[370,1239,1240],{},"watchQuery"," renvoie un stream de chaque transition d'état quand vous avez besoin de réactivité hors de Flutter. Voir ",[681,1243,52],{"href":1244},"../core-concepts/queries",[841,1246],{},[348,1248,1250],{"id":1249},"overlay-devtools-optionnel","Overlay DevTools (optionnel)",[362,1252,1254],{"className":364,"code":1253,"filename":366,"language":367,"meta":368,"style":368},"flutter pub add qora_devtools_overlay\n",[370,1255,1256],{"__ignoreMap":368},[373,1257,1258,1260,1262,1264],{"class":375,"line":376},[373,1259,350],{"class":379},[373,1261,383],{"class":382},[373,1263,386],{"class":382},[373,1265,1266],{"class":382}," qora_devtools_overlay\n",[391,1268,1269,1270,1273,1274,1276],{},"Voir ",[681,1271,248],{"href":1272},"../devtools/overlay"," pour la configuration. C'est une dépendance normale, car votre ",[370,1275,428],{}," l'importe ; en build release il n'affiche rien et son UI est retirée par le tree shaking.",[841,1278],{},[348,1280,1282],{"id":1281},"étapes-suivantes","Étapes suivantes",[644,1284,1285,1290,1296],{},[647,1286,1287,1289],{},[681,1288,21],{"href":683}," : construire un écran liste et un écran détail, puis passer hors-ligne",[647,1291,1292,1295],{},[681,1293,103],{"href":1294},"../flutter-integration/qora-scope"," : toutes les options du scope",[647,1297,1298,1301],{},[681,1299,153],{"href":1300},"../recipes/persistence"," : conserver le cache entre deux lancements",[1303,1304,1305],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .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 .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}",{"title":368,"searchDepth":447,"depth":447,"links":1307},[1308,1314,1315,1316,1317],{"id":350,"depth":447,"text":351,"children":1309},[1310,1311,1312,1313],{"id":359,"depth":457,"text":360},{"id":412,"depth":457,"text":413},{"id":662,"depth":457,"text":663},{"id":687,"depth":457,"text":688},{"id":845,"depth":447,"text":846},{"id":889,"depth":447,"text":890},{"id":1249,"depth":447,"text":1250},{"id":1281,"depth":447,"text":1282},"Ajouter Qora à une application Flutter ou à un projet Dart pur, et le brancher avec un seul widget.","md",null,{},{"icon":19},{"title":16,"description":1324},"Ajouter qora_flutter à une application Flutter, ou qora à un projet Dart pur, et brancher le client avec QoraScope.auto.","aIAUXqhvHwMU3qlagG6ROxwxl1WJ8bb4H9vpOHm9BIA",[1327,1329],{"title":11,"path":12,"stem":13,"description":1328,"icon":14,"children":-1},"Qora récupère, met en cache et synchronise les données serveur dans Flutter et Dart, et garde votre application utilisable quand le réseau ne l'est pas.",{"title":21,"path":22,"stem":23,"description":1330,"icon":6,"children":-1},"Construire un écran liste et un écran détail avec Qora, voir le cache travailler, puis passer l'application hors-ligne.",1794040393923]