[{"data":1,"prerenderedAt":3223},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-flutter-integration-qora-builder":342,"-fr-flutter-integration-qora-builder-surround":3218},[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":108,"body":344,"description":3211,"extension":3212,"links":3213,"meta":3214,"navigation":3215,"path":109,"seo":3216,"stem":110,"__hash__":3217},"docs_fr/fr/03.flutter-integration/3.qora-builder.md",{"type":345,"value":346,"toc":3184},"minimark",[347,355,358,363,704,707,745,754,756,760,765,795,817,819,823,1024,1026,1030,1035,1046,1344,1346,1352,1360,1673,1719,1736,1738,1744,1747,1856,1869,1871,1877,1885,2016,2048,2050,2056,2066,2266,2275,2277,2281,2290,2413,2415,2419,2428,2538,2544,2546,2553,2559,2716,2779,2784,2812,2824,2826,2830,2841,2863,2866,2868,2875,2881,3056,3062,3121,3126,3128,3132,3180],[348,349,350,354],"p",{},[351,352,353],"code",{},"QoraBuilder\u003CT>"," est le moyen principal de lier les données serveur à l'UI Flutter. Il gère le cycle de vie complet des requêtes : récupération, cache, réactivité, revalidation en arrière-plan, avec une seule déclaration de widget.",[356,357],"hr",{},[359,360,362],"h2",{"id":361},"utilisation-de-base","Utilisation de base",[364,365,371],"pre",{"className":366,"code":367,"filename":368,"language":369,"meta":370,"style":370},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraBuilder\u003CList\u003CUser>>(\n  queryKey: ['users'],\n  fetcher: () => api.getUsers(),\n  builder: (context, state, fetchStatus) {\n    return switch (state) {\n      Initial() => const SizedBox.shrink(),\n      Loading(:final previousData) => previousData != null\n          ? Stack(children: [UserList(previousData), const LinearProgressIndicator()])\n          : const CircularProgressIndicator(),\n      Success(:final data) => UserList(data),\n      Failure(:final error, :final previousData) => previousData != null\n          ? Column(children: [UserList(previousData), ErrorBanner(error)])\n          : ErrorScreen(error),\n    };\n  },\n)\n","user_list_screen.dart","dart","",[351,372,373,396,419,448,470,483,510,538,570,585,610,642,668,681,690,698],{"__ignoreMap":370},[374,375,378,381,385,388,390,393],"span",{"class":376,"line":377},"line",1,[374,379,108],{"class":380},"sBMFI",[374,382,384],{"class":383},"sTEyZ","\u003C",[374,386,387],{"class":380},"List",[374,389,384],{"class":383},[374,391,392],{"class":380},"User",[374,394,395],{"class":383},">>(\n",[374,397,399,402,406,409,413,416],{"class":376,"line":398},2,[374,400,401],{"class":383},"  queryKey",[374,403,405],{"class":404},"sMK4o",":",[374,407,408],{"class":383}," [",[374,410,412],{"class":411},"sfazB","'users'",[374,414,415],{"class":383},"]",[374,417,418],{"class":404},",\n",[374,420,422,425,427,430,433,436,439,443,446],{"class":376,"line":421},3,[374,423,424],{"class":383},"  fetcher",[374,426,405],{"class":404},[374,428,429],{"class":383}," () ",[374,431,432],{"class":404},"=>",[374,434,435],{"class":383}," api",[374,437,438],{"class":404},".",[374,440,442],{"class":441},"s2Zo4","getUsers",[374,444,445],{"class":383},"()",[374,447,418],{"class":404},[374,449,451,454,456,459,462,465,467],{"class":376,"line":450},4,[374,452,453],{"class":383},"  builder",[374,455,405],{"class":404},[374,457,458],{"class":383}," (context",[374,460,461],{"class":404},",",[374,463,464],{"class":383}," state",[374,466,461],{"class":404},[374,468,469],{"class":383}," fetchStatus) {\n",[374,471,473,477,480],{"class":376,"line":472},5,[374,474,476],{"class":475},"s7zQu","    return",[374,478,479],{"class":475}," switch",[374,481,482],{"class":383}," (state) {\n",[374,484,486,489,492,494,498,501,503,506,508],{"class":376,"line":485},6,[374,487,488],{"class":380},"      Initial",[374,490,491],{"class":383},"() ",[374,493,432],{"class":404},[374,495,497],{"class":496},"spNyl"," const",[374,499,500],{"class":380}," SizedBox",[374,502,438],{"class":404},[374,504,505],{"class":441},"shrink",[374,507,445],{"class":383},[374,509,418],{"class":404},[374,511,513,516,519,521,524,527,529,532,535],{"class":376,"line":512},7,[374,514,515],{"class":380},"      Loading",[374,517,518],{"class":383},"(",[374,520,405],{"class":404},[374,522,523],{"class":496},"final",[374,525,526],{"class":383}," previousData) ",[374,528,432],{"class":404},[374,530,531],{"class":383}," previousData ",[374,533,534],{"class":404},"!=",[374,536,537],{"class":404}," null\n",[374,539,541,544,547,550,552,554,557,560,562,564,567],{"class":376,"line":540},8,[374,542,543],{"class":404},"          ?",[374,545,546],{"class":380}," Stack",[374,548,549],{"class":383},"(children",[374,551,405],{"class":404},[374,553,408],{"class":383},[374,555,556],{"class":380},"UserList",[374,558,559],{"class":383},"(previousData)",[374,561,461],{"class":404},[374,563,497],{"class":496},[374,565,566],{"class":380}," LinearProgressIndicator",[374,568,569],{"class":383},"()])\n",[374,571,573,576,578,581,583],{"class":376,"line":572},9,[374,574,575],{"class":404},"          :",[374,577,497],{"class":496},[374,579,580],{"class":380}," CircularProgressIndicator",[374,582,445],{"class":383},[374,584,418],{"class":404},[374,586,588,591,593,595,597,600,602,605,608],{"class":376,"line":587},10,[374,589,590],{"class":380},"      Success",[374,592,518],{"class":383},[374,594,405],{"class":404},[374,596,523],{"class":496},[374,598,599],{"class":383}," data) ",[374,601,432],{"class":404},[374,603,604],{"class":380}," UserList",[374,606,607],{"class":383},"(data)",[374,609,418],{"class":404},[374,611,613,616,618,620,622,625,627,630,632,634,636,638,640],{"class":376,"line":612},11,[374,614,615],{"class":380},"      Failure",[374,617,518],{"class":383},[374,619,405],{"class":404},[374,621,523],{"class":496},[374,623,624],{"class":383}," error",[374,626,461],{"class":404},[374,628,629],{"class":404}," :",[374,631,523],{"class":496},[374,633,526],{"class":383},[374,635,432],{"class":404},[374,637,531],{"class":383},[374,639,534],{"class":404},[374,641,537],{"class":404},[374,643,645,647,650,652,654,656,658,660,662,665],{"class":376,"line":644},12,[374,646,543],{"class":404},[374,648,649],{"class":380}," Column",[374,651,549],{"class":383},[374,653,405],{"class":404},[374,655,408],{"class":383},[374,657,556],{"class":380},[374,659,559],{"class":383},[374,661,461],{"class":404},[374,663,664],{"class":380}," ErrorBanner",[374,666,667],{"class":383},"(error)])\n",[374,669,671,673,676,679],{"class":376,"line":670},13,[374,672,575],{"class":404},[374,674,675],{"class":380}," ErrorScreen",[374,677,678],{"class":383},"(error)",[374,680,418],{"class":404},[374,682,684,687],{"class":376,"line":683},14,[374,685,686],{"class":383},"    }",[374,688,689],{"class":404},";\n",[374,691,693,696],{"class":376,"line":692},15,[374,694,695],{"class":383},"  }",[374,697,418],{"class":404},[374,699,701],{"class":376,"line":700},16,[374,702,703],{"class":383},")\n",[348,705,706],{},"Le builder reçoit trois arguments :",[708,709,710,723,734],"ol",{},[711,712,713,719,720],"li",{},[714,715,716],"strong",{},[351,717,718],{},"context"," : le ",[351,721,722],{},"BuildContext",[711,724,725,719,730,733],{},[714,726,727],{},[351,728,729],{},"state",[351,731,732],{},"QoraState\u003CT>"," courant (ce que vous avez)",[711,735,736,719,741,744],{},[714,737,738],{},[351,739,740],{},"fetchStatus",[351,742,743],{},"FetchStatus"," courant (ce que Qora fait en ce moment)",[348,746,747,748,750,751,753],{},"La correspondance de motifs exhaustive sur le ",[351,749,729],{}," scellé est l'approche idiomatique. Utiliser ",[351,752,740],{}," pour les indicateurs secondaires (barres de progression, chips hors-ligne) sans modifier la vue d'état principale.",[356,755],{},[359,757,759],{"id":758},"fonctionnement","Fonctionnement",[348,761,762,763,629],{},"Au montage, ",[351,764,108],{},[708,766,767,777],{},[711,768,769,772,773,776],{},[714,770,771],{},"S'abonne"," à ",[351,774,775],{},"client.watchState\u003CT>(queryKey)"," : un stream d'observation uniquement qui émet chaque mise à jour d'état pour cette clé (y compris les mises à jour déclenchées par d'autres widgets ou services en arrière-plan).",[711,778,779,782,783,786,787,790,791,794],{},[714,780,781],{},"Récupère"," via ",[351,784,785],{},"client.fetchQuery(...)"," si ",[351,788,789],{},"enabled"," est ",[351,792,793],{},"true",". Le client gère automatiquement la déduplication, le cache et le stale-while-revalidate.",[348,796,797,798,801,802,805,806,809,810,812,813,816],{},"Quand la requête est ",[714,799,800],{},"invalidée externalement"," (via ",[351,803,804],{},"client.invalidate()",", une reprise du cycle de vie ou un événement de reconnexion), l'état passe à ",[351,807,808],{},"Loading(previousData: data)",". ",[351,811,108],{}," détecte ce pattern dans le stream et déclenche un ",[351,814,815],{},"fetchQuery"," frais. La déduplication du client garantit qu'une seule requête réseau se déclenche même si plusieurs widgets sont abonnés à la même clé.",[356,818],{},[359,820,822],{"id":821},"props","Props",[824,825,826,845],"table",{},[827,828,829],"thead",{},[830,831,832,836,839,842],"tr",{},[833,834,835],"th",{},"Prop",[833,837,838],{},"Type",[833,840,841],{},"Défaut",[833,843,844],{},"Description",[846,847,848,874,891,908,931,953,983,1002],"tbody",{},[830,849,850,856,868,871],{},[851,852,853],"td",{},[351,854,855],{},"queryKey",[851,857,858,861,862,864,865,867],{},[351,859,860],{},"Object"," (",[351,863,387],{}," ou ",[351,866,207],{},")",[851,869,870],{},"requis",[851,872,873],{},"Clé de cache. La changer déclenche un réabonnement et un fetch frais.",[830,875,876,881,886,888],{},[851,877,878],{},[351,879,880],{},"fetcher",[851,882,883],{},[351,884,885],{},"Future\u003CT> Function()",[851,887,870],{},[851,889,890],{},"Fonction asynchrone qui retourne les données. Doit lever une exception en cas d'échec.",[830,892,893,898,903,905],{},[851,894,895],{},[351,896,897],{},"builder",[851,899,900],{},[351,901,902],{},"Widget Function(BuildContext, QoraState\u003CT>, FetchStatus)",[851,904,870],{},[851,906,907],{},"Construit l'arbre de widgets depuis l'état courant et le statut de fetch.",[830,909,910,915,920,925],{},[851,911,912],{},[351,913,914],{},"options",[851,916,917],{},[351,918,919],{},"QoraOptions?",[851,921,922],{},[351,923,924],{},"null",[851,926,927,928,438],{},"Config par requête fusionnée sur ",[351,929,930],{},"QoraClientConfig.defaultOptions",[830,932,933,937,942,946],{},[851,934,935],{},[351,936,789],{},[851,938,939],{},[351,940,941],{},"bool",[851,943,944],{},[351,945,793],{},[851,947,948,949,952],{},"Quand ",[351,950,951],{},"false",", aucun fetch n'est déclenché. Le widget observe quand même l'état en cache.",[830,954,955,960,964,968],{},[851,956,957],{},[351,958,959],{},"keepPreviousData",[851,961,962],{},[351,963,941],{},[851,965,966],{},[351,967,951],{},[851,969,970,971,974,975,978,979,982],{},"Enrichit les états ",[351,972,973],{},"Loading","/",[351,976,977],{},"Failure"," avec les dernières données ",[351,980,981],{},"Success"," de ce widget.",[830,984,985,990,995,999],{},[851,986,987],{},[351,988,989],{},"select",[851,991,992],{},[351,993,994],{},"Object? Function(T data)?",[851,996,997],{},[351,998,924],{},[851,1000,1001],{},"Filtre de reconstruction : le widget ne se reconstruit que si le type d'état ou cette valeur change. Le builder reçoit toujours l'état complet.",[830,1003,1004,1009,1014,1018],{},[851,1005,1006],{},[351,1007,1008],{},"client",[851,1010,1011],{},[351,1012,1013],{},"QoraClient?",[851,1015,1016],{},[351,1017,924],{},[851,1019,1020,1021,1023],{},"Surcharge le client du ",[351,1022,103],{},". Utile pour les tests ou les scopes imbriqués.",[356,1025],{},[359,1027,1029],{"id":1028},"patterns","Patterns",[1031,1032,1034],"h3",{"id":1033},"traiter-les-quatre-états","Traiter les quatre états",[348,1036,1037,1038,1041,1042,1045],{},"Utiliser ",[351,1039,1040],{},".when()"," pour la correspondance exhaustive ou ",[351,1043,1044],{},".maybeWhen()"," quand seuls certains états sont pertinents :",[364,1047,1050],{"className":366,"code":1048,"filename":1049,"language":369,"meta":370,"style":370},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  builder: (context, state, fetchStatus) {\n    return state.when(\n      onInitial: () => const SizedBox.shrink(),\n      onLoading: (previousData) => previousData != null\n          ? UserCard(user: previousData, isRefreshing: true)\n          : const CircularProgressIndicator(),\n      onSuccess: (user, updatedAt) => UserCard(user: user),\n      onError: (error, stackTrace, previousData) => ErrorScreen(\n        message: error.toString(),\n        onRetry: () => context.qora.invalidate(['users', userId]),\n      ),\n    );\n  },\n)\n","user_screen.dart",[351,1051,1052,1063,1080,1102,1118,1132,1155,1173,1200,1212,1240,1265,1283,1319,1326,1333,1339],{"__ignoreMap":370},[374,1053,1054,1056,1058,1060],{"class":376,"line":377},[374,1055,108],{"class":380},[374,1057,384],{"class":383},[374,1059,392],{"class":380},[374,1061,1062],{"class":383},">(\n",[374,1064,1065,1067,1069,1071,1073,1075,1078],{"class":376,"line":398},[374,1066,401],{"class":383},[374,1068,405],{"class":404},[374,1070,408],{"class":383},[374,1072,412],{"class":411},[374,1074,461],{"class":404},[374,1076,1077],{"class":383}," userId]",[374,1079,418],{"class":404},[374,1081,1082,1084,1086,1088,1090,1092,1094,1097,1100],{"class":376,"line":421},[374,1083,424],{"class":383},[374,1085,405],{"class":404},[374,1087,429],{"class":383},[374,1089,432],{"class":404},[374,1091,435],{"class":383},[374,1093,438],{"class":404},[374,1095,1096],{"class":441},"getUser",[374,1098,1099],{"class":383},"(userId)",[374,1101,418],{"class":404},[374,1103,1104,1106,1108,1110,1112,1114,1116],{"class":376,"line":450},[374,1105,453],{"class":383},[374,1107,405],{"class":404},[374,1109,458],{"class":383},[374,1111,461],{"class":404},[374,1113,464],{"class":383},[374,1115,461],{"class":404},[374,1117,469],{"class":383},[374,1119,1120,1122,1124,1126,1129],{"class":376,"line":472},[374,1121,476],{"class":475},[374,1123,464],{"class":383},[374,1125,438],{"class":404},[374,1127,1128],{"class":475},"when",[374,1130,1131],{"class":383},"(\n",[374,1133,1134,1137,1139,1141,1143,1145,1147,1149,1151,1153],{"class":376,"line":485},[374,1135,1136],{"class":383},"      onInitial",[374,1138,405],{"class":404},[374,1140,429],{"class":383},[374,1142,432],{"class":404},[374,1144,497],{"class":496},[374,1146,500],{"class":380},[374,1148,438],{"class":404},[374,1150,505],{"class":441},[374,1152,445],{"class":383},[374,1154,418],{"class":404},[374,1156,1157,1160,1162,1165,1167,1169,1171],{"class":376,"line":512},[374,1158,1159],{"class":383},"      onLoading",[374,1161,405],{"class":404},[374,1163,1164],{"class":383}," (previousData) ",[374,1166,432],{"class":404},[374,1168,531],{"class":383},[374,1170,534],{"class":404},[374,1172,537],{"class":404},[374,1174,1175,1177,1180,1183,1185,1188,1190,1193,1195,1198],{"class":376,"line":540},[374,1176,543],{"class":404},[374,1178,1179],{"class":380}," UserCard",[374,1181,1182],{"class":383},"(user",[374,1184,405],{"class":404},[374,1186,1187],{"class":383}," previousData",[374,1189,461],{"class":404},[374,1191,1192],{"class":383}," isRefreshing",[374,1194,405],{"class":404},[374,1196,1197],{"class":404}," true",[374,1199,703],{"class":383},[374,1201,1202,1204,1206,1208,1210],{"class":376,"line":572},[374,1203,575],{"class":404},[374,1205,497],{"class":496},[374,1207,580],{"class":380},[374,1209,445],{"class":383},[374,1211,418],{"class":404},[374,1213,1214,1217,1219,1222,1224,1227,1229,1231,1233,1235,1238],{"class":376,"line":587},[374,1215,1216],{"class":383},"      onSuccess",[374,1218,405],{"class":404},[374,1220,1221],{"class":383}," (user",[374,1223,461],{"class":404},[374,1225,1226],{"class":383}," updatedAt) ",[374,1228,432],{"class":404},[374,1230,1179],{"class":380},[374,1232,1182],{"class":383},[374,1234,405],{"class":404},[374,1236,1237],{"class":383}," user)",[374,1239,418],{"class":404},[374,1241,1242,1245,1247,1250,1252,1255,1257,1259,1261,1263],{"class":376,"line":612},[374,1243,1244],{"class":383},"      onError",[374,1246,405],{"class":404},[374,1248,1249],{"class":383}," (error",[374,1251,461],{"class":404},[374,1253,1254],{"class":383}," stackTrace",[374,1256,461],{"class":404},[374,1258,526],{"class":383},[374,1260,432],{"class":404},[374,1262,675],{"class":380},[374,1264,1131],{"class":383},[374,1266,1267,1270,1272,1274,1276,1279,1281],{"class":376,"line":644},[374,1268,1269],{"class":383},"        message",[374,1271,405],{"class":404},[374,1273,624],{"class":383},[374,1275,438],{"class":404},[374,1277,1278],{"class":441},"toString",[374,1280,445],{"class":383},[374,1282,418],{"class":404},[374,1284,1285,1288,1290,1292,1294,1297,1299,1302,1304,1307,1310,1312,1314,1317],{"class":376,"line":670},[374,1286,1287],{"class":383},"        onRetry",[374,1289,405],{"class":404},[374,1291,429],{"class":383},[374,1293,432],{"class":404},[374,1295,1296],{"class":383}," context",[374,1298,438],{"class":404},[374,1300,1301],{"class":383},"qora",[374,1303,438],{"class":404},[374,1305,1306],{"class":441},"invalidate",[374,1308,1309],{"class":383},"([",[374,1311,412],{"class":411},[374,1313,461],{"class":404},[374,1315,1316],{"class":383}," userId])",[374,1318,418],{"class":404},[374,1320,1321,1324],{"class":376,"line":683},[374,1322,1323],{"class":383},"      )",[374,1325,418],{"class":404},[374,1327,1328,1331],{"class":376,"line":692},[374,1329,1330],{"class":383},"    )",[374,1332,689],{"class":404},[374,1334,1335,1337],{"class":376,"line":700},[374,1336,695],{"class":383},[374,1338,418],{"class":404},[374,1340,1342],{"class":376,"line":1341},17,[374,1343,703],{"class":383},[356,1345],{},[1031,1347,1349,1350],{"id":1348},"ui-adaptée-au-réseau-avec-fetchstatus","UI adaptée au réseau avec ",[351,1351,743],{},[348,1353,1354,1356,1357,1359],{},[351,1355,743],{}," est le second axe aux côtés de ",[351,1358,211],{},". L'utiliser pour afficher un indicateur de rafraîchissement en arrière-plan ou un message \"hors-ligne : en attente\" sans modifier la vue d'état principale :",[364,1361,1363],{"className":366,"code":1362,"filename":368,"language":369,"meta":370,"style":370},"QoraBuilder\u003CList\u003CUser>>(\n  queryKey: ['users'],\n  fetcher: api.getUsers,\n  builder: (context, state, fetchStatus) {\n    return switch (state) {\n      Initial() || Loading(previousData: null)\n          when fetchStatus == FetchStatus.paused =>\n          const Center(child: Text('Hors-ligne : connectez-vous pour charger')),\n      Initial() || Loading() =>\n          const CircularProgressIndicator(),\n      Success(:final data) => Column(\n          children: [\n            if (fetchStatus == FetchStatus.fetching)\n              const LinearProgressIndicator(),\n            if (fetchStatus == FetchStatus.paused)\n              const OfflineSyncChip(),\n            UserList(data),\n          ],\n        ),\n      Failure(:final error) => ErrorScreen(error),\n    };\n  },\n)\n",[351,1364,1365,1379,1393,1407,1423,1431,1453,1475,1501,1515,1525,1543,1553,1570,1581,1596,1607,1616,1624,1632,1654,1661,1668],{"__ignoreMap":370},[374,1366,1367,1369,1371,1373,1375,1377],{"class":376,"line":377},[374,1368,108],{"class":380},[374,1370,384],{"class":383},[374,1372,387],{"class":380},[374,1374,384],{"class":383},[374,1376,392],{"class":380},[374,1378,395],{"class":383},[374,1380,1381,1383,1385,1387,1389,1391],{"class":376,"line":398},[374,1382,401],{"class":383},[374,1384,405],{"class":404},[374,1386,408],{"class":383},[374,1388,412],{"class":411},[374,1390,415],{"class":383},[374,1392,418],{"class":404},[374,1394,1395,1397,1399,1401,1403,1405],{"class":376,"line":421},[374,1396,424],{"class":383},[374,1398,405],{"class":404},[374,1400,435],{"class":383},[374,1402,438],{"class":404},[374,1404,442],{"class":383},[374,1406,418],{"class":404},[374,1408,1409,1411,1413,1415,1417,1419,1421],{"class":376,"line":450},[374,1410,453],{"class":383},[374,1412,405],{"class":404},[374,1414,458],{"class":383},[374,1416,461],{"class":404},[374,1418,464],{"class":383},[374,1420,461],{"class":404},[374,1422,469],{"class":383},[374,1424,1425,1427,1429],{"class":376,"line":472},[374,1426,476],{"class":475},[374,1428,479],{"class":475},[374,1430,482],{"class":383},[374,1432,1433,1435,1437,1440,1443,1446,1448,1451],{"class":376,"line":485},[374,1434,488],{"class":380},[374,1436,491],{"class":383},[374,1438,1439],{"class":404},"||",[374,1441,1442],{"class":380}," Loading",[374,1444,1445],{"class":383},"(previousData",[374,1447,405],{"class":404},[374,1449,1450],{"class":404}," null",[374,1452,703],{"class":383},[374,1454,1455,1458,1461,1464,1467,1469,1472],{"class":376,"line":512},[374,1456,1457],{"class":475},"          when",[374,1459,1460],{"class":383}," fetchStatus ",[374,1462,1463],{"class":404},"==",[374,1465,1466],{"class":380}," FetchStatus",[374,1468,438],{"class":404},[374,1470,1471],{"class":383},"paused ",[374,1473,1474],{"class":404},"=>\n",[374,1476,1477,1480,1483,1486,1488,1491,1493,1496,1499],{"class":376,"line":540},[374,1478,1479],{"class":496},"          const",[374,1481,1482],{"class":380}," Center",[374,1484,1485],{"class":383},"(child",[374,1487,405],{"class":404},[374,1489,1490],{"class":380}," Text",[374,1492,518],{"class":383},[374,1494,1495],{"class":411},"'Hors-ligne : connectez-vous pour charger'",[374,1497,1498],{"class":383},"))",[374,1500,418],{"class":404},[374,1502,1503,1505,1507,1509,1511,1513],{"class":376,"line":572},[374,1504,488],{"class":380},[374,1506,491],{"class":383},[374,1508,1439],{"class":404},[374,1510,1442],{"class":380},[374,1512,491],{"class":383},[374,1514,1474],{"class":404},[374,1516,1517,1519,1521,1523],{"class":376,"line":587},[374,1518,1479],{"class":496},[374,1520,580],{"class":380},[374,1522,445],{"class":383},[374,1524,418],{"class":404},[374,1526,1527,1529,1531,1533,1535,1537,1539,1541],{"class":376,"line":612},[374,1528,590],{"class":380},[374,1530,518],{"class":383},[374,1532,405],{"class":404},[374,1534,523],{"class":496},[374,1536,599],{"class":383},[374,1538,432],{"class":404},[374,1540,649],{"class":380},[374,1542,1131],{"class":383},[374,1544,1545,1548,1550],{"class":376,"line":644},[374,1546,1547],{"class":383},"          children",[374,1549,405],{"class":404},[374,1551,1552],{"class":383}," [\n",[374,1554,1555,1558,1561,1563,1565,1567],{"class":376,"line":670},[374,1556,1557],{"class":475},"            if",[374,1559,1560],{"class":383}," (fetchStatus ",[374,1562,1463],{"class":404},[374,1564,1466],{"class":380},[374,1566,438],{"class":404},[374,1568,1569],{"class":383},"fetching)\n",[374,1571,1572,1575,1577,1579],{"class":376,"line":683},[374,1573,1574],{"class":496},"              const",[374,1576,566],{"class":380},[374,1578,445],{"class":383},[374,1580,418],{"class":404},[374,1582,1583,1585,1587,1589,1591,1593],{"class":376,"line":692},[374,1584,1557],{"class":475},[374,1586,1560],{"class":383},[374,1588,1463],{"class":404},[374,1590,1466],{"class":380},[374,1592,438],{"class":404},[374,1594,1595],{"class":383},"paused)\n",[374,1597,1598,1600,1603,1605],{"class":376,"line":700},[374,1599,1574],{"class":496},[374,1601,1602],{"class":380}," OfflineSyncChip",[374,1604,445],{"class":383},[374,1606,418],{"class":404},[374,1608,1609,1612,1614],{"class":376,"line":1341},[374,1610,1611],{"class":380},"            UserList",[374,1613,607],{"class":383},[374,1615,418],{"class":404},[374,1617,1619,1622],{"class":376,"line":1618},18,[374,1620,1621],{"class":383},"          ]",[374,1623,418],{"class":404},[374,1625,1627,1630],{"class":376,"line":1626},19,[374,1628,1629],{"class":383},"        )",[374,1631,418],{"class":404},[374,1633,1635,1637,1639,1641,1643,1646,1648,1650,1652],{"class":376,"line":1634},20,[374,1636,615],{"class":380},[374,1638,518],{"class":383},[374,1640,405],{"class":404},[374,1642,523],{"class":496},[374,1644,1645],{"class":383}," error) ",[374,1647,432],{"class":404},[374,1649,675],{"class":380},[374,1651,678],{"class":383},[374,1653,418],{"class":404},[374,1655,1657,1659],{"class":376,"line":1656},21,[374,1658,686],{"class":383},[374,1660,689],{"class":404},[374,1662,1664,1666],{"class":376,"line":1663},22,[374,1665,695],{"class":383},[374,1667,418],{"class":404},[374,1669,1671],{"class":376,"line":1670},23,[374,1672,703],{"class":383},[824,1674,1675,1687],{},[827,1676,1677],{},[830,1678,1679,1684],{},[833,1680,1681,1682],{},"Valeur ",[351,1683,743],{},[833,1685,1686],{},"Signification",[846,1688,1689,1699,1709],{},[830,1690,1691,1696],{},[851,1692,1693],{},[351,1694,1695],{},"FetchStatus.fetching",[851,1697,1698],{},"Une requête réseau est en cours.",[830,1700,1701,1706],{},[851,1702,1703],{},[351,1704,1705],{},"FetchStatus.paused",[851,1707,1708],{},"Hors-ligne : le fetch est en file et sera rejoué à la reconnexion.",[830,1710,1711,1716],{},[851,1712,1713],{},[351,1714,1715],{},"FetchStatus.idle",[851,1717,1718],{},"Aucun fetch actif (les données sont fraîches ou l'état est terminal).",[1720,1721,1722,1724,1725,790,1728,1731,1732,1735],"tip",{},[351,1723,1705],{}," n'apparaît que quand ",[351,1726,1727],{},"QoraOptions.networkMode",[351,1729,1730],{},"NetworkMode.online"," (le défaut) et que l'appareil n'a pas de connectivité. Avec ",[351,1733,1734],{},"NetworkMode.always",", les fetchs s'exécutent quelle que soit la connectivité et cet état n'est jamais émis.",[356,1737],{},[1031,1739,1741,1742,867],{"id":1740},"requêtes-conditionnelles-enabled","Requêtes conditionnelles (",[351,1743,789],{},[348,1745,1746],{},"Empêcher le fetch jusqu'à ce qu'une dépendance soit disponible :",[364,1748,1751],{"className":366,"code":1749,"filename":1750,"language":369,"meta":370,"style":370},"QoraBuilder\u003CProfile>(\n  queryKey: ['profiles', userId],\n  fetcher: () => api.getProfile(userId!),\n  enabled: userId != null,   // Pas de fetch tant que userId n'est pas résolu\n  builder: (context, state, fetchStatus) { ... },\n)\n","profile_screen.dart",[351,1752,1753,1764,1781,1808,1827,1852],{"__ignoreMap":370},[374,1754,1755,1757,1759,1762],{"class":376,"line":377},[374,1756,108],{"class":380},[374,1758,384],{"class":383},[374,1760,1761],{"class":380},"Profile",[374,1763,1062],{"class":383},[374,1765,1766,1768,1770,1772,1775,1777,1779],{"class":376,"line":398},[374,1767,401],{"class":383},[374,1769,405],{"class":404},[374,1771,408],{"class":383},[374,1773,1774],{"class":411},"'profiles'",[374,1776,461],{"class":404},[374,1778,1077],{"class":383},[374,1780,418],{"class":404},[374,1782,1783,1785,1787,1789,1791,1793,1795,1798,1801,1804,1806],{"class":376,"line":421},[374,1784,424],{"class":383},[374,1786,405],{"class":404},[374,1788,429],{"class":383},[374,1790,432],{"class":404},[374,1792,435],{"class":383},[374,1794,438],{"class":404},[374,1796,1797],{"class":441},"getProfile",[374,1799,1800],{"class":383},"(userId",[374,1802,1803],{"class":404},"!",[374,1805,867],{"class":383},[374,1807,418],{"class":404},[374,1809,1810,1813,1815,1818,1820,1823],{"class":376,"line":450},[374,1811,1812],{"class":383},"  enabled",[374,1814,405],{"class":404},[374,1816,1817],{"class":383}," userId ",[374,1819,534],{"class":404},[374,1821,1822],{"class":404}," null,",[374,1824,1826],{"class":1825},"sHwdD","   // Pas de fetch tant que userId n'est pas résolu\n",[374,1828,1829,1831,1833,1835,1837,1839,1841,1844,1847,1850],{"class":376,"line":472},[374,1830,453],{"class":383},[374,1832,405],{"class":404},[374,1834,458],{"class":383},[374,1836,461],{"class":404},[374,1838,464],{"class":383},[374,1840,461],{"class":404},[374,1842,1843],{"class":383}," fetchStatus) { ",[374,1845,1846],{"class":404},"...",[374,1848,1849],{"class":383}," }",[374,1851,418],{"class":404},[374,1853,1854],{"class":376,"line":485},[374,1855,703],{"class":383},[348,1857,948,1858,1860,1861,772,1863,801,1865,1868],{},[351,1859,789],{}," passe de ",[351,1862,951],{},[351,1864,793],{},[351,1866,1867],{},"setState","), un fetch est déclenché automatiquement.",[356,1870],{},[1031,1872,1874,1875],{"id":1873},"performance-abonnements-dérivés-avec-select","Performance: abonnements dérivés avec ",[351,1876,989],{},[348,1878,1879,1881,1882,1884],{},[351,1880,989],{}," permet de dériver une valeur calculée des données. Le widget ne se reconstruit que quand la valeur sélectionnée change (comparaison ",[351,1883,1463],{},"). Utilisez-le pour éviter les reconstructions inutiles:",[364,1886,1888],{"className":366,"code":1887,"filename":368,"language":369,"meta":370,"style":370},"// Reconstruire seulement quand le nombre d'utilisateurs change.\nQoraBuilder\u003CList\u003CUser>>(\n  queryKey: ['users'],\n  fetcher: () => api.getUsers(),\n  select: (users) => users.length,\n  builder: (context, state, fetchStatus) => Text('${state.dataOrNull} utilisateurs'),\n)\n",[351,1889,1890,1895,1909,1923,1943,1965,2012],{"__ignoreMap":370},[374,1891,1892],{"class":376,"line":377},[374,1893,1894],{"class":1825},"// Reconstruire seulement quand le nombre d'utilisateurs change.\n",[374,1896,1897,1899,1901,1903,1905,1907],{"class":376,"line":398},[374,1898,108],{"class":380},[374,1900,384],{"class":383},[374,1902,387],{"class":380},[374,1904,384],{"class":383},[374,1906,392],{"class":380},[374,1908,395],{"class":383},[374,1910,1911,1913,1915,1917,1919,1921],{"class":376,"line":421},[374,1912,401],{"class":383},[374,1914,405],{"class":404},[374,1916,408],{"class":383},[374,1918,412],{"class":411},[374,1920,415],{"class":383},[374,1922,418],{"class":404},[374,1924,1925,1927,1929,1931,1933,1935,1937,1939,1941],{"class":376,"line":450},[374,1926,424],{"class":383},[374,1928,405],{"class":404},[374,1930,429],{"class":383},[374,1932,432],{"class":404},[374,1934,435],{"class":383},[374,1936,438],{"class":404},[374,1938,442],{"class":441},[374,1940,445],{"class":383},[374,1942,418],{"class":404},[374,1944,1945,1948,1950,1953,1955,1958,1960,1963],{"class":376,"line":472},[374,1946,1947],{"class":383},"  select",[374,1949,405],{"class":404},[374,1951,1952],{"class":383}," (users) ",[374,1954,432],{"class":404},[374,1956,1957],{"class":383}," users",[374,1959,438],{"class":404},[374,1961,1962],{"class":383},"length",[374,1964,418],{"class":404},[374,1966,1967,1969,1971,1973,1975,1977,1979,1982,1984,1986,1988,1991,1994,1997,1999,2002,2005,2008,2010],{"class":376,"line":485},[374,1968,453],{"class":383},[374,1970,405],{"class":404},[374,1972,458],{"class":383},[374,1974,461],{"class":404},[374,1976,464],{"class":383},[374,1978,461],{"class":404},[374,1980,1981],{"class":383}," fetchStatus) ",[374,1983,432],{"class":404},[374,1985,1490],{"class":380},[374,1987,518],{"class":383},[374,1989,1990],{"class":411},"'",[374,1992,1993],{"class":383},"${",[374,1995,729],{"class":1996},"sHdIc",[374,1998,438],{"class":383},[374,2000,2001],{"class":1996},"dataOrNull",[374,2003,2004],{"class":383},"}",[374,2006,2007],{"class":411}," utilisateurs'",[374,2009,867],{"class":383},[374,2011,418],{"class":404},[374,2013,2014],{"class":376,"line":512},[374,2015,703],{"class":383},[348,2017,2018,2019,2021,2022,2024,2025,2029,2030,2033,2034,2036,2037,2036,2039,2041,2042,2044,2045,2047],{},"Le builder reçoit toujours le ",[351,2020,732],{}," complet et à jour : ",[351,2023,989],{}," décide ",[2026,2027,2028],"em",{},"quand"," reconstruire, pas ",[2026,2031,2032],{},"ce qui"," est passé. Un changement de type d'état (",[351,2035,973],{},", ",[351,2038,981],{},[351,2040,977],{},") ou de ",[351,2043,743],{}," reconstruit toujours, donc les erreurs et les spinners ne sont jamais masqués. Sans ",[351,2046,989],{},", le widget se reconstruit à chaque changement d'état.",[356,2049],{},[1031,2051,2053,2054,867],{"id":2052},"pagination-sans-scintillement-keeppreviousdata","Pagination sans scintillement (",[351,2055,959],{},[348,2057,2058,2059,2062,2063,2065],{},"Quand la clé de requête change (ex. numéro de page incrémenté), la nouvelle clé démarre à l'état ",[351,2060,2061],{},"Initial",", provoquant un spinner plein écran perturbant. ",[351,2064,959],{}," évite cela en portant les dernières données réussies dans la phase de chargement de la nouvelle clé :",[364,2067,2070],{"className":366,"code":2068,"filename":2069,"language":369,"meta":370,"style":370},"QoraBuilder\u003CList\u003CPost>>(\n  queryKey: ['posts', currentPage],\n  fetcher: () => api.getPosts(page: currentPage),\n  keepPreviousData: true,\n  builder: (context, state, fetchStatus) {\n    // dataOrNull retourne les données de Success, Loading.previousData, ou Failure.previousData\n    final posts = state.dataOrNull ?? [];\n    return Stack(\n      children: [\n        PostList(posts: posts),\n        if (state.isLoading) const LinearProgressIndicator(),\n      ],\n    );\n  },\n)\n","paginated_posts_screen.dart",[351,2071,2072,2087,2105,2132,2142,2158,2163,2189,2197,2206,2221,2243,2250,2256,2262],{"__ignoreMap":370},[374,2073,2074,2076,2078,2080,2082,2085],{"class":376,"line":377},[374,2075,108],{"class":380},[374,2077,384],{"class":383},[374,2079,387],{"class":380},[374,2081,384],{"class":383},[374,2083,2084],{"class":380},"Post",[374,2086,395],{"class":383},[374,2088,2089,2091,2093,2095,2098,2100,2103],{"class":376,"line":398},[374,2090,401],{"class":383},[374,2092,405],{"class":404},[374,2094,408],{"class":383},[374,2096,2097],{"class":411},"'posts'",[374,2099,461],{"class":404},[374,2101,2102],{"class":383}," currentPage]",[374,2104,418],{"class":404},[374,2106,2107,2109,2111,2113,2115,2117,2119,2122,2125,2127,2130],{"class":376,"line":421},[374,2108,424],{"class":383},[374,2110,405],{"class":404},[374,2112,429],{"class":383},[374,2114,432],{"class":404},[374,2116,435],{"class":383},[374,2118,438],{"class":404},[374,2120,2121],{"class":441},"getPosts",[374,2123,2124],{"class":383},"(page",[374,2126,405],{"class":404},[374,2128,2129],{"class":383}," currentPage)",[374,2131,418],{"class":404},[374,2133,2134,2137,2139],{"class":376,"line":450},[374,2135,2136],{"class":383},"  keepPreviousData",[374,2138,405],{"class":404},[374,2140,2141],{"class":404}," true,\n",[374,2143,2144,2146,2148,2150,2152,2154,2156],{"class":376,"line":472},[374,2145,453],{"class":383},[374,2147,405],{"class":404},[374,2149,458],{"class":383},[374,2151,461],{"class":404},[374,2153,464],{"class":383},[374,2155,461],{"class":404},[374,2157,469],{"class":383},[374,2159,2160],{"class":376,"line":485},[374,2161,2162],{"class":1825},"    // dataOrNull retourne les données de Success, Loading.previousData, ou Failure.previousData\n",[374,2164,2165,2168,2171,2174,2176,2178,2181,2184,2187],{"class":376,"line":512},[374,2166,2167],{"class":496},"    final",[374,2169,2170],{"class":383}," posts ",[374,2172,2173],{"class":404},"=",[374,2175,464],{"class":383},[374,2177,438],{"class":404},[374,2179,2180],{"class":383},"dataOrNull ",[374,2182,2183],{"class":404},"??",[374,2185,2186],{"class":383}," []",[374,2188,689],{"class":404},[374,2190,2191,2193,2195],{"class":376,"line":540},[374,2192,476],{"class":475},[374,2194,546],{"class":380},[374,2196,1131],{"class":383},[374,2198,2199,2202,2204],{"class":376,"line":572},[374,2200,2201],{"class":383},"      children",[374,2203,405],{"class":404},[374,2205,1552],{"class":383},[374,2207,2208,2211,2214,2216,2219],{"class":376,"line":587},[374,2209,2210],{"class":380},"        PostList",[374,2212,2213],{"class":383},"(posts",[374,2215,405],{"class":404},[374,2217,2218],{"class":383}," posts)",[374,2220,418],{"class":404},[374,2222,2223,2226,2229,2231,2234,2237,2239,2241],{"class":376,"line":612},[374,2224,2225],{"class":475},"        if",[374,2227,2228],{"class":383}," (state",[374,2230,438],{"class":404},[374,2232,2233],{"class":383},"isLoading) ",[374,2235,2236],{"class":496},"const",[374,2238,566],{"class":380},[374,2240,445],{"class":383},[374,2242,418],{"class":404},[374,2244,2245,2248],{"class":376,"line":644},[374,2246,2247],{"class":383},"      ]",[374,2249,418],{"class":404},[374,2251,2252,2254],{"class":376,"line":670},[374,2253,1330],{"class":383},[374,2255,689],{"class":404},[374,2257,2258,2260],{"class":376,"line":683},[374,2259,695],{"class":383},[374,2261,418],{"class":404},[374,2263,2264],{"class":376,"line":692},[374,2265,703],{"class":383},[1720,2267,2268,2270,2271,2274],{},[351,2269,959],{}," comble uniquement l'écart : si le client fournit déjà ",[351,2272,2273],{},"previousData"," dans l'état, cette valeur est prioritaire. Le cache local du widget est purement un fallback.",[356,2276],{},[1031,2278,2280],{"id":2279},"afficher-un-horodatage-de-fraîcheur","Afficher un horodatage de fraîcheur",[348,2282,2283,2285,2286,2289],{},[351,2284,981],{}," porte ",[351,2287,2288],{},"updatedAt"," : le moment où les données ont été récupérées pour la dernière fois :",[364,2291,2293],{"className":366,"code":2292,"filename":1049,"language":369,"meta":370,"style":370},"onSuccess: (user, updatedAt) => Column(\n  children: [\n    UserCard(user: user),\n    Text(\n      'Mis à jour ${_timeAgo(updatedAt)}',\n      style: Theme.of(context).textTheme.labelSmall,\n    ),\n  ],\n),\n",[351,2294,2295,2314,2323,2336,2343,2364,2394,2400,2407],{"__ignoreMap":370},[374,2296,2297,2300,2302,2304,2306,2308,2310,2312],{"class":376,"line":377},[374,2298,2299],{"class":383},"onSuccess",[374,2301,405],{"class":404},[374,2303,1221],{"class":383},[374,2305,461],{"class":404},[374,2307,1226],{"class":383},[374,2309,432],{"class":404},[374,2311,649],{"class":380},[374,2313,1131],{"class":383},[374,2315,2316,2319,2321],{"class":376,"line":398},[374,2317,2318],{"class":383},"  children",[374,2320,405],{"class":404},[374,2322,1552],{"class":383},[374,2324,2325,2328,2330,2332,2334],{"class":376,"line":421},[374,2326,2327],{"class":380},"    UserCard",[374,2329,1182],{"class":383},[374,2331,405],{"class":404},[374,2333,1237],{"class":383},[374,2335,418],{"class":404},[374,2337,2338,2341],{"class":376,"line":450},[374,2339,2340],{"class":380},"    Text",[374,2342,1131],{"class":383},[374,2344,2345,2348,2350,2353,2355,2357,2360,2362],{"class":376,"line":472},[374,2346,2347],{"class":411},"      'Mis à jour ",[374,2349,1993],{"class":383},[374,2351,2352],{"class":441},"_timeAgo",[374,2354,518],{"class":383},[374,2356,2288],{"class":1996},[374,2358,2359],{"class":383},")}",[374,2361,1990],{"class":411},[374,2363,418],{"class":404},[374,2365,2366,2369,2371,2374,2376,2379,2382,2384,2387,2389,2392],{"class":376,"line":485},[374,2367,2368],{"class":383},"      style",[374,2370,405],{"class":404},[374,2372,2373],{"class":380}," Theme",[374,2375,438],{"class":404},[374,2377,2378],{"class":441},"of",[374,2380,2381],{"class":383},"(context)",[374,2383,438],{"class":404},[374,2385,2386],{"class":383},"textTheme",[374,2388,438],{"class":404},[374,2390,2391],{"class":383},"labelSmall",[374,2393,418],{"class":404},[374,2395,2396,2398],{"class":376,"line":512},[374,2397,1330],{"class":383},[374,2399,418],{"class":404},[374,2401,2402,2405],{"class":376,"line":540},[374,2403,2404],{"class":383},"  ]",[374,2406,418],{"class":404},[374,2408,2409,2411],{"class":376,"line":572},[374,2410,867],{"class":383},[374,2412,418],{"class":404},[356,2414],{},[1031,2416,2418],{"id":2417},"polling","Polling",[348,2420,2421,2422,782,2425,2427],{},"Passer ",[351,2423,2424],{},"refetchInterval",[351,2426,914],{}," pour effectuer un polling à intervalle fixe :",[364,2429,2432],{"className":366,"code":2430,"filename":2431,"language":369,"meta":370,"style":370},"QoraBuilder\u003CList\u003CNotification>>(\n  queryKey: ['notifications'],\n  fetcher: api.getNotifications,\n  options: const QoraOptions(refetchInterval: Duration(seconds: 30)),\n  builder: (context, state, fetchStatus) { ... },\n)\n","notifications_screen.dart",[351,2433,2434,2449,2464,2479,2512,2534],{"__ignoreMap":370},[374,2435,2436,2438,2440,2442,2444,2447],{"class":376,"line":377},[374,2437,108],{"class":380},[374,2439,384],{"class":383},[374,2441,387],{"class":380},[374,2443,384],{"class":383},[374,2445,2446],{"class":380},"Notification",[374,2448,395],{"class":383},[374,2450,2451,2453,2455,2457,2460,2462],{"class":376,"line":398},[374,2452,401],{"class":383},[374,2454,405],{"class":404},[374,2456,408],{"class":383},[374,2458,2459],{"class":411},"'notifications'",[374,2461,415],{"class":383},[374,2463,418],{"class":404},[374,2465,2466,2468,2470,2472,2474,2477],{"class":376,"line":421},[374,2467,424],{"class":383},[374,2469,405],{"class":404},[374,2471,435],{"class":383},[374,2473,438],{"class":404},[374,2475,2476],{"class":383},"getNotifications",[374,2478,418],{"class":404},[374,2480,2481,2484,2486,2488,2491,2494,2496,2499,2502,2504,2508,2510],{"class":376,"line":450},[374,2482,2483],{"class":383},"  options",[374,2485,405],{"class":404},[374,2487,497],{"class":496},[374,2489,2490],{"class":380}," QoraOptions",[374,2492,2493],{"class":383},"(refetchInterval",[374,2495,405],{"class":404},[374,2497,2498],{"class":380}," Duration",[374,2500,2501],{"class":383},"(seconds",[374,2503,405],{"class":404},[374,2505,2507],{"class":2506},"sbssI"," 30",[374,2509,1498],{"class":383},[374,2511,418],{"class":404},[374,2513,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532],{"class":376,"line":472},[374,2515,453],{"class":383},[374,2517,405],{"class":404},[374,2519,458],{"class":383},[374,2521,461],{"class":404},[374,2523,464],{"class":383},[374,2525,461],{"class":404},[374,2527,1843],{"class":383},[374,2529,1846],{"class":404},[374,2531,1849],{"class":383},[374,2533,418],{"class":404},[374,2535,2536],{"class":376,"line":485},[374,2537,703],{"class":383},[348,2539,2540,2541,2543],{},"Le polling est actif uniquement pendant que ",[351,2542,108],{}," est dans l'arbre de widgets. Il s'arrête automatiquement au dispose.",[356,2545],{},[1031,2547,2549,2550,867],{"id":2548},"amorcer-les-données-initiales-initialdata","Amorcer les données initiales (",[351,2551,2552],{},"initialData",[348,2554,2555,2558],{},[351,2556,2557],{},"QoraOptions.initialData"," amorce le cache avec des données placeholder avant qu'aucun fetch ne soit terminé. Utiliser pour l'hydratation SSR, le rendu instantané depuis SharedPreferences ou une session précédente :",[364,2560,2562],{"className":366,"code":2561,"filename":1049,"language":369,"meta":370,"style":370},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: QoraOptions(\n    initialData: cachedUser,                          // amorcer le cache\n    initialDataUpdatedAt: DateTime.now(),             // marquer comme frais\n    staleTime: const Duration(minutes: 5),            // ignorer réseau si frais\n  ),\n  builder: (context, state, fetchStatus) { ... },\n)\n",[351,2563,2564,2574,2590,2610,2620,2635,2657,2683,2690,2712],{"__ignoreMap":370},[374,2565,2566,2568,2570,2572],{"class":376,"line":377},[374,2567,108],{"class":380},[374,2569,384],{"class":383},[374,2571,392],{"class":380},[374,2573,1062],{"class":383},[374,2575,2576,2578,2580,2582,2584,2586,2588],{"class":376,"line":398},[374,2577,401],{"class":383},[374,2579,405],{"class":404},[374,2581,408],{"class":383},[374,2583,412],{"class":411},[374,2585,461],{"class":404},[374,2587,1077],{"class":383},[374,2589,418],{"class":404},[374,2591,2592,2594,2596,2598,2600,2602,2604,2606,2608],{"class":376,"line":421},[374,2593,424],{"class":383},[374,2595,405],{"class":404},[374,2597,429],{"class":383},[374,2599,432],{"class":404},[374,2601,435],{"class":383},[374,2603,438],{"class":404},[374,2605,1096],{"class":441},[374,2607,1099],{"class":383},[374,2609,418],{"class":404},[374,2611,2612,2614,2616,2618],{"class":376,"line":450},[374,2613,2483],{"class":383},[374,2615,405],{"class":404},[374,2617,2490],{"class":380},[374,2619,1131],{"class":383},[374,2621,2622,2625,2627,2630,2632],{"class":376,"line":472},[374,2623,2624],{"class":383},"    initialData",[374,2626,405],{"class":404},[374,2628,2629],{"class":383}," cachedUser",[374,2631,461],{"class":404},[374,2633,2634],{"class":1825},"                          // amorcer le cache\n",[374,2636,2637,2640,2642,2645,2647,2650,2652,2654],{"class":376,"line":485},[374,2638,2639],{"class":383},"    initialDataUpdatedAt",[374,2641,405],{"class":404},[374,2643,2644],{"class":380}," DateTime",[374,2646,438],{"class":404},[374,2648,2649],{"class":441},"now",[374,2651,445],{"class":383},[374,2653,461],{"class":404},[374,2655,2656],{"class":1825},"             // marquer comme frais\n",[374,2658,2659,2662,2664,2666,2668,2671,2673,2676,2678,2680],{"class":376,"line":512},[374,2660,2661],{"class":383},"    staleTime",[374,2663,405],{"class":404},[374,2665,497],{"class":496},[374,2667,2498],{"class":380},[374,2669,2670],{"class":383},"(minutes",[374,2672,405],{"class":404},[374,2674,2675],{"class":2506}," 5",[374,2677,867],{"class":383},[374,2679,461],{"class":404},[374,2681,2682],{"class":1825},"            // ignorer réseau si frais\n",[374,2684,2685,2688],{"class":376,"line":540},[374,2686,2687],{"class":383},"  )",[374,2689,418],{"class":404},[374,2691,2692,2694,2696,2698,2700,2702,2704,2706,2708,2710],{"class":376,"line":572},[374,2693,453],{"class":383},[374,2695,405],{"class":404},[374,2697,458],{"class":383},[374,2699,461],{"class":404},[374,2701,464],{"class":383},[374,2703,461],{"class":404},[374,2705,1843],{"class":383},[374,2707,1846],{"class":404},[374,2709,1849],{"class":383},[374,2711,418],{"class":404},[374,2713,2714],{"class":376,"line":587},[374,2715,703],{"class":383},[824,2717,2718,2729],{},[827,2719,2720],{},[830,2721,2722,2725,2727],{},[833,2723,2724],{},"Paramètre",[833,2726,841],{},[833,2728,844],{},[846,2730,2731,2748,2765],{},[830,2732,2733,2737,2741],{},[851,2734,2735],{},[351,2736,2552],{},[851,2738,2739],{},[351,2740,924],{},[851,2742,2743,2744,2747],{},"Données placeholder de type ",[351,2745,2746],{},"T"," pour pré-remplir le cache.",[830,2749,2750,2755,2758],{},[851,2751,2752],{},[351,2753,2754],{},"initialDataUpdatedAt",[851,2756,2757],{},"epoch",[851,2759,2760,2761,2764],{},"Horodatage pour le calcul de péremption. ",[351,2762,2763],{},"DateTime.now()"," pour ignorer le réseau.",[830,2766,2767,2772,2776],{},[851,2768,2769],{},[351,2770,2771],{},"placeholderData",[851,2773,2774],{},[351,2775,924],{},[851,2777,2778],{},"Fonction paresseuse qui dérive les données initiales d'une autre entrée du cache.",[348,2780,948,2781,2783],{},[351,2782,2552],{}," est fourni :",[2785,2786,2787,2803],"ul",{},[711,2788,2789,2790,861,2793,2795,2796,2799,2800,438],{},"Si ",[714,2791,2792],{},"frais",[351,2794,2288],{}," dans ",[351,2797,2798],{},"staleTime",") : le widget s'affiche immédiatement avec le placeholder et ",[714,2801,2802],{},"ignore le réseau",[711,2804,2789,2805,2808,2809,438],{},[714,2806,2807],{},"périmé"," (epoch par défaut) : le widget s'affiche avec le placeholder et déclenche un SWR en arrière-plan. Le placeholder est transporté via ",[351,2810,2811],{},"Loading.previousData",[2813,2814,2815,2817,2818,2820,2821,2823],"note",{},[351,2816,2552],{}," a priorité sur ",[351,2819,2771],{},". Une incompatibilité de type à l'exécution est silencieusement ignorée (le cache reste ",[351,2822,2061],{}," et fetch normalement).",[356,2825],{},[359,2827,2829],{"id":2828},"comportement-lors-du-changement-de-clé","Comportement lors du changement de clé",[348,2831,948,2832,2834,2835,2838,2839,629],{},[351,2833,855],{}," change (",[351,2836,2837],{},"didUpdateWidget","), ",[351,2840,108],{},[708,2842,2843,2846,2854],{},[711,2844,2845],{},"Annule l'abonnement au stream précédent.",[711,2847,2848,2849,2036,2851,2853],{},"S'abonne au stream de la nouvelle clé (en partant de son état courant en cache : peut être ",[351,2850,2061],{},[351,2852,981],{},", etc.).",[711,2855,2856,2857,2859,2860,2862],{},"Déclenche un ",[351,2858,815],{}," frais pour la nouvelle clé (si ",[351,2861,789],{},").",[348,2864,2865],{},"C'est ainsi que la pagination, le changement d'onglet et les changements de filtre sont gérés automatiquement sans gestion d'état supplémentaire.",[356,2867],{},[359,2869,2871,2874],{"id":2870},"qorastatebuilder-observer-sans-fetcher",[351,2872,2873],{},"QoraStateBuilder"," : observer sans fetcher",[348,2876,2877,2880],{},[351,2878,2879],{},"QoraStateBuilder\u003CT>"," s'abonne à l'état d'une requête sans déclencher de fetch. L'utiliser quand un autre widget ou service possède le cycle de vie du fetch et que seul l'état courant doit être affiché.",[364,2882,2885],{"className":366,"code":2883,"filename":2884,"language":369,"meta":370,"style":370},"// NotificationsScreen (un QoraBuilder) possède le fetch.\n// Ce badge reflète simplement l'état en cache de la même clé.\nQoraStateBuilder\u003CList\u003CNotification>>(\n  queryKey: ['notifications'],\n  builder: (context, state) {\n    final count = state.dataOrNull?.length ?? 0;\n    return Badge(\n      label: Text('$count'),\n      isLabelVisible: count > 0,\n      child: const Icon(Icons.notifications),\n    );\n  },\n)\n","notification_badge.dart",[351,2886,2887,2892,2897,2911,2925,2938,2966,2975,3000,3016,3040,3046,3052],{"__ignoreMap":370},[374,2888,2889],{"class":376,"line":377},[374,2890,2891],{"class":1825},"// NotificationsScreen (un QoraBuilder) possède le fetch.\n",[374,2893,2894],{"class":376,"line":398},[374,2895,2896],{"class":1825},"// Ce badge reflète simplement l'état en cache de la même clé.\n",[374,2898,2899,2901,2903,2905,2907,2909],{"class":376,"line":421},[374,2900,2873],{"class":380},[374,2902,384],{"class":383},[374,2904,387],{"class":380},[374,2906,384],{"class":383},[374,2908,2446],{"class":380},[374,2910,395],{"class":383},[374,2912,2913,2915,2917,2919,2921,2923],{"class":376,"line":450},[374,2914,401],{"class":383},[374,2916,405],{"class":404},[374,2918,408],{"class":383},[374,2920,2459],{"class":411},[374,2922,415],{"class":383},[374,2924,418],{"class":404},[374,2926,2927,2929,2931,2933,2935],{"class":376,"line":472},[374,2928,453],{"class":383},[374,2930,405],{"class":404},[374,2932,458],{"class":383},[374,2934,461],{"class":404},[374,2936,2937],{"class":383}," state) {\n",[374,2939,2940,2942,2945,2947,2949,2951,2953,2956,2959,2961,2964],{"class":376,"line":485},[374,2941,2167],{"class":496},[374,2943,2944],{"class":383}," count ",[374,2946,2173],{"class":404},[374,2948,464],{"class":383},[374,2950,438],{"class":404},[374,2952,2001],{"class":383},[374,2954,2955],{"class":404},"?.",[374,2957,2958],{"class":383},"length ",[374,2960,2183],{"class":404},[374,2962,2963],{"class":2506}," 0",[374,2965,689],{"class":404},[374,2967,2968,2970,2973],{"class":376,"line":512},[374,2969,476],{"class":475},[374,2971,2972],{"class":380}," Badge",[374,2974,1131],{"class":383},[374,2976,2977,2980,2982,2984,2986,2988,2991,2994,2996,2998],{"class":376,"line":540},[374,2978,2979],{"class":383},"      label",[374,2981,405],{"class":404},[374,2983,1490],{"class":380},[374,2985,518],{"class":383},[374,2987,1990],{"class":411},[374,2989,2990],{"class":383},"$",[374,2992,2993],{"class":1996},"count",[374,2995,1990],{"class":411},[374,2997,867],{"class":383},[374,2999,418],{"class":404},[374,3001,3002,3005,3007,3009,3012,3014],{"class":376,"line":572},[374,3003,3004],{"class":383},"      isLabelVisible",[374,3006,405],{"class":404},[374,3008,2944],{"class":383},[374,3010,3011],{"class":404},">",[374,3013,2963],{"class":2506},[374,3015,418],{"class":404},[374,3017,3018,3021,3023,3025,3028,3030,3033,3035,3038],{"class":376,"line":587},[374,3019,3020],{"class":383},"      child",[374,3022,405],{"class":404},[374,3024,497],{"class":496},[374,3026,3027],{"class":380}," Icon",[374,3029,518],{"class":383},[374,3031,3032],{"class":380},"Icons",[374,3034,438],{"class":404},[374,3036,3037],{"class":383},"notifications)",[374,3039,418],{"class":404},[374,3041,3042,3044],{"class":376,"line":612},[374,3043,1330],{"class":383},[374,3045,689],{"class":404},[374,3047,3048,3050],{"class":376,"line":644},[374,3049,695],{"class":383},[374,3051,418],{"class":404},[374,3053,3054],{"class":376,"line":670},[374,3055,703],{"class":383},[1031,3057,3059,3060],{"id":3058},"props-de-qorastatebuilder","Props de ",[351,3061,2873],{},[824,3063,3064,3074],{},[827,3065,3066],{},[830,3067,3068,3070,3072],{},[833,3069,835],{},[833,3071,838],{},[833,3073,844],{},[846,3075,3076,3093,3107],{},[830,3077,3078,3082,3090],{},[851,3079,3080],{},[351,3081,855],{},[851,3083,3084,861,3086,864,3088,867],{},[351,3085,860],{},[351,3087,387],{},[351,3089,207],{},[851,3091,3092],{},"Clé à observer.",[830,3094,3095,3099,3104],{},[851,3096,3097],{},[351,3098,897],{},[851,3100,3101],{},[351,3102,3103],{},"Widget Function(BuildContext, QoraState\u003CT>)",[851,3105,3106],{},"Construit l'arbre de widgets depuis l'état courant.",[830,3108,3109,3113,3117],{},[851,3110,3111],{},[351,3112,1008],{},[851,3114,3115],{},[351,3116,1013],{},[851,3118,1020,3119,438],{},[351,3120,103],{},[1720,3122,3123,3125],{},[351,3124,2873],{}," est adapté aux badges, compteurs ou affichages secondaires qui dérivent leurs données d'une requête chargée ailleurs : par exemple, un compteur d'articles dans le panier ou un badge de messages non lus dans une barre d'application.",[356,3127],{},[359,3129,3131],{"id":3130},"étapes-suivantes","Étapes suivantes",[2785,3133,3134,3145,3159,3165,3174],{},[711,3135,3136,3141,3142,3144],{},[3137,3138,3140],"a",{"href":3139},"../recipes/network-aware","Guide réseau adaptatif"," : Configuration hors-ligne complète avec ",[351,3143,743],{}," et file de mutations",[711,3146,3147,3151,3152,3155,3156],{},[3137,3148,3150],{"href":3149},"./network-status","Statut réseau"," : Widgets ",[351,3153,3154],{},"NetworkStatusBuilder"," et ",[351,3157,3158],{},"NetworkStatusIndicator",[711,3160,3161,3164],{},[3137,3162,62],{"href":3163},"../core-concepts/query-states"," : Référence complète de la machine d'état",[711,3166,3167,3170,3171],{},[3137,3168,215],{"href":3169},"../api-reference/qora-options"," : Configuration de stale time, retry, polling et ",[351,3172,3173],{},"networkMode",[711,3175,3176,3179],{},[3137,3177,148],{"href":3178},"../recipes/optimistic-updates"," : UI instantanée avec rollback sécurisé",[3181,3182,3183],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":370,"searchDepth":398,"depth":398,"links":3185},[3186,3187,3188,3189,3204,3205,3210],{"id":361,"depth":398,"text":362},{"id":758,"depth":398,"text":759},{"id":821,"depth":398,"text":822},{"id":1028,"depth":398,"text":1029,"children":3190},[3191,3192,3194,3196,3198,3200,3201,3202],{"id":1033,"depth":421,"text":1034},{"id":1348,"depth":421,"text":3193},"UI adaptée au réseau avec FetchStatus",{"id":1740,"depth":421,"text":3195},"Requêtes conditionnelles (enabled)",{"id":1873,"depth":421,"text":3197},"Performance: abonnements dérivés avec select",{"id":2052,"depth":421,"text":3199},"Pagination sans scintillement (keepPreviousData)",{"id":2279,"depth":421,"text":2280},{"id":2417,"depth":421,"text":2418},{"id":2548,"depth":421,"text":3203},"Amorcer les données initiales (initialData)",{"id":2828,"depth":398,"text":2829},{"id":2870,"depth":398,"text":3206,"children":3207},"QoraStateBuilder : observer sans fetcher",[3208],{"id":3058,"depth":421,"text":3209},"Props de QoraStateBuilder",{"id":3130,"depth":398,"text":3131},"Le widget qui récupère les données, s'abonne aux changements d'état et reconstruit l'UI à chaque transition d'état.","md",null,{},{"icon":111},{"title":108,"description":3211},"2KpwFhGeKA881cDMA2e5W5Hz031wR0R8CdCxn5CM0_4",[3219,3221],{"title":103,"path":104,"stem":105,"description":3220,"icon":106,"children":-1},"Le StatefulWidget qui fournit un QoraClient à l'arbre de widgets et gère le cycle de vie des gestionnaires de plateforme optionnels.",{"title":113,"path":114,"stem":115,"description":3222,"icon":116,"children":-1},"Le widget qui gère le cycle de vie d'un MutationController et reconstruit l'UI à chaque transition d'état de mutation.",1794040407204]