[{"data":1,"prerenderedAt":1797},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-flutter-integration-qora-scope":342,"-fr-flutter-integration-qora-scope-surround":1792},[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":103,"body":344,"description":1785,"extension":1786,"links":1787,"meta":1788,"navigation":1789,"path":104,"seo":1790,"stem":105,"__hash__":1791},"docs_fr/fr/03.flutter-integration/2.qora-scope.md",{"type":345,"value":346,"toc":1763},"minimark",[347,357,360,365,370,506,512,515,638,668,670,674,681,684,853,859,872,966,972,982,1040,1046,1052,1082,1084,1088,1094,1242,1248,1250,1254,1260,1278,1332,1342,1348,1372,1378,1395,1404,1430,1448,1455,1465,1521,1523,1527,1717,1719,1723,1759],[348,349,350,353,354,356],"p",{},[351,352,103],"code",{}," est le point de vérité unique pour le ",[351,355,202],{}," dans Flutter. Encapsuler l'application (ou un sous-arbre) avec ce widget une seule fois, et chaque descendant accède au même cache et au même pipeline de requêtes.",[358,359],"hr",{},[361,362,364],"h2",{"id":363},"anatomie","Anatomie",[366,367,369],"h3",{"id":368},"constructeur-par-défaut","Constructeur par défaut",[371,372,378],"pre",{"className":373,"code":374,"filename":375,"language":376,"meta":377,"style":377},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraScope(\n  // Requis : le cache partagé et le moteur de requêtes\n  client: client,\n\n  // Optionnel : invalide les requêtes à la reprise de l'application\n  lifecycleManager: FlutterLifecycleManager(qoraClient: client),\n\n  // Optionnel : fournisseur de signal pur pour la connectivité réseau\n  connectivityManager: FlutterConnectivityManager(),\n\n  child: const MyApp(),\n)\n","main.dart","dart","",[351,379,380,392,399,415,422,428,449,454,460,476,481,500],{"__ignoreMap":377},[381,382,385,388],"span",{"class":383,"line":384},"line",1,[381,386,103],{"class":387},"sBMFI",[381,389,391],{"class":390},"sTEyZ","(\n",[381,393,395],{"class":383,"line":394},2,[381,396,398],{"class":397},"sHwdD","  // Requis : le cache partagé et le moteur de requêtes\n",[381,400,402,405,409,412],{"class":383,"line":401},3,[381,403,404],{"class":390},"  client",[381,406,408],{"class":407},"sMK4o",":",[381,410,411],{"class":390}," client",[381,413,414],{"class":407},",\n",[381,416,418],{"class":383,"line":417},4,[381,419,421],{"emptyLinePlaceholder":420},true,"\n",[381,423,425],{"class":383,"line":424},5,[381,426,427],{"class":397},"  // Optionnel : invalide les requêtes à la reprise de l'application\n",[381,429,431,434,436,439,442,444,447],{"class":383,"line":430},6,[381,432,433],{"class":390},"  lifecycleManager",[381,435,408],{"class":407},[381,437,438],{"class":387}," FlutterLifecycleManager",[381,440,441],{"class":390},"(qoraClient",[381,443,408],{"class":407},[381,445,446],{"class":390}," client)",[381,448,414],{"class":407},[381,450,452],{"class":383,"line":451},7,[381,453,421],{"emptyLinePlaceholder":420},[381,455,457],{"class":383,"line":456},8,[381,458,459],{"class":397},"  // Optionnel : fournisseur de signal pur pour la connectivité réseau\n",[381,461,463,466,468,471,474],{"class":383,"line":462},9,[381,464,465],{"class":390},"  connectivityManager",[381,467,408],{"class":407},[381,469,470],{"class":387}," FlutterConnectivityManager",[381,472,473],{"class":390},"()",[381,475,414],{"class":407},[381,477,479],{"class":383,"line":478},10,[381,480,421],{"emptyLinePlaceholder":420},[381,482,484,487,489,493,496,498],{"class":383,"line":483},11,[381,485,486],{"class":390},"  child",[381,488,408],{"class":407},[381,490,492],{"class":491},"spNyl"," const",[381,494,495],{"class":387}," MyApp",[381,497,473],{"class":390},[381,499,414],{"class":407},[381,501,503],{"class":383,"line":502},12,[381,504,505],{"class":390},")\n",[366,507,509],{"id":508},"qorascopeauto",[351,510,511],{},"QoraScope.auto()",[348,513,514],{},"Un constructeur pratique qui câble automatiquement les deux gestionnaires :",[371,516,518],{"className":373,"code":517,"filename":375,"language":376,"meta":377,"style":377},"QoraScope.auto(\n  client: QoraClient(),\n  child: const MyApp(),\n)\n// Équivalent à passer manuellement FlutterLifecycleManager + FlutterConnectivityManager.\n\n// Désactiver des listeners spécifiques :\nQoraScope.auto(\n  client: QoraClient(),\n  enableLifecycle: false,\n  enableConnectivity: false,\n  child: const MyApp(),\n)\n",[351,519,520,533,546,560,564,569,573,578,588,600,610,619,633],{"__ignoreMap":377},[381,521,522,524,527,531],{"class":383,"line":384},[381,523,103],{"class":387},[381,525,526],{"class":407},".",[381,528,530],{"class":529},"s2Zo4","auto",[381,532,391],{"class":390},[381,534,535,537,539,542,544],{"class":383,"line":394},[381,536,404],{"class":390},[381,538,408],{"class":407},[381,540,541],{"class":387}," QoraClient",[381,543,473],{"class":390},[381,545,414],{"class":407},[381,547,548,550,552,554,556,558],{"class":383,"line":401},[381,549,486],{"class":390},[381,551,408],{"class":407},[381,553,492],{"class":491},[381,555,495],{"class":387},[381,557,473],{"class":390},[381,559,414],{"class":407},[381,561,562],{"class":383,"line":417},[381,563,505],{"class":390},[381,565,566],{"class":383,"line":424},[381,567,568],{"class":397},"// Équivalent à passer manuellement FlutterLifecycleManager + FlutterConnectivityManager.\n",[381,570,571],{"class":383,"line":430},[381,572,421],{"emptyLinePlaceholder":420},[381,574,575],{"class":383,"line":451},[381,576,577],{"class":397},"// Désactiver des listeners spécifiques :\n",[381,579,580,582,584,586],{"class":383,"line":456},[381,581,103],{"class":387},[381,583,526],{"class":407},[381,585,530],{"class":529},[381,587,391],{"class":390},[381,589,590,592,594,596,598],{"class":383,"line":462},[381,591,404],{"class":390},[381,593,408],{"class":407},[381,595,541],{"class":387},[381,597,473],{"class":390},[381,599,414],{"class":407},[381,601,602,605,607],{"class":383,"line":478},[381,603,604],{"class":390},"  enableLifecycle",[381,606,408],{"class":407},[381,608,609],{"class":407}," false,\n",[381,611,612,615,617],{"class":383,"line":483},[381,613,614],{"class":390},"  enableConnectivity",[381,616,408],{"class":407},[381,618,609],{"class":407},[381,620,621,623,625,627,629,631],{"class":383,"line":502},[381,622,486],{"class":390},[381,624,408],{"class":407},[381,626,492],{"class":491},[381,628,495],{"class":387},[381,630,473],{"class":390},[381,632,414],{"class":407},[381,634,636],{"class":383,"line":635},13,[381,637,505],{"class":390},[348,639,640,642,643,646,647,650,651,654,655,658,659,663,664,667],{},[351,641,103],{}," est un ",[351,644,645],{},"StatefulWidget",". Il appelle ",[351,648,649],{},"start()"," sur chaque gestionnaire dans ",[351,652,653],{},"initState"," et appelle ",[351,656,657],{},"dispose()"," sur les deux gestionnaires ",[660,661,662],"strong",{},"et"," sur le client lui-même dans ",[351,665,666],{},"dispose",". Le cycle de vie n'est jamais géré manuellement.",[358,669],{},[361,671,673],{"id":672},"accéder-au-client","Accéder au client",[366,675,677,680],{"id":676},"contextqora-recommandé",[351,678,679],{},"context.qora"," (recommandé)",[348,682,683],{},"Le chemin le plus court vers le client depuis n'importe quel widget :",[371,685,688],{"className":373,"code":686,"filename":687,"language":376,"meta":377,"style":377},"// Invalider une requête spécifique après une mutation\ncontext.qora.invalidate(['posts', postId]);\n\n// Invalider par prédicat\ncontext.qora.invalidateWhere((key) => key.firstOrNull == 'posts');\n\n// Mise à jour optimiste\nfinal snapshot = context.qora.getQueryData\u003CUser>(['users', userId]);\ncontext.qora.setQueryData(['users', userId], updatedUser);\n","user_list_screen.dart",[351,689,690,695,726,730,735,773,777,782,824],{"__ignoreMap":377},[381,691,692],{"class":383,"line":384},[381,693,694],{"class":397},"// Invalider une requête spécifique après une mutation\n",[381,696,697,700,702,705,707,710,713,717,720,723],{"class":383,"line":394},[381,698,699],{"class":390},"context",[381,701,526],{"class":407},[381,703,704],{"class":390},"qora",[381,706,526],{"class":407},[381,708,709],{"class":529},"invalidate",[381,711,712],{"class":390},"([",[381,714,716],{"class":715},"sfazB","'posts'",[381,718,719],{"class":407},",",[381,721,722],{"class":390}," postId])",[381,724,725],{"class":407},";\n",[381,727,728],{"class":383,"line":401},[381,729,421],{"emptyLinePlaceholder":420},[381,731,732],{"class":383,"line":417},[381,733,734],{"class":397},"// Invalider par prédicat\n",[381,736,737,739,741,743,745,748,751,754,757,759,762,765,768,771],{"class":383,"line":424},[381,738,699],{"class":390},[381,740,526],{"class":407},[381,742,704],{"class":390},[381,744,526],{"class":407},[381,746,747],{"class":529},"invalidateWhere",[381,749,750],{"class":390},"((key) ",[381,752,753],{"class":407},"=>",[381,755,756],{"class":390}," key",[381,758,526],{"class":407},[381,760,761],{"class":390},"firstOrNull ",[381,763,764],{"class":407},"==",[381,766,767],{"class":715}," 'posts'",[381,769,770],{"class":390},")",[381,772,725],{"class":407},[381,774,775],{"class":383,"line":430},[381,776,421],{"emptyLinePlaceholder":420},[381,778,779],{"class":383,"line":451},[381,780,781],{"class":397},"// Mise à jour optimiste\n",[381,783,784,787,790,793,796,798,800,802,805,808,811,814,817,819,822],{"class":383,"line":456},[381,785,786],{"class":491},"final",[381,788,789],{"class":390}," snapshot ",[381,791,792],{"class":407},"=",[381,794,795],{"class":390}," context",[381,797,526],{"class":407},[381,799,704],{"class":390},[381,801,526],{"class":407},[381,803,804],{"class":529},"getQueryData",[381,806,807],{"class":390},"\u003C",[381,809,810],{"class":387},"User",[381,812,813],{"class":390},">([",[381,815,816],{"class":715},"'users'",[381,818,719],{"class":407},[381,820,821],{"class":390}," userId])",[381,823,725],{"class":407},[381,825,826,828,830,832,834,837,839,841,843,846,848,851],{"class":383,"line":462},[381,827,699],{"class":390},[381,829,526],{"class":407},[381,831,704],{"class":390},[381,833,526],{"class":407},[381,835,836],{"class":529},"setQueryData",[381,838,712],{"class":390},[381,840,816],{"class":715},[381,842,719],{"class":407},[381,844,845],{"class":390}," userId]",[381,847,719],{"class":407},[381,849,850],{"class":390}," updatedUser)",[381,852,725],{"class":407},[366,854,856],{"id":855},"qorascopeofcontext",[351,857,858],{},"QoraScope.of(context)",[348,860,861,862,864,865,868,869,871],{},"Équivalent à ",[351,863,679],{},". Lève une ",[351,866,867],{},"FlutterError"," descriptive si aucun ancêtre ",[351,870,103],{}," n'est trouvé dans l'arbre :",[371,873,876],{"className":373,"code":874,"filename":875,"language":376,"meta":377,"style":377},"final client = QoraScope.of(context);\nawait client.fetchQuery\u003CList\u003CPost>>(\n  key: ['posts'],\n  fetcher: api.getPosts,\n);\n","user_repository.dart",[351,877,878,900,926,943,960],{"__ignoreMap":377},[381,879,880,882,885,887,890,892,895,898],{"class":383,"line":384},[381,881,786],{"class":491},[381,883,884],{"class":390}," client ",[381,886,792],{"class":407},[381,888,889],{"class":387}," QoraScope",[381,891,526],{"class":407},[381,893,894],{"class":529},"of",[381,896,897],{"class":390},"(context)",[381,899,725],{"class":407},[381,901,902,906,908,910,913,915,918,920,923],{"class":383,"line":394},[381,903,905],{"class":904},"s7zQu","await",[381,907,411],{"class":390},[381,909,526],{"class":407},[381,911,912],{"class":529},"fetchQuery",[381,914,807],{"class":390},[381,916,917],{"class":387},"List",[381,919,807],{"class":390},[381,921,922],{"class":387},"Post",[381,924,925],{"class":390},">>(\n",[381,927,928,931,933,936,938,941],{"class":383,"line":401},[381,929,930],{"class":390},"  key",[381,932,408],{"class":407},[381,934,935],{"class":390}," [",[381,937,716],{"class":715},[381,939,940],{"class":390},"]",[381,942,414],{"class":407},[381,944,945,948,950,953,955,958],{"class":383,"line":417},[381,946,947],{"class":390},"  fetcher",[381,949,408],{"class":407},[381,951,952],{"class":390}," api",[381,954,526],{"class":407},[381,956,957],{"class":390},"getPosts",[381,959,414],{"class":407},[381,961,962,964],{"class":383,"line":424},[381,963,770],{"class":390},[381,965,725],{"class":407},[366,967,969],{"id":968},"qorascopemaybeofcontext",[351,970,971],{},"QoraScope.maybeOf(context)",[348,973,974,975,978,979,981],{},"Retourne ",[351,976,977],{},"null"," au lieu de lever une exception quand ",[351,980,103],{}," est absent. Utile quand le scope est optionnel dans une partie de l'arbre :",[371,983,986],{"className":373,"code":984,"filename":985,"language":376,"meta":377,"style":377},"final client = QoraScope.maybeOf(context);\nif (client == null) return const SizedBox.shrink();\n","optional_widget.dart",[351,987,988,1007],{"__ignoreMap":377},[381,989,990,992,994,996,998,1000,1003,1005],{"class":383,"line":384},[381,991,786],{"class":491},[381,993,884],{"class":390},[381,995,792],{"class":407},[381,997,889],{"class":387},[381,999,526],{"class":407},[381,1001,1002],{"class":529},"maybeOf",[381,1004,897],{"class":390},[381,1006,725],{"class":407},[381,1008,1009,1012,1015,1017,1020,1023,1026,1028,1031,1033,1036,1038],{"class":383,"line":394},[381,1010,1011],{"class":904},"if",[381,1013,1014],{"class":390}," (client ",[381,1016,764],{"class":407},[381,1018,1019],{"class":407}," null",[381,1021,1022],{"class":390},") ",[381,1024,1025],{"class":904},"return",[381,1027,492],{"class":491},[381,1029,1030],{"class":387}," SizedBox",[381,1032,526],{"class":407},[381,1034,1035],{"class":529},"shrink",[381,1037,473],{"class":390},[381,1039,725],{"class":407},[366,1041,1043],{"id":1042},"contextqoraornull",[351,1044,1045],{},"context.qoraOrNull",[348,1047,1048,1049,1051],{},"Raccourci pour ",[351,1050,971],{}," :",[371,1053,1056],{"className":373,"code":1054,"filename":1055,"language":376,"meta":377,"style":377},"context.qoraOrNull?.invalidate(['notifications']);\n","nav_bar.dart",[351,1057,1058],{"__ignoreMap":377},[381,1059,1060,1062,1064,1067,1070,1072,1074,1077,1080],{"class":383,"line":384},[381,1061,699],{"class":390},[381,1063,526],{"class":407},[381,1065,1066],{"class":390},"qoraOrNull",[381,1068,1069],{"class":407},"?.",[381,1071,709],{"class":529},[381,1073,712],{"class":390},[381,1075,1076],{"class":715},"'notifications'",[381,1078,1079],{"class":390},"])",[381,1081,725],{"class":407},[358,1083],{},[361,1085,1087],{"id":1086},"scopes-imbriqués","Scopes imbriqués",[348,1089,1090,1091,1093],{},"Plusieurs widgets ",[351,1092,103],{}," peuvent être imbriqués pour isoler les caches dans différentes parties de l'application : par exemple, des caches séparés pour les routes publiques et authentifiées :",[371,1095,1098],{"className":373,"code":1096,"filename":1097,"language":376,"meta":377,"style":377},"QoraScope(\n  client: publicClient,\n  child: Navigator(\n    pages: [\n      MaterialPage(child: const HomeScreen()),\n      MaterialPage(\n        child: QoraScope(\n          // Cache séparé pour les routes authentifiées\n          client: authClient,\n          child: const DashboardScreen(),\n        ),\n      ),\n    ],\n  ),\n)\n","app.dart",[351,1099,1100,1106,1117,1128,1138,1158,1164,1175,1180,1192,1208,1215,1222,1229,1237],{"__ignoreMap":377},[381,1101,1102,1104],{"class":383,"line":384},[381,1103,103],{"class":387},[381,1105,391],{"class":390},[381,1107,1108,1110,1112,1115],{"class":383,"line":394},[381,1109,404],{"class":390},[381,1111,408],{"class":407},[381,1113,1114],{"class":390}," publicClient",[381,1116,414],{"class":407},[381,1118,1119,1121,1123,1126],{"class":383,"line":401},[381,1120,486],{"class":390},[381,1122,408],{"class":407},[381,1124,1125],{"class":387}," Navigator",[381,1127,391],{"class":390},[381,1129,1130,1133,1135],{"class":383,"line":417},[381,1131,1132],{"class":390},"    pages",[381,1134,408],{"class":407},[381,1136,1137],{"class":390}," [\n",[381,1139,1140,1143,1146,1148,1150,1153,1156],{"class":383,"line":424},[381,1141,1142],{"class":387},"      MaterialPage",[381,1144,1145],{"class":390},"(child",[381,1147,408],{"class":407},[381,1149,492],{"class":491},[381,1151,1152],{"class":387}," HomeScreen",[381,1154,1155],{"class":390},"())",[381,1157,414],{"class":407},[381,1159,1160,1162],{"class":383,"line":430},[381,1161,1142],{"class":387},[381,1163,391],{"class":390},[381,1165,1166,1169,1171,1173],{"class":383,"line":451},[381,1167,1168],{"class":390},"        child",[381,1170,408],{"class":407},[381,1172,889],{"class":387},[381,1174,391],{"class":390},[381,1176,1177],{"class":383,"line":456},[381,1178,1179],{"class":397},"          // Cache séparé pour les routes authentifiées\n",[381,1181,1182,1185,1187,1190],{"class":383,"line":462},[381,1183,1184],{"class":390},"          client",[381,1186,408],{"class":407},[381,1188,1189],{"class":390}," authClient",[381,1191,414],{"class":407},[381,1193,1194,1197,1199,1201,1204,1206],{"class":383,"line":478},[381,1195,1196],{"class":390},"          child",[381,1198,408],{"class":407},[381,1200,492],{"class":491},[381,1202,1203],{"class":387}," DashboardScreen",[381,1205,473],{"class":390},[381,1207,414],{"class":407},[381,1209,1210,1213],{"class":383,"line":483},[381,1211,1212],{"class":390},"        )",[381,1214,414],{"class":407},[381,1216,1217,1220],{"class":383,"line":502},[381,1218,1219],{"class":390},"      )",[381,1221,414],{"class":407},[381,1223,1224,1227],{"class":383,"line":635},[381,1225,1226],{"class":390},"    ]",[381,1228,414],{"class":407},[381,1230,1232,1235],{"class":383,"line":1231},14,[381,1233,1234],{"class":390},"  )",[381,1236,414],{"class":407},[381,1238,1240],{"class":383,"line":1239},15,[381,1241,505],{"class":390},[348,1243,1244,1245,1247],{},"Chaque ",[351,1246,103],{}," gère son propre client : les requêtes sont entièrement indépendantes entre les scopes.",[358,1249],{},[361,1251,1253],{"id":1252},"gestionnaires-de-cycle-de-vie-et-de-connectivité","Gestionnaires de cycle de vie et de connectivité",[366,1255,1257],{"id":1256},"flutterlifecyclemanager",[351,1258,1259],{},"FlutterLifecycleManager",[348,1261,1262,1263,1266,1267,1270,1271,1274,1275,1051],{},"Observe les changements d'",[351,1264,1265],{},"AppLifecycleState"," via ",[351,1268,1269],{},"WidgetsBindingObserver",". Quand l'application reprend après une pause supérieure à ",[351,1272,1273],{},"minBackgroundDuration",", il appelle ",[351,1276,1277],{},"client.invalidateWhere((_) => true)",[371,1279,1281],{"className":373,"code":1280,"filename":375,"language":376,"meta":377,"style":377},"FlutterLifecycleManager(\n  qoraClient: client,\n  minBackgroundDuration: const Duration(minutes: 1), // défaut : 5 s\n)\n",[351,1282,1283,1289,1300,1328],{"__ignoreMap":377},[381,1284,1285,1287],{"class":383,"line":384},[381,1286,1259],{"class":387},[381,1288,391],{"class":390},[381,1290,1291,1294,1296,1298],{"class":383,"line":394},[381,1292,1293],{"class":390},"  qoraClient",[381,1295,408],{"class":407},[381,1297,411],{"class":390},[381,1299,414],{"class":407},[381,1301,1302,1305,1307,1309,1312,1315,1317,1321,1323,1325],{"class":383,"line":401},[381,1303,1304],{"class":390},"  minBackgroundDuration",[381,1306,408],{"class":407},[381,1308,492],{"class":491},[381,1310,1311],{"class":387}," Duration",[381,1313,1314],{"class":390},"(minutes",[381,1316,408],{"class":407},[381,1318,1320],{"class":1319},"sbssI"," 1",[381,1322,770],{"class":390},[381,1324,719],{"class":407},[381,1326,1327],{"class":397}," // défaut : 5 s\n",[381,1329,1330],{"class":383,"line":417},[381,1331,505],{"class":390},[348,1333,1334,1335,1337,1338,1341],{},"Les widgets ",[351,1336,108],{}," actifs reçoivent l'état ",[351,1339,1340],{},"Loading(previousData: data)"," résultant et déclenchent immédiatement des requêtes de refetch. Les utilisateurs voient les données périmées instantanément pendant que les données fraîches se chargent en arrière-plan.",[366,1343,1345],{"id":1344},"flutterconnectivitymanager",[351,1346,1347],{},"FlutterConnectivityManager",[348,1349,1350,1351,1354,1355,1358,1359,1362,1363,1365,1366,1369,1370,526],{},"Un ",[660,1352,1353],{},"fournisseur de signal pur"," : il convertit les événements ",[351,1356,1357],{},"connectivity_plus"," en valeurs ",[351,1360,1361],{},"NetworkStatus"," uniquement. ",[351,1364,103],{}," le câble automatiquement au client via ",[351,1367,1368],{},"attachConnectivityManager()"," après l'appel de ",[351,1371,649],{},[348,1373,1374,1375,1377],{},"Toute la logique de reconnexion (relecture des requêtes, relecture de la file de mutations hors-ligne, traitement par lots du thundering-herd) s'exécute dans ",[351,1376,202],{},", et non dans le gestionnaire :",[371,1379,1381],{"className":373,"code":1380,"filename":375,"language":376,"meta":377,"style":377},"// Pas de référence QoraClient requise : fournisseur de signal pur\nFlutterConnectivityManager()\n",[351,1382,1383,1388],{"__ignoreMap":377},[381,1384,1385],{"class":383,"line":384},[381,1386,1387],{"class":397},"// Pas de référence QoraClient requise : fournisseur de signal pur\n",[381,1389,1390,1392],{"class":383,"line":394},[381,1391,1347],{"class":387},[381,1393,1394],{"class":390},"()\n",[348,1396,1397,1398,1400,1401,1051],{},"Nécessite ",[351,1399,1357],{}," dans ",[351,1402,1403],{},"pubspec.yaml",[371,1405,1409],{"className":1406,"code":1407,"filename":1403,"language":1408,"meta":377,"style":377},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependencies:\n  connectivity_plus: ^6.0.0\n","yaml",[351,1410,1411,1420],{"__ignoreMap":377},[381,1412,1413,1417],{"class":383,"line":384},[381,1414,1416],{"class":1415},"swJcz","dependencies",[381,1418,1419],{"class":407},":\n",[381,1421,1422,1425,1427],{"class":383,"line":394},[381,1423,1424],{"class":1415},"  connectivity_plus",[381,1426,408],{"class":407},[381,1428,1429],{"class":715}," ^6.0.0\n",[1431,1432,1433,1435,1436,1439,1440,1443,1444,1447],"tip",{},[351,1434,1347],{}," n'invalide plus les requêtes directement. Le comportement de reconnexion est contrôlé par ",[351,1437,1438],{},"QoraClientConfig.reconnectStrategy"," et ",[351,1441,1442],{},"QoraOptions.networkMode"," par requête. Implémenter un ",[351,1445,1446],{},"ConnectivityManager"," personnalisé pour sourcer les événements de connectivité depuis un package différent.",[366,1449,1451,1452,1454],{"id":1450},"accéder-au-connectivitymanager-depuis-les-descendants","Accéder au ",[351,1453,1446],{}," depuis les descendants",[348,1456,1457,1460,1461,1464],{},[351,1458,1459],{},"QoraScope.connectivityManagerOf(context)"," expose le gestionnaire aux widgets plus profonds dans l'arbre (utilisé en interne par ",[351,1462,1463],{},"NetworkStatusBuilder",") :",[371,1466,1469],{"className":373,"code":1467,"filename":1468,"language":376,"meta":377,"style":377},"final manager = QoraScope.connectivityManagerOf(context);\nfinal status = manager?.currentStatus ?? NetworkStatus.unknown;\n","lib/ui/offline_badge.dart",[351,1470,1471,1491],{"__ignoreMap":377},[381,1472,1473,1475,1478,1480,1482,1484,1487,1489],{"class":383,"line":384},[381,1474,786],{"class":491},[381,1476,1477],{"class":390}," manager ",[381,1479,792],{"class":407},[381,1481,889],{"class":387},[381,1483,526],{"class":407},[381,1485,1486],{"class":529},"connectivityManagerOf",[381,1488,897],{"class":390},[381,1490,725],{"class":407},[381,1492,1493,1495,1498,1500,1503,1505,1508,1511,1514,1516,1519],{"class":383,"line":394},[381,1494,786],{"class":491},[381,1496,1497],{"class":390}," status ",[381,1499,792],{"class":407},[381,1501,1502],{"class":390}," manager",[381,1504,1069],{"class":407},[381,1506,1507],{"class":390},"currentStatus ",[381,1509,1510],{"class":407},"??",[381,1512,1513],{"class":387}," NetworkStatus",[381,1515,526],{"class":407},[381,1517,1518],{"class":390},"unknown",[381,1520,725],{"class":407},[358,1522],{},[361,1524,1526],{"id":1525},"référence-api","Référence API",[1528,1529,1530,1546],"table",{},[1531,1532,1533],"thead",{},[1534,1535,1536,1540,1543],"tr",{},[1537,1538,1539],"th",{},"Propriété / Méthode",[1537,1541,1542],{},"Type",[1537,1544,1545],{},"Description",[1547,1548,1549,1567,1582,1600,1617,1644,1657,1674,1689,1703],"tbody",{},[1534,1550,1551,1557,1561],{},[1552,1553,1554],"td",{},[351,1555,1556],{},"client",[1552,1558,1559],{},[351,1560,202],{},[1552,1562,1563,1566],{},[660,1564,1565],{},"Requis."," Le client partagé pour ce scope.",[1534,1568,1569,1574,1579],{},[1552,1570,1571],{},[351,1572,1573],{},"lifecycleManager",[1552,1575,1576],{},[351,1577,1578],{},"LifecycleManager?",[1552,1580,1581],{},"Optionnel. Refetch à la reprise de l'application.",[1534,1583,1584,1589,1594],{},[1552,1585,1586],{},[351,1587,1588],{},"connectivityManager",[1552,1590,1591],{},[351,1592,1593],{},"ConnectivityManager?",[1552,1595,1596,1597,1599],{},"Optionnel. Fournisseur de signal pur : pas de référence ",[351,1598,202],{}," requise.",[1534,1601,1602,1607,1612],{},[1552,1603,1604],{},[351,1605,1606],{},"child",[1552,1608,1609],{},[351,1610,1611],{},"Widget",[1552,1613,1614,1616],{},[660,1615,1565],{}," Le sous-arbre de widgets.",[1534,1618,1619,1623,1626],{},[1552,1620,1621],{},[351,1622,511],{},[1552,1624,1625],{},"Constructeur",[1552,1627,1628,1629,1631,1632,1634,1635,1638,1639,1638,1642,526],{},"Raccourci qui câble ",[351,1630,1259],{}," + ",[351,1633,1347],{},". Accepte ",[351,1636,1637],{},"enableLifecycle",", ",[351,1640,1641],{},"enableConnectivity",[351,1643,1273],{},[1534,1645,1646,1650,1654],{},[1552,1647,1648],{},[351,1649,858],{},[1552,1651,1652],{},[351,1653,202],{},[1552,1655,1656],{},"Retourne le client ; lève une exception si absent.",[1534,1658,1659,1663,1668],{},[1552,1660,1661],{},[351,1662,971],{},[1552,1664,1665],{},[351,1666,1667],{},"QoraClient?",[1552,1669,1670,1671,1673],{},"Retourne le client, ou ",[351,1672,977],{}," si absent.",[1534,1675,1676,1680,1684],{},[1552,1677,1678],{},[351,1679,1459],{},[1552,1681,1682],{},[351,1683,1593],{},[1552,1685,1686,1687,526],{},"Retourne le gestionnaire actif ; utilisé par ",[351,1688,1463],{},[1534,1690,1691,1695,1699],{},[1552,1692,1693],{},[351,1694,679],{},[1552,1696,1697],{},[351,1698,202],{},[1552,1700,1048,1701,526],{},[351,1702,858],{},[1534,1704,1705,1709,1713],{},[1552,1706,1707],{},[351,1708,1045],{},[1552,1710,1711],{},[351,1712,1667],{},[1552,1714,1048,1715,526],{},[351,1716,971],{},[358,1718],{},[361,1720,1722],{"id":1721},"étapes-suivantes","Étapes suivantes",[1724,1725,1726,1734,1746,1753],"ul",{},[1727,1728,1729,1733],"li",{},[1730,1731,108],"a",{"href":1732},"./qora-builder"," : Récupérer des données et lier les états aux widgets Flutter",[1727,1735,1736,1740,1741,1439,1743],{},[1730,1737,1739],{"href":1738},"./network-status","Statut réseau"," : Widgets ",[351,1742,1463],{},[351,1744,1745],{},"NetworkStatusIndicator",[1727,1747,1748,1752],{},[1730,1749,1751],{"href":1750},"../recipes/network-aware","Guide réseau adaptatif"," : Mise en place complète du mode hors-ligne",[1727,1754,1755,1758],{},[1730,1756,21],{"href":1757},"../getting-started/quick-start"," : Intégration Flutter de bout en bout",[1760,1761,1762],"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":377,"searchDepth":394,"depth":394,"links":1764},[1765,1769,1776,1777,1783,1784],{"id":363,"depth":394,"text":364,"children":1766},[1767,1768],{"id":368,"depth":401,"text":369},{"id":508,"depth":401,"text":511},{"id":672,"depth":394,"text":673,"children":1770},[1771,1773,1774,1775],{"id":676,"depth":401,"text":1772},"context.qora (recommandé)",{"id":855,"depth":401,"text":858},{"id":968,"depth":401,"text":971},{"id":1042,"depth":401,"text":1045},{"id":1086,"depth":394,"text":1087},{"id":1252,"depth":394,"text":1253,"children":1778},[1779,1780,1781],{"id":1256,"depth":401,"text":1259},{"id":1344,"depth":401,"text":1347},{"id":1450,"depth":401,"text":1782},"Accéder au ConnectivityManager depuis les descendants",{"id":1525,"depth":394,"text":1526},{"id":1721,"depth":394,"text":1722},"Le StatefulWidget qui fournit un QoraClient à l'arbre de widgets et gère le cycle de vie des gestionnaires de plateforme optionnels.","md",null,{},{"icon":106},{"title":103,"description":1785},"zOI-bDJq42NAJxY5f4mDvX_i-KvcJqkkLFBbfBeReEE",[1793,1795],{"title":98,"path":99,"stem":100,"description":1794,"icon":101,"children":-1},"Installer qora_flutter, créer une instance QoraClient et la fournir à l'arbre de widgets avec QoraScope.",{"title":108,"path":109,"stem":110,"description":1796,"icon":111,"children":-1},"Le widget qui récupère les données, s'abonne aux changements d'état et reconstruit l'UI à chaque transition d'état.",1794040407186]