[{"data":1,"prerenderedAt":1459},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-devtools-data-display":342,"-fr-devtools-data-display-surround":1454},[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":253,"body":344,"description":1447,"extension":1448,"links":1449,"meta":1450,"navigation":1451,"path":254,"seo":1452,"stem":255,"__hash__":1453},"docs_fr/fr/06.devtools/4.data-display.md",{"type":345,"value":346,"toc":1431},"minimark",[347,356,359,364,369,484,498,500,504,515,521,619,622,624,631,638,798,801,803,810,821,929,931,935,941,1010,1016,1144,1146,1152,1157,1182,1198,1252,1264,1266,1270,1345,1347,1351,1377,1427],[348,349,350,351,355],"p",{},"L'overlay affiche les données de requête en cache sous forme d'arbre JSON extensible. La lisibilité de cet arbre dépend du type ",[352,353,354],"code",{},"T"," renvoyé par le fetcher : la plupart des modèles ne demandent aucune configuration, et les autres une seule option.",[357,358],"hr",{},[360,361,363],"h2",{"id":362},"ordre-de-résolution-de-la-sérialisation","Ordre de résolution de la sérialisation",[348,365,366,368],{},[352,367,202],{}," n'a aucune connaissance des types de domaine. Quand un fetch se règle, le résultat est passé au tracker actif selon l'ordre de résolution suivant :",[370,371,372,388],"table",{},[373,374,375],"thead",{},[376,377,378,382,385],"tr",{},[379,380,381],"th",{},"Priorité",[379,383,384],{},"Condition",[379,386,387],{},"Résultat",[389,390,391,406,430,443,456,470],"tbody",{},[376,392,393,397,403],{},[394,395,396],"td",{},"1",[394,398,399,402],{},[352,400,401],{},"QoraOptions.toJson"," est défini",[394,404,405],{},"Appelle la fonction fournie et utilise sa valeur de retour",[376,407,408,411,427],{},[394,409,410],{},"2",[394,412,413,416,417,416,420,423,424],{},[352,414,415],{},"String",", ",[352,418,419],{},"num",[352,421,422],{},"bool"," ou ",[352,425,426],{},"null",[394,428,429],{},"Passé tel quel",[376,431,432,435,440],{},[394,433,434],{},"3",[394,436,437],{},[352,438,439],{},"List",[394,441,442],{},"Chaque élément est sérialisé récursivement",[376,444,445,448,453],{},[394,446,447],{},"4",[394,449,450],{},[352,451,452],{},"Map",[394,454,455],{},"Chaque valeur est sérialisée récursivement",[376,457,458,461,467],{},[394,459,460],{},"5",[394,462,463,464],{},"Objet avec une méthode ",[352,465,466],{},"toJson()",[394,468,469],{},"Appelée via dispatch dynamique, résultat utilisé",[376,471,472,475,478],{},[394,473,474],{},"6",[394,476,477],{},"Tout le reste",[394,479,480,483],{},[352,481,482],{},".toString()"," appelé, affiché comme chaîne simple",[348,485,486,487,490,491,494,495,497],{},"Le parcours est récursif. Un ",[352,488,489],{},"List\u003CMap\u003CString, User>>"," est géré correctement sans configuration, à condition que ",[352,492,493],{},"User"," implémente ",[352,496,466],{},".",[357,499],{},[360,501,503],{"id":502},"scénarios-courants","Scénarios courants",[505,506,508,511,512],"h3",{"id":507},"json_serializable-et-freezed",[352,509,510],{},"json_serializable"," et ",[352,513,514],{},"freezed",[348,516,517,518,520],{},"Les deux générateurs de code produisent une méthode ",[352,519,466],{},". Le sérialiseur la détecte et l'appelle automatiquement. Aucune configuration supplémentaire n'est requise.",[522,523,529],"pre",{"className":524,"code":525,"filename":526,"language":527,"meta":528,"style":528},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// @JsonSerializable() ou @freezed : pas de config supplémentaire nécessaire\nfetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n);\n","user_repository.dart","dart","",[352,530,531,540,557,583,610],{"__ignoreMap":528},[532,533,536],"span",{"class":534,"line":535},"line",1,[532,537,539],{"class":538},"sHwdD","// @JsonSerializable() ou @freezed : pas de config supplémentaire nécessaire\n",[532,541,543,547,551,554],{"class":534,"line":542},2,[532,544,546],{"class":545},"s2Zo4","fetchQuery",[532,548,550],{"class":549},"sTEyZ","\u003C",[532,552,493],{"class":553},"sBMFI",[532,555,556],{"class":549},">(\n",[532,558,560,563,567,570,574,577,580],{"class":534,"line":559},3,[532,561,562],{"class":549},"  key",[532,564,566],{"class":565},"sMK4o",":",[532,568,569],{"class":549}," [",[532,571,573],{"class":572},"sfazB","'users'",[532,575,576],{"class":565},",",[532,578,579],{"class":549}," userId]",[532,581,582],{"class":565},",\n",[532,584,586,589,591,594,597,600,602,605,608],{"class":534,"line":585},4,[532,587,588],{"class":549},"  fetcher",[532,590,566],{"class":565},[532,592,593],{"class":549}," () ",[532,595,596],{"class":565},"=>",[532,598,599],{"class":549}," api",[532,601,497],{"class":565},[532,603,604],{"class":545},"getUser",[532,606,607],{"class":549},"(userId)",[532,609,582],{"class":565},[532,611,613,616],{"class":534,"line":612},5,[532,614,615],{"class":549},")",[532,617,618],{"class":565},";\n",[348,620,621],{},"L'overlay rend le graphe d'objets complet sous forme d'arbre extensible.",[357,623],{},[505,625,627,628,630],{"id":626},"réponses-map-brutes","Réponses ",[352,629,452],{}," brutes",[348,632,633,634,637],{},"Quand le fetcher retourne ",[352,635,636],{},"Map\u003CString, dynamic>"," directement (par exemple, après décodage manuel du corps de la réponse HTTP), aucune configuration n'est requise.",[522,639,641],{"className":524,"code":640,"filename":526,"language":527,"meta":528,"style":528},"fetchQuery\u003CMap\u003CString, dynamic>>(\n  key: ['users', userId],\n  fetcher: () async {\n    final response = await http.get(Uri.parse('/users/$userId'));\n    return jsonDecode(response.body) as Map\u003CString, dynamic>;\n  },\n);\n",[352,642,643,663,679,694,748,783,791],{"__ignoreMap":528},[532,644,645,647,649,651,653,655,657,660],{"class":534,"line":535},[532,646,546],{"class":545},[532,648,550],{"class":549},[532,650,452],{"class":553},[532,652,550],{"class":549},[532,654,415],{"class":553},[532,656,416],{"class":549},[532,658,659],{"class":553},"dynamic",[532,661,662],{"class":549},">>(\n",[532,664,665,667,669,671,673,675,677],{"class":534,"line":542},[532,666,562],{"class":549},[532,668,566],{"class":565},[532,670,569],{"class":549},[532,672,573],{"class":572},[532,674,576],{"class":565},[532,676,579],{"class":549},[532,678,582],{"class":565},[532,680,681,683,685,687,691],{"class":534,"line":559},[532,682,588],{"class":549},[532,684,566],{"class":565},[532,686,593],{"class":549},[532,688,690],{"class":689},"s7zQu","async",[532,692,693],{"class":549}," {\n",[532,695,696,700,703,706,709,712,714,717,720,723,725,728,730,733,736,740,743,746],{"class":534,"line":585},[532,697,699],{"class":698},"spNyl","    final",[532,701,702],{"class":549}," response ",[532,704,705],{"class":565},"=",[532,707,708],{"class":689}," await",[532,710,711],{"class":549}," http",[532,713,497],{"class":565},[532,715,716],{"class":545},"get",[532,718,719],{"class":549},"(",[532,721,722],{"class":553},"Uri",[532,724,497],{"class":565},[532,726,727],{"class":545},"parse",[532,729,719],{"class":549},[532,731,732],{"class":572},"'/users/",[532,734,735],{"class":549},"$",[532,737,739],{"class":738},"sHdIc","userId",[532,741,742],{"class":572},"'",[532,744,745],{"class":549},"))",[532,747,618],{"class":565},[532,749,750,753,756,759,761,764,767,770,772,774,776,778,781],{"class":534,"line":612},[532,751,752],{"class":689},"    return",[532,754,755],{"class":545}," jsonDecode",[532,757,758],{"class":549},"(response",[532,760,497],{"class":565},[532,762,763],{"class":549},"body) ",[532,765,766],{"class":565},"as",[532,768,769],{"class":553}," Map",[532,771,550],{"class":549},[532,773,415],{"class":553},[532,775,416],{"class":549},[532,777,659],{"class":553},[532,779,780],{"class":549},">",[532,782,618],{"class":565},[532,784,786,789],{"class":534,"line":785},6,[532,787,788],{"class":549},"  }",[532,790,582],{"class":565},[532,792,794,796],{"class":534,"line":793},7,[532,795,615],{"class":549},[532,797,618],{"class":565},[348,799,800],{},"Cette approche ne nécessite aucune configuration de sérialisation. L'étape de désérialisation doit être gérée dans le fetcher ou la couche repository plutôt que dans un widget consommateur.",[357,802],{},[505,804,806,807],{"id":805},"modèles-manuels-sans-tojson","Modèles manuels sans ",[352,808,809],{},"toJson",[348,811,812,813,815,816,818,819,497],{},"Quand un modèle n'a pas de méthode ",[352,814,466],{},", le sérialiseur revient à ",[352,817,482],{}," et affiche un nœud de chaîne unique. Pour produire une sortie structurée, fournir un sérialiseur explicite via ",[352,820,401],{},[522,822,824],{"className":524,"code":823,"filename":526,"language":527,"meta":528,"style":528},"fetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: QoraOptions(\n    toJson: (data) => (data as User).toJson(),\n  ),\n);\n",[352,825,826,836,852,872,885,916,923],{"__ignoreMap":528},[532,827,828,830,832,834],{"class":534,"line":535},[532,829,546],{"class":545},[532,831,550],{"class":549},[532,833,493],{"class":553},[532,835,556],{"class":549},[532,837,838,840,842,844,846,848,850],{"class":534,"line":542},[532,839,562],{"class":549},[532,841,566],{"class":565},[532,843,569],{"class":549},[532,845,573],{"class":572},[532,847,576],{"class":565},[532,849,579],{"class":549},[532,851,582],{"class":565},[532,853,854,856,858,860,862,864,866,868,870],{"class":534,"line":559},[532,855,588],{"class":549},[532,857,566],{"class":565},[532,859,593],{"class":549},[532,861,596],{"class":565},[532,863,599],{"class":549},[532,865,497],{"class":565},[532,867,604],{"class":545},[532,869,607],{"class":549},[532,871,582],{"class":565},[532,873,874,877,879,882],{"class":534,"line":585},[532,875,876],{"class":549},"  options",[532,878,566],{"class":565},[532,880,881],{"class":553}," QoraOptions",[532,883,884],{"class":549},"(\n",[532,886,887,890,892,895,897,900,902,905,907,909,911,914],{"class":534,"line":612},[532,888,889],{"class":549},"    toJson",[532,891,566],{"class":565},[532,893,894],{"class":549}," (data) ",[532,896,596],{"class":565},[532,898,899],{"class":549}," (data ",[532,901,766],{"class":565},[532,903,904],{"class":553}," User",[532,906,615],{"class":549},[532,908,497],{"class":565},[532,910,809],{"class":545},[532,912,913],{"class":549},"()",[532,915,582],{"class":565},[532,917,918,921],{"class":534,"line":785},[532,919,920],{"class":549},"  )",[532,922,582],{"class":565},[532,924,925,927],{"class":534,"line":793},[532,926,615],{"class":549},[532,928,618],{"class":565},[357,930],{},[505,932,934],{"id":933},"listes","Listes",[348,936,937,938,940],{},"Les listes d'objets typés suivent les mêmes règles de résolution. Quand le type d'élément implémente ",[352,939,466],{},", chaque élément est sérialisé automatiquement.",[522,942,945],{"className":524,"code":943,"filename":944,"language":527,"meta":528,"style":528},"fetchQuery\u003CList\u003CPost>>(\n  key: ['posts'],\n  fetcher: () => api.getPosts(),\n  // Post implémente toJson() : détecté automatiquement, pas de config supplémentaire.\n);\n","posts_repository.dart",[352,946,947,962,978,999,1004],{"__ignoreMap":528},[532,948,949,951,953,955,957,960],{"class":534,"line":535},[532,950,546],{"class":545},[532,952,550],{"class":549},[532,954,439],{"class":553},[532,956,550],{"class":549},[532,958,959],{"class":553},"Post",[532,961,662],{"class":549},[532,963,964,966,968,970,973,976],{"class":534,"line":542},[532,965,562],{"class":549},[532,967,566],{"class":565},[532,969,569],{"class":549},[532,971,972],{"class":572},"'posts'",[532,974,975],{"class":549},"]",[532,977,582],{"class":565},[532,979,980,982,984,986,988,990,992,995,997],{"class":534,"line":559},[532,981,588],{"class":549},[532,983,566],{"class":565},[532,985,593],{"class":549},[532,987,596],{"class":565},[532,989,599],{"class":549},[532,991,497],{"class":565},[532,993,994],{"class":545},"getPosts",[532,996,913],{"class":549},[532,998,582],{"class":565},[532,1000,1001],{"class":534,"line":585},[532,1002,1003],{"class":538},"  // Post implémente toJson() : détecté automatiquement, pas de config supplémentaire.\n",[532,1005,1006,1008],{"class":534,"line":612},[532,1007,615],{"class":549},[532,1009,618],{"class":565},[348,1011,1012,1013,1015],{},"Quand les éléments individuels n'ont pas de ",[352,1014,466],{},", fournir un sérialiseur :",[522,1017,1019],{"className":524,"code":1018,"filename":944,"language":527,"meta":528,"style":528},"fetchQuery\u003CList\u003CPost>>(\n  key: ['posts'],\n  fetcher: () => api.getPosts(),\n  options: QoraOptions(\n    toJson: (data) => (data as List\u003CPost>).map((p) => p.toJson()).toList(),\n  ),\n);\n",[352,1020,1021,1035,1049,1069,1079,1132,1138],{"__ignoreMap":528},[532,1022,1023,1025,1027,1029,1031,1033],{"class":534,"line":535},[532,1024,546],{"class":545},[532,1026,550],{"class":549},[532,1028,439],{"class":553},[532,1030,550],{"class":549},[532,1032,959],{"class":553},[532,1034,662],{"class":549},[532,1036,1037,1039,1041,1043,1045,1047],{"class":534,"line":542},[532,1038,562],{"class":549},[532,1040,566],{"class":565},[532,1042,569],{"class":549},[532,1044,972],{"class":572},[532,1046,975],{"class":549},[532,1048,582],{"class":565},[532,1050,1051,1053,1055,1057,1059,1061,1063,1065,1067],{"class":534,"line":559},[532,1052,588],{"class":549},[532,1054,566],{"class":565},[532,1056,593],{"class":549},[532,1058,596],{"class":565},[532,1060,599],{"class":549},[532,1062,497],{"class":565},[532,1064,994],{"class":545},[532,1066,913],{"class":549},[532,1068,582],{"class":565},[532,1070,1071,1073,1075,1077],{"class":534,"line":585},[532,1072,876],{"class":549},[532,1074,566],{"class":565},[532,1076,881],{"class":553},[532,1078,884],{"class":549},[532,1080,1081,1083,1085,1087,1089,1091,1093,1096,1098,1100,1103,1105,1108,1111,1113,1116,1118,1120,1123,1125,1128,1130],{"class":534,"line":612},[532,1082,889],{"class":549},[532,1084,566],{"class":565},[532,1086,894],{"class":549},[532,1088,596],{"class":565},[532,1090,899],{"class":549},[532,1092,766],{"class":565},[532,1094,1095],{"class":553}," List",[532,1097,550],{"class":549},[532,1099,959],{"class":553},[532,1101,1102],{"class":549},">)",[532,1104,497],{"class":565},[532,1106,1107],{"class":545},"map",[532,1109,1110],{"class":549},"((p) ",[532,1112,596],{"class":565},[532,1114,1115],{"class":549}," p",[532,1117,497],{"class":565},[532,1119,809],{"class":545},[532,1121,1122],{"class":549},"())",[532,1124,497],{"class":565},[532,1126,1127],{"class":545},"toList",[532,1129,913],{"class":549},[532,1131,582],{"class":565},[532,1133,1134,1136],{"class":534,"line":785},[532,1135,920],{"class":549},[532,1137,582],{"class":565},[532,1139,1140,1142],{"class":534,"line":793},[532,1141,615],{"class":549},[532,1143,618],{"class":565},[357,1145],{},[360,1147,1149,1150],{"id":1148},"loption-tojson","L'option ",[352,1151,809],{},[348,1153,1154,1156],{},[352,1155,401],{}," accepte toute fonction avec la signature :",[522,1158,1160],{"className":524,"code":1159,"language":527,"meta":528,"style":528},"Object? Function(Object? data)\n",[352,1161,1162],{"__ignoreMap":528},[532,1163,1164,1167,1170,1173,1175,1177,1179],{"class":534,"line":535},[532,1165,1166],{"class":553},"Object",[532,1168,1169],{"class":565},"?",[532,1171,1172],{"class":553}," Function",[532,1174,719],{"class":549},[532,1176,1166],{"class":553},[532,1178,1169],{"class":565},[532,1180,1181],{"class":549}," data)\n",[348,1183,1184,1185,416,1187,416,1189,416,1191,416,1193,423,1195,1197],{},"La valeur de retour doit être JSON-safe : ",[352,1186,636],{},[352,1188,439],{},[352,1190,415],{},[352,1192,419],{},[352,1194,422],{},[352,1196,426],{},". Retourner tout autre type causera une erreur d'exécution quand le rendu DevTools encode la valeur.",[522,1199,1201],{"className":524,"code":1200,"filename":526,"language":527,"meta":528,"style":528},"// Le cast est sûr : T est User et data est le résultat du fetcher.\noptions: QoraOptions(\n  toJson: (data) => (data as User).toJson(),\n),\n",[352,1202,1203,1208,1219,1246],{"__ignoreMap":528},[532,1204,1205],{"class":534,"line":535},[532,1206,1207],{"class":538},"// Le cast est sûr : T est User et data est le résultat du fetcher.\n",[532,1209,1210,1213,1215,1217],{"class":534,"line":542},[532,1211,1212],{"class":549},"options",[532,1214,566],{"class":565},[532,1216,881],{"class":553},[532,1218,884],{"class":549},[532,1220,1221,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244],{"class":534,"line":559},[532,1222,1223],{"class":549},"  toJson",[532,1225,566],{"class":565},[532,1227,894],{"class":549},[532,1229,596],{"class":565},[532,1231,899],{"class":549},[532,1233,766],{"class":565},[532,1235,904],{"class":553},[532,1237,615],{"class":549},[532,1239,497],{"class":565},[532,1241,809],{"class":545},[532,1243,913],{"class":549},[532,1245,582],{"class":565},[532,1247,1248,1250],{"class":534,"line":585},[532,1249,615],{"class":549},[532,1251,582],{"class":565},[348,1253,1254,1256,1257,1259,1260,1263],{},[352,1255,809],{}," suit les mêmes sémantiques de fusion que tous les autres champs de ",[352,1258,215],{},". Une valeur sur ",[352,1261,1262],{},"QoraClientConfig.defaultOptions"," s'applique globalement et peut être remplacée par requête.",[357,1265],{},[360,1267,1269],{"id":1268},"quand-utiliser-chaque-approche","Quand utiliser chaque approche",[370,1271,1272,1282],{},[373,1273,1274],{},[376,1275,1276,1279],{},[379,1277,1278],{},"Situation",[379,1280,1281],{},"Recommandation",[389,1283,1284,1296,1311,1320,1333],{},[376,1285,1286,1293],{},[394,1287,1288,1289,423,1291],{},"Modèles ",[352,1290,510],{},[352,1292,514],{},[394,1294,1295],{},"Pas de configuration requise. Détecté auto.",[376,1297,1298,1308],{},[394,1299,1300,423,1302,1304,1305],{},[352,1301,452],{},[352,1303,439],{}," bruts depuis ",[352,1306,1307],{},"jsonDecode",[394,1309,1310],{},"Pas de configuration requise. Passé tel quel.",[376,1312,1313,1318],{},[394,1314,1315,1316],{},"Modèle manuel avec une méthode ",[352,1317,466],{},[394,1319,1295],{},[376,1321,1322,1327],{},[394,1323,1324,1325],{},"Modèle sans ",[352,1326,466],{},[394,1328,1329,1330,497],{},"Fournir ",[352,1331,1332],{},"QoraOptions(toJson: ...)",[376,1334,1335,1341],{},[394,1336,1337,1338,1340],{},"Sérialisation personnalisée avec une signature ",[352,1339,809],{}," non standard",[394,1342,1329,1343,497],{},[352,1344,1332],{},[357,1346],{},[360,1348,1350],{"id":1349},"impact-en-production","Impact en production",[348,1352,1353,1354,1357,1358,1361,1362,1365,1366,1368,1369,1372,1373,1376],{},"Le chemin de sérialisation (",[352,1355,1356],{},"_serializeForTracker",") n'est exécuté que quand ",[352,1359,1360],{},"QoraTracker.needsSerialization"," retourne ",[352,1363,1364],{},"true",". En production, ",[352,1367,202],{}," utilise par défaut ",[352,1370,1371],{},"NoOpTracker",", qui retourne ",[352,1374,1375],{},"false",". Aucune sérialisation ne s'exécute et aucun overhead n'est introduit.",[522,1378,1381],{"className":524,"code":1379,"filename":1380,"language":527,"meta":528,"style":528},"final client = QoraClient(\n  tracker: kDebugMode ? tracker : null, // null active NoOpTracker\n);\n","main.dart",[352,1382,1383,1398,1421],{"__ignoreMap":528},[532,1384,1385,1388,1391,1393,1396],{"class":534,"line":535},[532,1386,1387],{"class":698},"final",[532,1389,1390],{"class":549}," client ",[532,1392,705],{"class":565},[532,1394,1395],{"class":553}," QoraClient",[532,1397,884],{"class":549},[532,1399,1400,1403,1405,1408,1410,1413,1415,1418],{"class":534,"line":542},[532,1401,1402],{"class":549},"  tracker",[532,1404,566],{"class":565},[532,1406,1407],{"class":549}," kDebugMode ",[532,1409,1169],{"class":565},[532,1411,1412],{"class":549}," tracker ",[532,1414,566],{"class":565},[532,1416,1417],{"class":565}," null,",[532,1419,1420],{"class":538}," // null active NoOpTracker\n",[532,1422,1423,1425],{"class":534,"line":559},[532,1424,615],{"class":549},[532,1426,618],{"class":565},[1428,1429,1430],"style",{},"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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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":528,"searchDepth":542,"depth":542,"links":1432},[1433,1434,1443,1445,1446],{"id":362,"depth":542,"text":363},{"id":502,"depth":542,"text":503,"children":1435},[1436,1438,1440,1442],{"id":507,"depth":559,"text":1437},"json_serializable et freezed",{"id":626,"depth":559,"text":1439},"Réponses Map brutes",{"id":805,"depth":559,"text":1441},"Modèles manuels sans toJson",{"id":933,"depth":559,"text":934},{"id":1148,"depth":542,"text":1444},"L'option toJson",{"id":1268,"depth":542,"text":1269},{"id":1349,"depth":542,"text":1350},"Comment les données de requête en cache deviennent l'arbre JSON affiché dans l'overlay, et comment rendre lisibles les types de modèles personnalisés.","md",null,{},{"icon":256},{"title":253,"description":1447},"U75O18YDSKl_ptTgignLqx4pamtm3DsjVaGb78OMHy0",[1455,1457],{"title":248,"path":249,"stem":250,"description":1456,"icon":251,"children":-1},"Un panneau de débogage flottant rendu à l'intérieur de l'app Flutter. Inspectez les requêtes, mutations et mises à jour optimistes sans outil externe.",{"title":264,"path":265,"stem":266,"description":1458,"icon":267,"children":-1},"Ajouter Qora à une app Provider existante pour spécialiser la gestion de l'état serveur tout en conservant Provider pour l'état UI et l'injection de dépendances.",1794040411143]