[{"data":1,"prerenderedAt":4411},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-recipes-network-aware":342,"-fr-recipes-network-aware-surround":4406},[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":158,"body":344,"description":4397,"extension":4398,"links":4399,"meta":4400,"navigation":4401,"path":159,"seo":4402,"stem":160,"__hash__":4405},"docs_fr/fr/04.recipes/05.network-aware.md",{"type":345,"value":346,"toc":4360},"minimark",[347,351,354,358,361,412,423,425,428,433,546,555,682,688,769,773,841,848,850,854,870,932,935,1063,1070,1202,1208,1216,1522,1524,1528,1534,1538,1551,1719,1723,1730,1738,1744,1750,1757,1767,2182,2186,2395,2399,2410,2416,2422,2424,2428,2435,2534,2538,2596,2598,2602,2609,2635,2641,2931,2938,2944,3016,3023,3028,3274,3278,3292,3526,3528,3532,4306,4308,4312,4356],[348,349,350],"p",{},"Qora fournit un comportement adaptatif au réseau pour les requêtes et les mutations. Quand la connectivité est perdue, Qora peut suspendre les fetchs, mettre en file les mutations et rejouer les opérations après la reconnexion.",[352,353],"hr",{},[355,356,243],"h2",{"id":357},"vue-densemble",[348,359,360],{},"La conscience du réseau dans Qora repose sur trois primitives orthogonales :",[362,363,364,377],"table",{},[365,366,367],"thead",{},[368,369,370,374],"tr",{},[371,372,373],"th",{},"Primitive",[371,375,376],{},"Ce qu'elle contrôle",[378,379,380,392,402],"tbody",{},[368,381,382,389],{},[383,384,385],"td",{},[386,387,388],"code",{},"NetworkMode",[383,390,391],{},"Comment une requête ou mutation se comporte quand hors-ligne",[368,393,394,399],{},[383,395,396],{},[386,397,398],{},"FetchStatus",[383,400,401],{},"Si un fetch est activement en cours, en pause ou inactif",[368,403,404,409],{},[383,405,406],{},[386,407,408],{},"OfflineMutationQueue",[383,410,411],{},"File FIFO qui rejoue les écritures en file à la reconnexion",[348,413,414,415,418,419,422],{},"Elles sont entièrement indépendantes. ",[386,416,417],{},"NetworkMode.online"," (pause des requêtes) peut être utilisé sans activer la file de mutations hors-ligne, ou la file peut être activée sur les mutations pendant que les requêtes utilisent ",[386,420,421],{},"NetworkMode.always",".",[352,424],{},[355,426,388],{"id":427},"networkmode",[348,429,430,432],{},[386,431,388],{}," est un enum par requête / par mutation qui indique à Qora que faire quand l'appareil n'a pas de connectivité :",[434,435,441],"pre",{"className":436,"code":437,"filename":438,"language":439,"meta":440,"style":440},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","enum NetworkMode {\n  /// Par défaut. Suspend le fetch hors-ligne et le rejoue à la reconnexion.\n  /// L'état devient Loading(previousData: \u003Cdonnée en cache ou null>) et\n  /// FetchStatus passe à paused jusqu'au retour de la connectivité.\n  online,\n\n  /// Toujours exécuter quelle que soit la connectivité.\n  /// Utile quand le fetcher utilise une base de données locale ou un cache.\n  always,\n\n  /// Servir les données en cache immédiatement, puis planifier une revalidation\n  /// en arrière-plan quand l'appareil est de nouveau en ligne.\n  offlineFirst,\n}\n","lib/core/qora.dart","dart","",[386,442,443,460,467,473,479,488,495,501,507,515,520,526,532,540],{"__ignoreMap":440},[444,445,448,452,456],"span",{"class":446,"line":447},"line",1,[444,449,451],{"class":450},"sMK4o","enum",[444,453,455],{"class":454},"sBMFI"," NetworkMode",[444,457,459],{"class":458},"sTEyZ"," {\n",[444,461,463],{"class":446,"line":462},2,[444,464,466],{"class":465},"sHwdD","  /// Par défaut. Suspend le fetch hors-ligne et le rejoue à la reconnexion.\n",[444,468,470],{"class":446,"line":469},3,[444,471,472],{"class":465},"  /// L'état devient Loading(previousData: \u003Cdonnée en cache ou null>) et\n",[444,474,476],{"class":446,"line":475},4,[444,477,478],{"class":465},"  /// FetchStatus passe à paused jusqu'au retour de la connectivité.\n",[444,480,482,485],{"class":446,"line":481},5,[444,483,484],{"class":458},"  online",[444,486,487],{"class":450},",\n",[444,489,491],{"class":446,"line":490},6,[444,492,494],{"emptyLinePlaceholder":493},true,"\n",[444,496,498],{"class":446,"line":497},7,[444,499,500],{"class":465},"  /// Toujours exécuter quelle que soit la connectivité.\n",[444,502,504],{"class":446,"line":503},8,[444,505,506],{"class":465},"  /// Utile quand le fetcher utilise une base de données locale ou un cache.\n",[444,508,510,513],{"class":446,"line":509},9,[444,511,512],{"class":458},"  always",[444,514,487],{"class":450},[444,516,518],{"class":446,"line":517},10,[444,519,494],{"emptyLinePlaceholder":493},[444,521,523],{"class":446,"line":522},11,[444,524,525],{"class":465},"  /// Servir les données en cache immédiatement, puis planifier une revalidation\n",[444,527,529],{"class":446,"line":528},12,[444,530,531],{"class":465},"  /// en arrière-plan quand l'appareil est de nouveau en ligne.\n",[444,533,535,538],{"class":446,"line":534},13,[444,536,537],{"class":458},"  offlineFirst",[444,539,487],{"class":450},[444,541,543],{"class":446,"line":542},14,[444,544,545],{"class":458},"}\n",[547,548,550,551,554],"h3",{"id":549},"définir-networkmode-par-requête","Définir ",[386,552,553],{},"networkMode"," par requête",[434,556,559],{"className":436,"code":557,"filename":558,"language":439,"meta":440,"style":440},"final user = await client.fetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: const QoraOptions(networkMode: NetworkMode.online), // défaut\n);\n","lib/data/user_repository.dart",[386,560,561,595,618,644,674],{"__ignoreMap":440},[444,562,563,567,570,573,577,580,582,586,589,592],{"class":446,"line":447},[444,564,566],{"class":565},"spNyl","final",[444,568,569],{"class":458}," user ",[444,571,572],{"class":450},"=",[444,574,576],{"class":575},"s7zQu"," await",[444,578,579],{"class":458}," client",[444,581,422],{"class":450},[444,583,585],{"class":584},"s2Zo4","fetchQuery",[444,587,588],{"class":458},"\u003C",[444,590,591],{"class":454},"User",[444,593,594],{"class":458},">(\n",[444,596,597,600,603,606,610,613,616],{"class":446,"line":462},[444,598,599],{"class":458},"  key",[444,601,602],{"class":450},":",[444,604,605],{"class":458}," [",[444,607,609],{"class":608},"sfazB","'users'",[444,611,612],{"class":450},",",[444,614,615],{"class":458}," userId]",[444,617,487],{"class":450},[444,619,620,623,625,628,631,634,636,639,642],{"class":446,"line":469},[444,621,622],{"class":458},"  fetcher",[444,624,602],{"class":450},[444,626,627],{"class":458}," () ",[444,629,630],{"class":450},"=>",[444,632,633],{"class":458}," api",[444,635,422],{"class":450},[444,637,638],{"class":584},"getUser",[444,640,641],{"class":458},"(userId)",[444,643,487],{"class":450},[444,645,646,649,651,654,657,660,662,664,666,669,671],{"class":446,"line":475},[444,647,648],{"class":458},"  options",[444,650,602],{"class":450},[444,652,653],{"class":565}," const",[444,655,656],{"class":454}," QoraOptions",[444,658,659],{"class":458},"(networkMode",[444,661,602],{"class":450},[444,663,455],{"class":454},[444,665,422],{"class":450},[444,667,668],{"class":458},"online)",[444,670,612],{"class":450},[444,672,673],{"class":465}," // défaut\n",[444,675,676,679],{"class":446,"line":481},[444,677,678],{"class":458},")",[444,680,681],{"class":450},";\n",[547,683,550,685,687],{"id":684},"définir-networkmode-globalement",[386,686,553],{}," globalement",[434,689,691],{"className":436,"code":690,"filename":438,"language":439,"meta":440,"style":440},"final client = QoraClient(\n  config: const QoraClientConfig(\n    defaultOptions: QoraOptions(\n      networkMode: NetworkMode.online,\n    ),\n  ),\n);\n",[386,692,693,708,722,733,749,756,763],{"__ignoreMap":440},[444,694,695,697,700,702,705],{"class":446,"line":447},[444,696,566],{"class":565},[444,698,699],{"class":458}," client ",[444,701,572],{"class":450},[444,703,704],{"class":454}," QoraClient",[444,706,707],{"class":458},"(\n",[444,709,710,713,715,717,720],{"class":446,"line":462},[444,711,712],{"class":458},"  config",[444,714,602],{"class":450},[444,716,653],{"class":565},[444,718,719],{"class":454}," QoraClientConfig",[444,721,707],{"class":458},[444,723,724,727,729,731],{"class":446,"line":469},[444,725,726],{"class":458},"    defaultOptions",[444,728,602],{"class":450},[444,730,656],{"class":454},[444,732,707],{"class":458},[444,734,735,738,740,742,744,747],{"class":446,"line":475},[444,736,737],{"class":458},"      networkMode",[444,739,602],{"class":450},[444,741,455],{"class":454},[444,743,422],{"class":450},[444,745,746],{"class":458},"online",[444,748,487],{"class":450},[444,750,751,754],{"class":446,"line":481},[444,752,753],{"class":458},"    )",[444,755,487],{"class":450},[444,757,758,761],{"class":446,"line":490},[444,759,760],{"class":458},"  )",[444,762,487],{"class":450},[444,764,765,767],{"class":446,"line":497},[444,766,678],{"class":458},[444,768,681],{"class":450},[547,770,772],{"id":771},"comportement-par-mode","Comportement par mode",[362,774,775,788],{},[365,776,777],{},[368,778,779,782,785],{},[371,780,781],{},"Mode",[371,783,784],{},"Comportement hors-ligne",[371,786,787],{},"À la reconnexion",[378,789,790,812,828],{},[368,791,792,797,809],{},[383,793,794,796],{},[386,795,746],{}," (défaut)",[383,798,799,800,804,805,808],{},"Fetch ",[801,802,803],"strong",{},"suspendu",", ",[386,806,807],{},"FetchStatus.paused"," émis",[383,810,811],{},"Rejoué automatiquement",[368,813,814,819,825],{},[383,815,816],{},[386,817,818],{},"always",[383,820,799,821,824],{},[801,822,823],{},"s'exécute"," : échoue sans connectivité",[383,826,827],{},"Pas de retry à la reconnexion",[368,829,830,835,838],{},[383,831,832],{},[386,833,834],{},"offlineFirst",[383,836,837],{},"Données en cache retournées immédiatement",[383,839,840],{},"Revalidation en arrière-plan mise en file",[842,843,844,845,847],"tip",{},"Utiliser ",[386,846,421],{}," pour les requêtes soutenues par une base de données SQLite locale ou une box Hive : elles n'ont jamais besoin de connectivité et ne devraient jamais être suspendues.",[352,849],{},[355,851,853],{"id":852},"fetchstatus-le-second-axe","FetchStatus : le second axe",[348,855,856,859,860,863,864,859,866,869],{},[386,857,858],{},"QoraState\u003CT>"," décrit ",[801,861,862],{},"ce que vous avez"," (initial / loading / success / failure). ",[386,865,398],{},[801,867,868],{},"ce que Qora est en train de faire"," pour l'obtenir :",[434,871,873],{"className":436,"code":872,"language":439,"meta":440,"style":440},"enum FetchStatus {\n  /// Une requête réseau est en cours.\n  fetching,\n\n  /// En file pour le fetch mais hors-ligne : reprendra à la reconnexion.\n  paused,\n\n  /// Pas de fetch actif (les données sont fraîches ou aucun fetch n'a démarré).\n  idle,\n}\n",[386,874,875,884,889,896,900,905,912,916,921,928],{"__ignoreMap":440},[444,876,877,879,882],{"class":446,"line":447},[444,878,451],{"class":450},[444,880,881],{"class":454}," FetchStatus",[444,883,459],{"class":458},[444,885,886],{"class":446,"line":462},[444,887,888],{"class":465},"  /// Une requête réseau est en cours.\n",[444,890,891,894],{"class":446,"line":469},[444,892,893],{"class":458},"  fetching",[444,895,487],{"class":450},[444,897,898],{"class":446,"line":475},[444,899,494],{"emptyLinePlaceholder":493},[444,901,902],{"class":446,"line":481},[444,903,904],{"class":465},"  /// En file pour le fetch mais hors-ligne : reprendra à la reconnexion.\n",[444,906,907,910],{"class":446,"line":490},[444,908,909],{"class":458},"  paused",[444,911,487],{"class":450},[444,913,914],{"class":446,"line":497},[444,915,494],{"emptyLinePlaceholder":493},[444,917,918],{"class":446,"line":503},[444,919,920],{"class":465},"  /// Pas de fetch actif (les données sont fraîches ou aucun fetch n'a démarré).\n",[444,922,923,926],{"class":446,"line":509},[444,924,925],{"class":458},"  idle",[444,927,487],{"class":450},[444,929,930],{"class":446,"line":517},[444,931,545],{"class":458},[348,933,934],{},"Ces deux valeurs forment une grille bidimensionnelle. Les combinaisons les plus utiles sont :",[362,936,937,952],{},[365,938,939],{},[368,940,941,945,949],{},[371,942,943],{},[386,944,211],{},[371,946,947],{},[386,948,398],{},[371,950,951],{},"Signification",[378,953,954,969,987,1006,1020,1035,1049],{},[368,955,956,961,966],{},[383,957,958],{},[386,959,960],{},"Loading",[383,962,963],{},[386,964,965],{},"fetching",[383,967,968],{},"Premier fetch en cours",[368,970,971,979,984],{},[383,972,973,975,976,678],{},[386,974,960],{}," (sans ",[386,977,978],{},"previousData",[383,980,981],{},[386,982,983],{},"paused",[383,985,986],{},"Hors-ligne, rien en cache : le fetch attend le réseau",[368,988,989,996,1000],{},[383,990,991,993,994,678],{},[386,992,960],{}," (avec ",[386,995,978],{},[383,997,998],{},[386,999,983],{},[383,1001,1002,1003,1005],{},"Hors-ligne, mode ",[386,1004,746],{}," : refetch en attente, donnée en cache toujours disponible",[368,1007,1008,1013,1017],{},[383,1009,1010],{},[386,1011,1012],{},"Success",[383,1014,1015],{},[386,1016,965],{},[383,1018,1019],{},"Revalidation en arrière-plan en cours",[368,1021,1022,1026,1030],{},[383,1023,1024],{},[386,1025,1012],{},[383,1027,1028],{},[386,1029,983],{},[383,1031,1002,1032,1034],{},[386,1033,834],{}," : donnée en cache servie, refetch en file",[368,1036,1037,1041,1046],{},[383,1038,1039],{},[386,1040,1012],{},[383,1042,1043],{},[386,1044,1045],{},"idle",[383,1047,1048],{},"Données fraîches : rien en cours",[368,1050,1051,1056,1060],{},[383,1052,1053],{},[386,1054,1055],{},"Failure",[383,1057,1058],{},[386,1059,1045],{},[383,1061,1062],{},"Dernier fetch échoué, pas de retry",[547,1064,1066,1067,1069],{"id":1065},"observer-fetchstatus-en-dart","Observer ",[386,1068,398],{}," en Dart",[434,1071,1073],{"className":436,"code":1072,"filename":558,"language":439,"meta":440,"style":440},"client.watchFetchStatus(['users', userId]).listen((status) {\n  switch (status) {\n    case FetchStatus.fetching:\n      print('Récupération…');\n    case FetchStatus.paused:\n      print('Hors-ligne : réessaiera en ligne');\n    case FetchStatus.idle:\n      print('Terminé');\n  }\n});\n",[386,1074,1075,1103,1111,1125,1140,1152,1165,1177,1190,1195],{"__ignoreMap":440},[444,1076,1077,1080,1082,1085,1088,1090,1092,1095,1097,1100],{"class":446,"line":447},[444,1078,1079],{"class":458},"client",[444,1081,422],{"class":450},[444,1083,1084],{"class":584},"watchFetchStatus",[444,1086,1087],{"class":458},"([",[444,1089,609],{"class":608},[444,1091,612],{"class":450},[444,1093,1094],{"class":458}," userId])",[444,1096,422],{"class":450},[444,1098,1099],{"class":584},"listen",[444,1101,1102],{"class":458},"((status) {\n",[444,1104,1105,1108],{"class":446,"line":462},[444,1106,1107],{"class":575},"  switch",[444,1109,1110],{"class":458}," (status) {\n",[444,1112,1113,1116,1118,1120,1122],{"class":446,"line":469},[444,1114,1115],{"class":575},"    case",[444,1117,881],{"class":454},[444,1119,422],{"class":450},[444,1121,965],{"class":458},[444,1123,1124],{"class":450},":\n",[444,1126,1127,1130,1133,1136,1138],{"class":446,"line":475},[444,1128,1129],{"class":584},"      print",[444,1131,1132],{"class":458},"(",[444,1134,1135],{"class":608},"'Récupération…'",[444,1137,678],{"class":458},[444,1139,681],{"class":450},[444,1141,1142,1144,1146,1148,1150],{"class":446,"line":481},[444,1143,1115],{"class":575},[444,1145,881],{"class":454},[444,1147,422],{"class":450},[444,1149,983],{"class":458},[444,1151,1124],{"class":450},[444,1153,1154,1156,1158,1161,1163],{"class":446,"line":490},[444,1155,1129],{"class":584},[444,1157,1132],{"class":458},[444,1159,1160],{"class":608},"'Hors-ligne : réessaiera en ligne'",[444,1162,678],{"class":458},[444,1164,681],{"class":450},[444,1166,1167,1169,1171,1173,1175],{"class":446,"line":497},[444,1168,1115],{"class":575},[444,1170,881],{"class":454},[444,1172,422],{"class":450},[444,1174,1045],{"class":458},[444,1176,1124],{"class":450},[444,1178,1179,1181,1183,1186,1188],{"class":446,"line":503},[444,1180,1129],{"class":584},[444,1182,1132],{"class":458},[444,1184,1185],{"class":608},"'Terminé'",[444,1187,678],{"class":458},[444,1189,681],{"class":450},[444,1191,1192],{"class":446,"line":509},[444,1193,1194],{"class":458},"  }\n",[444,1196,1197,1200],{"class":446,"line":517},[444,1198,1199],{"class":458},"})",[444,1201,681],{"class":450},[547,1203,1066,1205,1207],{"id":1204},"observer-fetchstatus-dans-flutter",[386,1206,398],{}," dans Flutter",[348,1209,1210,1212,1213,1215],{},[386,1211,108],{}," reçoit ",[386,1214,398],{}," comme troisième argument du builder :",[434,1217,1220],{"className":436,"code":1218,"filename":1219,"language":439,"meta":440,"style":440},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  builder: (context, state, fetchStatus) {\n    // Afficher un chip \"en pause\" quand hors-ligne et en attente de fetch\n    final isPaused = fetchStatus == FetchStatus.paused;\n\n    return switch (state) {\n      Initial() => const SizedBox.shrink(),\n      Loading()  => isPaused\n          ? const OfflineWaitingIndicator()\n          : const CircularProgressIndicator(),\n      Success(:final data) => Column(\n          children: [\n            UserCard(data),\n            if (isPaused) const RefreshingOfflineChip(),\n          ],\n        ),\n      Failure(:final error) => ErrorBanner(error),\n    };\n  },\n)\n","lib/ui/screens/user_screen.dart",[386,1221,1222,1232,1249,1269,1289,1294,1318,1322,1333,1358,1371,1384,1398,1419,1429,1440,1459,1467,1475,1500,1508,1516],{"__ignoreMap":440},[444,1223,1224,1226,1228,1230],{"class":446,"line":447},[444,1225,108],{"class":454},[444,1227,588],{"class":458},[444,1229,591],{"class":454},[444,1231,594],{"class":458},[444,1233,1234,1237,1239,1241,1243,1245,1247],{"class":446,"line":462},[444,1235,1236],{"class":458},"  queryKey",[444,1238,602],{"class":450},[444,1240,605],{"class":458},[444,1242,609],{"class":608},[444,1244,612],{"class":450},[444,1246,615],{"class":458},[444,1248,487],{"class":450},[444,1250,1251,1253,1255,1257,1259,1261,1263,1265,1267],{"class":446,"line":469},[444,1252,622],{"class":458},[444,1254,602],{"class":450},[444,1256,627],{"class":458},[444,1258,630],{"class":450},[444,1260,633],{"class":458},[444,1262,422],{"class":450},[444,1264,638],{"class":584},[444,1266,641],{"class":458},[444,1268,487],{"class":450},[444,1270,1271,1274,1276,1279,1281,1284,1286],{"class":446,"line":475},[444,1272,1273],{"class":458},"  builder",[444,1275,602],{"class":450},[444,1277,1278],{"class":458}," (context",[444,1280,612],{"class":450},[444,1282,1283],{"class":458}," state",[444,1285,612],{"class":450},[444,1287,1288],{"class":458}," fetchStatus) {\n",[444,1290,1291],{"class":446,"line":481},[444,1292,1293],{"class":465},"    // Afficher un chip \"en pause\" quand hors-ligne et en attente de fetch\n",[444,1295,1296,1299,1302,1304,1307,1310,1312,1314,1316],{"class":446,"line":490},[444,1297,1298],{"class":565},"    final",[444,1300,1301],{"class":458}," isPaused ",[444,1303,572],{"class":450},[444,1305,1306],{"class":458}," fetchStatus ",[444,1308,1309],{"class":450},"==",[444,1311,881],{"class":454},[444,1313,422],{"class":450},[444,1315,983],{"class":458},[444,1317,681],{"class":450},[444,1319,1320],{"class":446,"line":497},[444,1321,494],{"emptyLinePlaceholder":493},[444,1323,1324,1327,1330],{"class":446,"line":503},[444,1325,1326],{"class":575},"    return",[444,1328,1329],{"class":575}," switch",[444,1331,1332],{"class":458}," (state) {\n",[444,1334,1335,1338,1341,1343,1345,1348,1350,1353,1356],{"class":446,"line":509},[444,1336,1337],{"class":454},"      Initial",[444,1339,1340],{"class":458},"() ",[444,1342,630],{"class":450},[444,1344,653],{"class":565},[444,1346,1347],{"class":454}," SizedBox",[444,1349,422],{"class":450},[444,1351,1352],{"class":584},"shrink",[444,1354,1355],{"class":458},"()",[444,1357,487],{"class":450},[444,1359,1360,1363,1366,1368],{"class":446,"line":517},[444,1361,1362],{"class":454},"      Loading",[444,1364,1365],{"class":458},"()  ",[444,1367,630],{"class":450},[444,1369,1370],{"class":458}," isPaused\n",[444,1372,1373,1376,1378,1381],{"class":446,"line":522},[444,1374,1375],{"class":450},"          ?",[444,1377,653],{"class":565},[444,1379,1380],{"class":454}," OfflineWaitingIndicator",[444,1382,1383],{"class":458},"()\n",[444,1385,1386,1389,1391,1394,1396],{"class":446,"line":528},[444,1387,1388],{"class":450},"          :",[444,1390,653],{"class":565},[444,1392,1393],{"class":454}," CircularProgressIndicator",[444,1395,1355],{"class":458},[444,1397,487],{"class":450},[444,1399,1400,1403,1405,1407,1409,1412,1414,1417],{"class":446,"line":534},[444,1401,1402],{"class":454},"      Success",[444,1404,1132],{"class":458},[444,1406,602],{"class":450},[444,1408,566],{"class":565},[444,1410,1411],{"class":458}," data) ",[444,1413,630],{"class":450},[444,1415,1416],{"class":454}," Column",[444,1418,707],{"class":458},[444,1420,1421,1424,1426],{"class":446,"line":542},[444,1422,1423],{"class":458},"          children",[444,1425,602],{"class":450},[444,1427,1428],{"class":458}," [\n",[444,1430,1432,1435,1438],{"class":446,"line":1431},15,[444,1433,1434],{"class":454},"            UserCard",[444,1436,1437],{"class":458},"(data)",[444,1439,487],{"class":450},[444,1441,1443,1446,1449,1452,1455,1457],{"class":446,"line":1442},16,[444,1444,1445],{"class":575},"            if",[444,1447,1448],{"class":458}," (isPaused) ",[444,1450,1451],{"class":565},"const",[444,1453,1454],{"class":454}," RefreshingOfflineChip",[444,1456,1355],{"class":458},[444,1458,487],{"class":450},[444,1460,1462,1465],{"class":446,"line":1461},17,[444,1463,1464],{"class":458},"          ]",[444,1466,487],{"class":450},[444,1468,1470,1473],{"class":446,"line":1469},18,[444,1471,1472],{"class":458},"        )",[444,1474,487],{"class":450},[444,1476,1478,1481,1483,1485,1487,1490,1492,1495,1498],{"class":446,"line":1477},19,[444,1479,1480],{"class":454},"      Failure",[444,1482,1132],{"class":458},[444,1484,602],{"class":450},[444,1486,566],{"class":565},[444,1488,1489],{"class":458}," error) ",[444,1491,630],{"class":450},[444,1493,1494],{"class":454}," ErrorBanner",[444,1496,1497],{"class":458},"(error)",[444,1499,487],{"class":450},[444,1501,1503,1506],{"class":446,"line":1502},20,[444,1504,1505],{"class":458},"    }",[444,1507,681],{"class":450},[444,1509,1511,1514],{"class":446,"line":1510},21,[444,1512,1513],{"class":458},"  }",[444,1515,487],{"class":450},[444,1517,1519],{"class":446,"line":1518},22,[444,1520,1521],{"class":458},")\n",[352,1523],{},[355,1525,1527],{"id":1526},"file-de-mutations-hors-ligne","File de mutations hors-ligne",[348,1529,1530,1531,1533],{},"L'",[386,1532,408],{}," maintient les opérations d'écriture qui n'ont pas pu être envoyées hors-ligne et les rejoue dans l'ordre FIFO quand l'appareil se reconnecte.",[547,1535,1537],{"id":1536},"activer-la-file","Activer la file",[348,1539,1540,1541,1543,1544,1546,1547,1550],{},"La file est automatiquement créée et attachée à ",[386,1542,202],{},". Dans Flutter, ",[386,1545,113],{}," l'injecte automatiquement. Il suffit d'opter par mutation via ",[386,1548,1549],{},"MutationOptions"," :",[434,1552,1555],{"className":436,"code":1553,"filename":1554,"language":439,"meta":440,"style":440},"QoraMutationBuilder\u003Cvoid, Todo, void>(\n  mutator: (todo) => api.createTodo(todo),\n  options: MutationOptions(\n    // Opter cette mutation dans la file hors-ligne\n    offlineQueue: true,\n\n    // Fournir une réponse optimiste pour que l'UI se mette à jour immédiatement\n    optimisticResponse: (todo) => todo,\n  ),\n  builder: (context, state, mutate) {\n    return AddTodoButton(\n      onTap: () => mutate(newTodo),\n    );\n  },\n)\n","lib/ui/todo_screen.dart",[386,1556,1557,1577,1601,1612,1617,1627,1631,1636,1652,1658,1675,1684,1703,1709,1715],{"__ignoreMap":440},[444,1558,1559,1561,1563,1566,1568,1571,1573,1575],{"class":446,"line":447},[444,1560,113],{"class":454},[444,1562,588],{"class":458},[444,1564,1565],{"class":565},"void",[444,1567,804],{"class":458},[444,1569,1570],{"class":454},"Todo",[444,1572,804],{"class":458},[444,1574,1565],{"class":565},[444,1576,594],{"class":458},[444,1578,1579,1582,1584,1587,1589,1591,1593,1596,1599],{"class":446,"line":462},[444,1580,1581],{"class":458},"  mutator",[444,1583,602],{"class":450},[444,1585,1586],{"class":458}," (todo) ",[444,1588,630],{"class":450},[444,1590,633],{"class":458},[444,1592,422],{"class":450},[444,1594,1595],{"class":584},"createTodo",[444,1597,1598],{"class":458},"(todo)",[444,1600,487],{"class":450},[444,1602,1603,1605,1607,1610],{"class":446,"line":469},[444,1604,648],{"class":458},[444,1606,602],{"class":450},[444,1608,1609],{"class":454}," MutationOptions",[444,1611,707],{"class":458},[444,1613,1614],{"class":446,"line":475},[444,1615,1616],{"class":465},"    // Opter cette mutation dans la file hors-ligne\n",[444,1618,1619,1622,1624],{"class":446,"line":481},[444,1620,1621],{"class":458},"    offlineQueue",[444,1623,602],{"class":450},[444,1625,1626],{"class":450}," true,\n",[444,1628,1629],{"class":446,"line":490},[444,1630,494],{"emptyLinePlaceholder":493},[444,1632,1633],{"class":446,"line":497},[444,1634,1635],{"class":465},"    // Fournir une réponse optimiste pour que l'UI se mette à jour immédiatement\n",[444,1637,1638,1641,1643,1645,1647,1650],{"class":446,"line":503},[444,1639,1640],{"class":458},"    optimisticResponse",[444,1642,602],{"class":450},[444,1644,1586],{"class":458},[444,1646,630],{"class":450},[444,1648,1649],{"class":458}," todo",[444,1651,487],{"class":450},[444,1653,1654,1656],{"class":446,"line":509},[444,1655,760],{"class":458},[444,1657,487],{"class":450},[444,1659,1660,1662,1664,1666,1668,1670,1672],{"class":446,"line":517},[444,1661,1273],{"class":458},[444,1663,602],{"class":450},[444,1665,1278],{"class":458},[444,1667,612],{"class":450},[444,1669,1283],{"class":458},[444,1671,612],{"class":450},[444,1673,1674],{"class":458}," mutate) {\n",[444,1676,1677,1679,1682],{"class":446,"line":522},[444,1678,1326],{"class":575},[444,1680,1681],{"class":454}," AddTodoButton",[444,1683,707],{"class":458},[444,1685,1686,1689,1691,1693,1695,1698,1701],{"class":446,"line":528},[444,1687,1688],{"class":458},"      onTap",[444,1690,602],{"class":450},[444,1692,627],{"class":458},[444,1694,630],{"class":450},[444,1696,1697],{"class":584}," mutate",[444,1699,1700],{"class":458},"(newTodo)",[444,1702,487],{"class":450},[444,1704,1705,1707],{"class":446,"line":534},[444,1706,753],{"class":458},[444,1708,681],{"class":450},[444,1710,1711,1713],{"class":446,"line":542},[444,1712,1513],{"class":458},[444,1714,487],{"class":450},[444,1716,1717],{"class":446,"line":1431},[444,1718,1521],{"class":458},[547,1720,1722],{"id":1721},"flux-hors-ligne-étape-par-étape","Flux hors-ligne : étape par étape",[348,1724,1725,1726,1729],{},"Quand ",[386,1727,1728],{},"offlineQueue: true"," et que l'appareil est hors-ligne :",[434,1731,1736],{"className":1732,"code":1734,"language":1735,"meta":440},[1733],"language-text","mutate(variables)\n      │\n      ├── offlineQueue: true & hors-ligne ?\n      │       OUI\n      │       ├── Mettre en file PendingMutation (FIFO)\n      │       ├── optimisticResponse fourni ?\n      │       │       OUI → émettre MutationSuccess(isOptimistic: true)\n      │       │       NON → rester MutationPending\n      │       └── ← retourner à l'appelant\n      │\n      └── NON (en ligne) → exécuter normalement → MutationSuccess(isOptimistic: false)\n","text",[386,1737,1734],{"__ignoreMap":440},[348,1739,1740,1741,1743],{},"À la reconnexion, ",[386,1742,202],{}," rejoue la file :",[434,1745,1748],{"className":1746,"code":1747,"language":1735,"meta":440},[1733],"reconnexion détectée\n      │\n      ├── Rejouer les requêtes en pause (par lots, avec jitter)\n      └── Rejouer OfflineMutationQueue (FIFO)\n              │\n              ├── chaque mutation s'exécute une fois, dans l'ordre\n              ├── succès → onSuccess, invalidates, onSettled\n              └── échec → onError (rollback), onSettled, mutation suivante\n",[386,1749,1747],{"__ignoreMap":440},[547,1751,1753,1756],{"id":1752},"isoptimistic-styliser-les-mutations-non-confirmées",[386,1754,1755],{},"isOptimistic"," : styliser les mutations non confirmées",[348,1758,1725,1759,1762,1763,1766],{},[386,1760,1761],{},"optimisticResponse"," est fourni, la mutation émet ",[386,1764,1765],{},"MutationSuccess(isOptimistic: true)",". Utiliser ce flag dans l'UI pour afficher un état visuel \"en attente\" (grisé, icône d'horloge, barré) pour les éléments qui n'ont pas encore été confirmés par le serveur :",[434,1768,1771],{"className":436,"code":1769,"filename":1770,"language":439,"meta":440,"style":440},"QoraMutationBuilder\u003Cvoid, Todo, void>(\n  mutator: api.createTodo,\n  options: MutationOptions(\n    offlineQueue: true,\n    optimisticResponse: (todo) => todo,\n\n    onSuccess: (_, todo, __) async {\n      // S'exécute pour un succès RÉEL (isOptimistic: false) uniquement après confirmation serveur\n      context.qora.invalidate(['todos']);\n    },\n  ),\n  builder: (context, state, mutate) {\n    // Vérifier isOptimistic sur l'état MutationSuccess\n    final isOptimistic = switch (state) {\n      MutationSuccess(:final isOptimistic) => isOptimistic,\n      _ => false,\n    };\n\n    return Column(\n      children: [\n        if (isOptimistic)\n          const Row(\n            children: [\n              Icon(Icons.schedule, size: 14),\n              SizedBox(width: 4),\n              Text('En file : synchronisation quand en ligne'),\n            ],\n          ),\n        SubmitButton(\n          onTap: state.isPending ? null : () => mutate(newTodo),\n        ),\n      ],\n    );\n  },\n)\n","lib/ui/todo_list.dart",[386,1772,1773,1791,1805,1815,1823,1837,1841,1865,1870,1895,1901,1907,1923,1928,1941,1962,1972,1978,1982,1990,1999,2007,2017,2027,2058,2076,2091,2099,2107,2115,2148,2155,2163,2170,2177],{"__ignoreMap":440},[444,1774,1775,1777,1779,1781,1783,1785,1787,1789],{"class":446,"line":447},[444,1776,113],{"class":454},[444,1778,588],{"class":458},[444,1780,1565],{"class":565},[444,1782,804],{"class":458},[444,1784,1570],{"class":454},[444,1786,804],{"class":458},[444,1788,1565],{"class":565},[444,1790,594],{"class":458},[444,1792,1793,1795,1797,1799,1801,1803],{"class":446,"line":462},[444,1794,1581],{"class":458},[444,1796,602],{"class":450},[444,1798,633],{"class":458},[444,1800,422],{"class":450},[444,1802,1595],{"class":458},[444,1804,487],{"class":450},[444,1806,1807,1809,1811,1813],{"class":446,"line":469},[444,1808,648],{"class":458},[444,1810,602],{"class":450},[444,1812,1609],{"class":454},[444,1814,707],{"class":458},[444,1816,1817,1819,1821],{"class":446,"line":475},[444,1818,1621],{"class":458},[444,1820,602],{"class":450},[444,1822,1626],{"class":450},[444,1824,1825,1827,1829,1831,1833,1835],{"class":446,"line":481},[444,1826,1640],{"class":458},[444,1828,602],{"class":450},[444,1830,1586],{"class":458},[444,1832,630],{"class":450},[444,1834,1649],{"class":458},[444,1836,487],{"class":450},[444,1838,1839],{"class":446,"line":490},[444,1840,494],{"emptyLinePlaceholder":493},[444,1842,1843,1846,1848,1851,1853,1855,1857,1860,1863],{"class":446,"line":497},[444,1844,1845],{"class":458},"    onSuccess",[444,1847,602],{"class":450},[444,1849,1850],{"class":458}," (_",[444,1852,612],{"class":450},[444,1854,1649],{"class":458},[444,1856,612],{"class":450},[444,1858,1859],{"class":458}," __) ",[444,1861,1862],{"class":575},"async",[444,1864,459],{"class":458},[444,1866,1867],{"class":446,"line":503},[444,1868,1869],{"class":465},"      // S'exécute pour un succès RÉEL (isOptimistic: false) uniquement après confirmation serveur\n",[444,1871,1872,1875,1877,1880,1882,1885,1887,1890,1893],{"class":446,"line":509},[444,1873,1874],{"class":458},"      context",[444,1876,422],{"class":450},[444,1878,1879],{"class":458},"qora",[444,1881,422],{"class":450},[444,1883,1884],{"class":584},"invalidate",[444,1886,1087],{"class":458},[444,1888,1889],{"class":608},"'todos'",[444,1891,1892],{"class":458},"])",[444,1894,681],{"class":450},[444,1896,1897,1899],{"class":446,"line":517},[444,1898,1505],{"class":458},[444,1900,487],{"class":450},[444,1902,1903,1905],{"class":446,"line":522},[444,1904,760],{"class":458},[444,1906,487],{"class":450},[444,1908,1909,1911,1913,1915,1917,1919,1921],{"class":446,"line":528},[444,1910,1273],{"class":458},[444,1912,602],{"class":450},[444,1914,1278],{"class":458},[444,1916,612],{"class":450},[444,1918,1283],{"class":458},[444,1920,612],{"class":450},[444,1922,1674],{"class":458},[444,1924,1925],{"class":446,"line":534},[444,1926,1927],{"class":465},"    // Vérifier isOptimistic sur l'état MutationSuccess\n",[444,1929,1930,1932,1935,1937,1939],{"class":446,"line":542},[444,1931,1298],{"class":565},[444,1933,1934],{"class":458}," isOptimistic ",[444,1936,572],{"class":450},[444,1938,1329],{"class":575},[444,1940,1332],{"class":458},[444,1942,1943,1946,1948,1950,1952,1955,1957,1960],{"class":446,"line":1431},[444,1944,1945],{"class":454},"      MutationSuccess",[444,1947,1132],{"class":458},[444,1949,602],{"class":450},[444,1951,566],{"class":565},[444,1953,1954],{"class":458}," isOptimistic) ",[444,1956,630],{"class":450},[444,1958,1959],{"class":458}," isOptimistic",[444,1961,487],{"class":450},[444,1963,1964,1967,1969],{"class":446,"line":1442},[444,1965,1966],{"class":458},"      _ ",[444,1968,630],{"class":450},[444,1970,1971],{"class":450}," false,\n",[444,1973,1974,1976],{"class":446,"line":1461},[444,1975,1505],{"class":458},[444,1977,681],{"class":450},[444,1979,1980],{"class":446,"line":1469},[444,1981,494],{"emptyLinePlaceholder":493},[444,1983,1984,1986,1988],{"class":446,"line":1477},[444,1985,1326],{"class":575},[444,1987,1416],{"class":454},[444,1989,707],{"class":458},[444,1991,1992,1995,1997],{"class":446,"line":1502},[444,1993,1994],{"class":458},"      children",[444,1996,602],{"class":450},[444,1998,1428],{"class":458},[444,2000,2001,2004],{"class":446,"line":1510},[444,2002,2003],{"class":575},"        if",[444,2005,2006],{"class":458}," (isOptimistic)\n",[444,2008,2009,2012,2015],{"class":446,"line":1518},[444,2010,2011],{"class":565},"          const",[444,2013,2014],{"class":454}," Row",[444,2016,707],{"class":458},[444,2018,2020,2023,2025],{"class":446,"line":2019},23,[444,2021,2022],{"class":458},"            children",[444,2024,602],{"class":450},[444,2026,1428],{"class":458},[444,2028,2030,2033,2035,2038,2040,2043,2045,2048,2050,2054,2056],{"class":446,"line":2029},24,[444,2031,2032],{"class":454},"              Icon",[444,2034,1132],{"class":458},[444,2036,2037],{"class":454},"Icons",[444,2039,422],{"class":450},[444,2041,2042],{"class":458},"schedule",[444,2044,612],{"class":450},[444,2046,2047],{"class":458}," size",[444,2049,602],{"class":450},[444,2051,2053],{"class":2052},"sbssI"," 14",[444,2055,678],{"class":458},[444,2057,487],{"class":450},[444,2059,2061,2064,2067,2069,2072,2074],{"class":446,"line":2060},25,[444,2062,2063],{"class":454},"              SizedBox",[444,2065,2066],{"class":458},"(width",[444,2068,602],{"class":450},[444,2070,2071],{"class":2052}," 4",[444,2073,678],{"class":458},[444,2075,487],{"class":450},[444,2077,2079,2082,2084,2087,2089],{"class":446,"line":2078},26,[444,2080,2081],{"class":454},"              Text",[444,2083,1132],{"class":458},[444,2085,2086],{"class":608},"'En file : synchronisation quand en ligne'",[444,2088,678],{"class":458},[444,2090,487],{"class":450},[444,2092,2094,2097],{"class":446,"line":2093},27,[444,2095,2096],{"class":458},"            ]",[444,2098,487],{"class":450},[444,2100,2102,2105],{"class":446,"line":2101},28,[444,2103,2104],{"class":458},"          )",[444,2106,487],{"class":450},[444,2108,2110,2113],{"class":446,"line":2109},29,[444,2111,2112],{"class":454},"        SubmitButton",[444,2114,707],{"class":458},[444,2116,2118,2121,2123,2125,2127,2130,2133,2136,2138,2140,2142,2144,2146],{"class":446,"line":2117},30,[444,2119,2120],{"class":458},"          onTap",[444,2122,602],{"class":450},[444,2124,1283],{"class":458},[444,2126,422],{"class":450},[444,2128,2129],{"class":458},"isPending ",[444,2131,2132],{"class":450},"?",[444,2134,2135],{"class":450}," null",[444,2137,1550],{"class":450},[444,2139,627],{"class":458},[444,2141,630],{"class":450},[444,2143,1697],{"class":584},[444,2145,1700],{"class":458},[444,2147,487],{"class":450},[444,2149,2151,2153],{"class":446,"line":2150},31,[444,2152,1472],{"class":458},[444,2154,487],{"class":450},[444,2156,2158,2161],{"class":446,"line":2157},32,[444,2159,2160],{"class":458},"      ]",[444,2162,487],{"class":450},[444,2164,2166,2168],{"class":446,"line":2165},33,[444,2167,753],{"class":458},[444,2169,681],{"class":450},[444,2171,2173,2175],{"class":446,"line":2172},34,[444,2174,1513],{"class":458},[444,2176,487],{"class":450},[444,2178,2180],{"class":446,"line":2179},35,[444,2181,1521],{"class":458},[547,2183,2185],{"id":2184},"accéder-directement-à-la-file","Accéder directement à la file",[434,2187,2190],{"className":436,"code":2188,"filename":2189,"language":439,"meta":440,"style":440},"// Combien de mutations attendent la relecture ?\nfinal count = context.qora.offlineMutationQueue.length;\n\n// Inspecter les mutations en attente\nfor (final pending in context.qora.offlineMutationQueue.snapshot) {\n  print('${pending.mutatorId} mis en file à ${pending.enqueuedAt}');\n}\n\n// Déclencher manuellement une relecture (normalement automatique à la reconnexion)\nfinal result = await context.qora.offlineMutationQueue.replay();\nprint('Succès : ${result.succeeded}, Échecs : ${result.failed}');\n","lib/ui/offline_indicator.dart",[386,2191,2192,2197,2225,2229,2234,2265,2310,2314,2318,2323,2353],{"__ignoreMap":440},[444,2193,2194],{"class":446,"line":447},[444,2195,2196],{"class":465},"// Combien de mutations attendent la relecture ?\n",[444,2198,2199,2201,2204,2206,2209,2211,2213,2215,2218,2220,2223],{"class":446,"line":462},[444,2200,566],{"class":565},[444,2202,2203],{"class":458}," count ",[444,2205,572],{"class":450},[444,2207,2208],{"class":458}," context",[444,2210,422],{"class":450},[444,2212,1879],{"class":458},[444,2214,422],{"class":450},[444,2216,2217],{"class":458},"offlineMutationQueue",[444,2219,422],{"class":450},[444,2221,2222],{"class":458},"length",[444,2224,681],{"class":450},[444,2226,2227],{"class":446,"line":469},[444,2228,494],{"emptyLinePlaceholder":493},[444,2230,2231],{"class":446,"line":475},[444,2232,2233],{"class":465},"// Inspecter les mutations en attente\n",[444,2235,2236,2239,2242,2244,2247,2250,2252,2254,2256,2258,2260,2262],{"class":446,"line":481},[444,2237,2238],{"class":575},"for",[444,2240,2241],{"class":458}," (",[444,2243,566],{"class":565},[444,2245,2246],{"class":458}," pending ",[444,2248,2249],{"class":575},"in",[444,2251,2208],{"class":458},[444,2253,422],{"class":450},[444,2255,1879],{"class":458},[444,2257,422],{"class":450},[444,2259,2217],{"class":458},[444,2261,422],{"class":450},[444,2263,2264],{"class":458},"snapshot) {\n",[444,2266,2267,2270,2272,2275,2278,2282,2284,2287,2290,2293,2295,2297,2299,2302,2304,2306,2308],{"class":446,"line":490},[444,2268,2269],{"class":584},"  print",[444,2271,1132],{"class":458},[444,2273,2274],{"class":608},"'",[444,2276,2277],{"class":458},"${",[444,2279,2281],{"class":2280},"sHdIc","pending",[444,2283,422],{"class":458},[444,2285,2286],{"class":2280},"mutatorId",[444,2288,2289],{"class":458},"}",[444,2291,2292],{"class":608}," mis en file à ",[444,2294,2277],{"class":458},[444,2296,2281],{"class":2280},[444,2298,422],{"class":458},[444,2300,2301],{"class":2280},"enqueuedAt",[444,2303,2289],{"class":458},[444,2305,2274],{"class":608},[444,2307,678],{"class":458},[444,2309,681],{"class":450},[444,2311,2312],{"class":446,"line":497},[444,2313,545],{"class":458},[444,2315,2316],{"class":446,"line":503},[444,2317,494],{"emptyLinePlaceholder":493},[444,2319,2320],{"class":446,"line":509},[444,2321,2322],{"class":465},"// Déclencher manuellement une relecture (normalement automatique à la reconnexion)\n",[444,2324,2325,2327,2330,2332,2334,2336,2338,2340,2342,2344,2346,2349,2351],{"class":446,"line":517},[444,2326,566],{"class":565},[444,2328,2329],{"class":458}," result ",[444,2331,572],{"class":450},[444,2333,576],{"class":575},[444,2335,2208],{"class":458},[444,2337,422],{"class":450},[444,2339,1879],{"class":458},[444,2341,422],{"class":450},[444,2343,2217],{"class":458},[444,2345,422],{"class":450},[444,2347,2348],{"class":584},"replay",[444,2350,1355],{"class":458},[444,2352,681],{"class":450},[444,2354,2355,2358,2360,2363,2365,2368,2370,2373,2375,2378,2380,2382,2384,2387,2389,2391,2393],{"class":446,"line":522},[444,2356,2357],{"class":584},"print",[444,2359,1132],{"class":458},[444,2361,2362],{"class":608},"'Succès : ",[444,2364,2277],{"class":458},[444,2366,2367],{"class":2280},"result",[444,2369,422],{"class":458},[444,2371,2372],{"class":2280},"succeeded",[444,2374,2289],{"class":458},[444,2376,2377],{"class":608},", Échecs : ",[444,2379,2277],{"class":458},[444,2381,2367],{"class":2280},[444,2383,422],{"class":458},[444,2385,2386],{"class":2280},"failed",[444,2388,2289],{"class":458},[444,2390,2274],{"class":608},[444,2392,678],{"class":458},[444,2394,681],{"class":450},[547,2396,2398],{"id":2397},"quand-une-mutation-rejouée-échoue","Quand une mutation rejouée échoue",[348,2400,2401,2402,2405,2406,2409],{},"Chaque mutation en file est envoyée une fois, dans l'ordre, par le même chemin qu'un appel en ligne. Quand le serveur en rejette une, ",[386,2403,2404],{},"onError"," reçoit le contexte renvoyé par ",[386,2407,2408],{},"onMutate"," au moment de la mise en file : le rollback écrit pour le cas en ligne couvre donc aussi le cas hors-ligne. Le rejeu continue ensuite avec la mutation suivante.",[348,2411,2412,2413,2415],{},"Un rejeu en échec n'est pas remis en file. Signalez-le depuis ",[386,2414,2404],{}," (un snackbar, un bouton réessayer) plutôt que de compter sur la prochaine reconnexion.",[348,2417,2418,2419,2421],{},"Gardez les mutations en file indépendantes quand c'est possible. Quand l'une dépend d'une autre (créer un todo, puis le cocher), la seconde échoue si la première a été rejetée, et son propre ",[386,2420,2404],{}," l'annule.",[352,2423],{},[355,2425,2427],{"id":2426},"reconnectstrategy-prévention-du-thundering-herd","ReconnectStrategy : prévention du thundering herd",[348,2429,2430,2431,2434],{},"Quand la connectivité revient et que des dizaines de requêtes sont suspendues, les rejouer simultanément inonde le serveur. ",[386,2432,2433],{},"ReconnectStrategy"," introduit une concurrence contrôlée et du jitter :",[434,2436,2438],{"className":436,"code":2437,"filename":438,"language":439,"meta":440,"style":440},"final client = QoraClient(\n  config: QoraClientConfig(\n    reconnectStrategy: const ReconnectStrategy(\n      maxConcurrent: 5,                         // Rejouer 5 requêtes à la fois\n      jitter: Duration(milliseconds: 200),      // Délai aléatoire entre les lots\n    ),\n  ),\n);\n",[386,2439,2440,2452,2462,2476,2491,2516,2522,2528],{"__ignoreMap":440},[444,2441,2442,2444,2446,2448,2450],{"class":446,"line":447},[444,2443,566],{"class":565},[444,2445,699],{"class":458},[444,2447,572],{"class":450},[444,2449,704],{"class":454},[444,2451,707],{"class":458},[444,2453,2454,2456,2458,2460],{"class":446,"line":462},[444,2455,712],{"class":458},[444,2457,602],{"class":450},[444,2459,719],{"class":454},[444,2461,707],{"class":458},[444,2463,2464,2467,2469,2471,2474],{"class":446,"line":469},[444,2465,2466],{"class":458},"    reconnectStrategy",[444,2468,602],{"class":450},[444,2470,653],{"class":565},[444,2472,2473],{"class":454}," ReconnectStrategy",[444,2475,707],{"class":458},[444,2477,2478,2481,2483,2486,2488],{"class":446,"line":475},[444,2479,2480],{"class":458},"      maxConcurrent",[444,2482,602],{"class":450},[444,2484,2485],{"class":2052}," 5",[444,2487,612],{"class":450},[444,2489,2490],{"class":465},"                         // Rejouer 5 requêtes à la fois\n",[444,2492,2493,2496,2498,2501,2504,2506,2509,2511,2513],{"class":446,"line":481},[444,2494,2495],{"class":458},"      jitter",[444,2497,602],{"class":450},[444,2499,2500],{"class":454}," Duration",[444,2502,2503],{"class":458},"(milliseconds",[444,2505,602],{"class":450},[444,2507,2508],{"class":2052}," 200",[444,2510,678],{"class":458},[444,2512,612],{"class":450},[444,2514,2515],{"class":465},"      // Délai aléatoire entre les lots\n",[444,2517,2518,2520],{"class":446,"line":490},[444,2519,753],{"class":458},[444,2521,487],{"class":450},[444,2523,2524,2526],{"class":446,"line":497},[444,2525,760],{"class":458},[444,2527,487],{"class":450},[444,2529,2530,2532],{"class":446,"line":503},[444,2531,678],{"class":458},[444,2533,681],{"class":450},[547,2535,2537],{"id":2536},"constructeurs-nommés","Constructeurs nommés",[434,2539,2541],{"className":436,"code":2540,"language":439,"meta":440,"style":440},"// Défaut : 5 concurrent, 100 ms jitter\nconst ReconnectStrategy()\n\n// Toutes les requêtes rejouées simultanément (utile pour les tests)\nReconnectStrategy.instant()\n\n// Conservateur : 2 concurrent, 500 ms jitter\nReconnectStrategy.conservative()\n",[386,2542,2543,2548,2556,2560,2565,2576,2580,2585],{"__ignoreMap":440},[444,2544,2545],{"class":446,"line":447},[444,2546,2547],{"class":465},"// Défaut : 5 concurrent, 100 ms jitter\n",[444,2549,2550,2552,2554],{"class":446,"line":462},[444,2551,1451],{"class":565},[444,2553,2473],{"class":454},[444,2555,1383],{"class":458},[444,2557,2558],{"class":446,"line":469},[444,2559,494],{"emptyLinePlaceholder":493},[444,2561,2562],{"class":446,"line":475},[444,2563,2564],{"class":465},"// Toutes les requêtes rejouées simultanément (utile pour les tests)\n",[444,2566,2567,2569,2571,2574],{"class":446,"line":481},[444,2568,2433],{"class":454},[444,2570,422],{"class":450},[444,2572,2573],{"class":584},"instant",[444,2575,1383],{"class":458},[444,2577,2578],{"class":446,"line":490},[444,2579,494],{"emptyLinePlaceholder":493},[444,2581,2582],{"class":446,"line":497},[444,2583,2584],{"class":465},"// Conservateur : 2 concurrent, 500 ms jitter\n",[444,2586,2587,2589,2591,2594],{"class":446,"line":503},[444,2588,2433],{"class":454},[444,2590,422],{"class":450},[444,2592,2593],{"class":584},"conservative",[444,2595,1383],{"class":458},[352,2597],{},[355,2599,2601],{"id":2600},"configuration-flutter","Configuration Flutter",[547,2603,2605,2606],{"id":2604},"_1-installer-connectivity_plus","1. Installer ",[386,2607,2608],{},"connectivity_plus",[434,2610,2615],{"className":2611,"code":2612,"filename":2613,"language":2614,"meta":440,"style":440},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependencies:\n  connectivity_plus: ^6.0.0\n","pubspec.yaml","yaml",[386,2616,2617,2625],{"__ignoreMap":440},[444,2618,2619,2623],{"class":446,"line":447},[444,2620,2622],{"class":2621},"swJcz","dependencies",[444,2624,1124],{"class":450},[444,2626,2627,2630,2632],{"class":446,"line":462},[444,2628,2629],{"class":2621},"  connectivity_plus",[444,2631,602],{"class":450},[444,2633,2634],{"class":608}," ^6.0.0\n",[547,2636,2638,2639],{"id":2637},"_2-câbler-qorascope","2. Câbler ",[386,2640,103],{},[434,2642,2645],{"className":436,"code":2643,"filename":2644,"language":439,"meta":440,"style":440},"import 'package:flutter/foundation.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nvoid main() {\n  final client = QoraClient(\n    config: const QoraClientConfig(\n      defaultOptions: QoraOptions(\n        staleTime: Duration(minutes: 5),\n        networkMode: NetworkMode.online,\n      ),\n      reconnectStrategy: ReconnectStrategy(\n        maxConcurrent: 5,\n        jitter: Duration(milliseconds: 100),\n      ),\n      debugMode: kDebugMode,\n    ),\n  );\n\n  runApp(\n    QoraScope(\n      client: client,\n      lifecycleManager: FlutterLifecycleManager(qoraClient: client),\n      // Pas de référence QoraClient requise : fournisseur de signal pur\n      connectivityManager: FlutterConnectivityManager(),\n      child: const MyApp(),\n    ),\n  );\n}\n","lib/main.dart",[386,2646,2647,2657,2666,2670,2680,2693,2706,2717,2737,2752,2759,2770,2781,2801,2807,2819,2825,2831,2835,2842,2849,2860,2880,2885,2899,2915,2921,2927],{"__ignoreMap":440},[444,2648,2649,2652,2655],{"class":446,"line":447},[444,2650,2651],{"class":2052},"import",[444,2653,2654],{"class":608}," 'package:flutter/foundation.dart'",[444,2656,681],{"class":450},[444,2658,2659,2661,2664],{"class":446,"line":462},[444,2660,2651],{"class":2052},[444,2662,2663],{"class":608}," 'package:qora_flutter/qora_flutter.dart'",[444,2665,681],{"class":450},[444,2667,2668],{"class":446,"line":469},[444,2669,494],{"emptyLinePlaceholder":493},[444,2671,2672,2674,2677],{"class":446,"line":475},[444,2673,1565],{"class":565},[444,2675,2676],{"class":584}," main",[444,2678,2679],{"class":458},"() {\n",[444,2681,2682,2685,2687,2689,2691],{"class":446,"line":481},[444,2683,2684],{"class":565},"  final",[444,2686,699],{"class":458},[444,2688,572],{"class":450},[444,2690,704],{"class":454},[444,2692,707],{"class":458},[444,2694,2695,2698,2700,2702,2704],{"class":446,"line":490},[444,2696,2697],{"class":458},"    config",[444,2699,602],{"class":450},[444,2701,653],{"class":565},[444,2703,719],{"class":454},[444,2705,707],{"class":458},[444,2707,2708,2711,2713,2715],{"class":446,"line":497},[444,2709,2710],{"class":458},"      defaultOptions",[444,2712,602],{"class":450},[444,2714,656],{"class":454},[444,2716,707],{"class":458},[444,2718,2719,2722,2724,2726,2729,2731,2733,2735],{"class":446,"line":503},[444,2720,2721],{"class":458},"        staleTime",[444,2723,602],{"class":450},[444,2725,2500],{"class":454},[444,2727,2728],{"class":458},"(minutes",[444,2730,602],{"class":450},[444,2732,2485],{"class":2052},[444,2734,678],{"class":458},[444,2736,487],{"class":450},[444,2738,2739,2742,2744,2746,2748,2750],{"class":446,"line":509},[444,2740,2741],{"class":458},"        networkMode",[444,2743,602],{"class":450},[444,2745,455],{"class":454},[444,2747,422],{"class":450},[444,2749,746],{"class":458},[444,2751,487],{"class":450},[444,2753,2754,2757],{"class":446,"line":517},[444,2755,2756],{"class":458},"      )",[444,2758,487],{"class":450},[444,2760,2761,2764,2766,2768],{"class":446,"line":522},[444,2762,2763],{"class":458},"      reconnectStrategy",[444,2765,602],{"class":450},[444,2767,2473],{"class":454},[444,2769,707],{"class":458},[444,2771,2772,2775,2777,2779],{"class":446,"line":528},[444,2773,2774],{"class":458},"        maxConcurrent",[444,2776,602],{"class":450},[444,2778,2485],{"class":2052},[444,2780,487],{"class":450},[444,2782,2783,2786,2788,2790,2792,2794,2797,2799],{"class":446,"line":534},[444,2784,2785],{"class":458},"        jitter",[444,2787,602],{"class":450},[444,2789,2500],{"class":454},[444,2791,2503],{"class":458},[444,2793,602],{"class":450},[444,2795,2796],{"class":2052}," 100",[444,2798,678],{"class":458},[444,2800,487],{"class":450},[444,2802,2803,2805],{"class":446,"line":542},[444,2804,2756],{"class":458},[444,2806,487],{"class":450},[444,2808,2809,2812,2814,2817],{"class":446,"line":1431},[444,2810,2811],{"class":458},"      debugMode",[444,2813,602],{"class":450},[444,2815,2816],{"class":458}," kDebugMode",[444,2818,487],{"class":450},[444,2820,2821,2823],{"class":446,"line":1442},[444,2822,753],{"class":458},[444,2824,487],{"class":450},[444,2826,2827,2829],{"class":446,"line":1461},[444,2828,760],{"class":458},[444,2830,681],{"class":450},[444,2832,2833],{"class":446,"line":1469},[444,2834,494],{"emptyLinePlaceholder":493},[444,2836,2837,2840],{"class":446,"line":1477},[444,2838,2839],{"class":584},"  runApp",[444,2841,707],{"class":458},[444,2843,2844,2847],{"class":446,"line":1502},[444,2845,2846],{"class":454},"    QoraScope",[444,2848,707],{"class":458},[444,2850,2851,2854,2856,2858],{"class":446,"line":1510},[444,2852,2853],{"class":458},"      client",[444,2855,602],{"class":450},[444,2857,579],{"class":458},[444,2859,487],{"class":450},[444,2861,2862,2865,2867,2870,2873,2875,2878],{"class":446,"line":1518},[444,2863,2864],{"class":458},"      lifecycleManager",[444,2866,602],{"class":450},[444,2868,2869],{"class":454}," FlutterLifecycleManager",[444,2871,2872],{"class":458},"(qoraClient",[444,2874,602],{"class":450},[444,2876,2877],{"class":458}," client)",[444,2879,487],{"class":450},[444,2881,2882],{"class":446,"line":2019},[444,2883,2884],{"class":465},"      // Pas de référence QoraClient requise : fournisseur de signal pur\n",[444,2886,2887,2890,2892,2895,2897],{"class":446,"line":2029},[444,2888,2889],{"class":458},"      connectivityManager",[444,2891,602],{"class":450},[444,2893,2894],{"class":454}," FlutterConnectivityManager",[444,2896,1355],{"class":458},[444,2898,487],{"class":450},[444,2900,2901,2904,2906,2908,2911,2913],{"class":446,"line":2060},[444,2902,2903],{"class":458},"      child",[444,2905,602],{"class":450},[444,2907,653],{"class":565},[444,2909,2910],{"class":454}," MyApp",[444,2912,1355],{"class":458},[444,2914,487],{"class":450},[444,2916,2917,2919],{"class":446,"line":2078},[444,2918,753],{"class":458},[444,2920,487],{"class":450},[444,2922,2923,2925],{"class":446,"line":2093},[444,2924,760],{"class":458},[444,2926,681],{"class":450},[444,2928,2929],{"class":446,"line":2101},[444,2930,545],{"class":458},[547,2932,2934,2935],{"id":2933},"_3-ajouter-networkstatusindicator","3. Ajouter ",[386,2936,2937],{},"NetworkStatusIndicator",[348,2939,2940,2941,2943],{},"Encapsuler l'application (ou tout sous-arbre) avec ",[386,2942,2937],{}," pour afficher une bannière hors-ligne automatiquement :",[434,2945,2947],{"className":436,"code":2946,"filename":2644,"language":439,"meta":440,"style":440},"QoraScope(\n  client: client,\n  connectivityManager: FlutterConnectivityManager(),\n  child: NetworkStatusIndicator(\n    child: const MyApp(),\n  ),\n)\n",[386,2948,2949,2955,2966,2979,2991,3006,3012],{"__ignoreMap":440},[444,2950,2951,2953],{"class":446,"line":447},[444,2952,103],{"class":454},[444,2954,707],{"class":458},[444,2956,2957,2960,2962,2964],{"class":446,"line":462},[444,2958,2959],{"class":458},"  client",[444,2961,602],{"class":450},[444,2963,579],{"class":458},[444,2965,487],{"class":450},[444,2967,2968,2971,2973,2975,2977],{"class":446,"line":469},[444,2969,2970],{"class":458},"  connectivityManager",[444,2972,602],{"class":450},[444,2974,2894],{"class":454},[444,2976,1355],{"class":458},[444,2978,487],{"class":450},[444,2980,2981,2984,2986,2989],{"class":446,"line":475},[444,2982,2983],{"class":458},"  child",[444,2985,602],{"class":450},[444,2987,2988],{"class":454}," NetworkStatusIndicator",[444,2990,707],{"class":458},[444,2992,2993,2996,2998,3000,3002,3004],{"class":446,"line":481},[444,2994,2995],{"class":458},"    child",[444,2997,602],{"class":450},[444,2999,653],{"class":565},[444,3001,2910],{"class":454},[444,3003,1355],{"class":458},[444,3005,487],{"class":450},[444,3007,3008,3010],{"class":446,"line":490},[444,3009,760],{"class":458},[444,3011,487],{"class":450},[444,3013,3014],{"class":446,"line":497},[444,3015,1521],{"class":458},[348,3017,3018,3019,3022],{},"Affiche une fine barre sombre en bas de l'écran indiquant \"Mode hors-ligne\" quand ",[386,3020,3021],{},"NetworkStatus.offline"," est détecté.",[3024,3025,3027],"h4",{"id":3026},"bannière-hors-ligne-personnalisée","Bannière hors-ligne personnalisée",[434,3029,3031],{"className":436,"code":3030,"filename":2644,"language":439,"meta":440,"style":440},"NetworkStatusIndicator(\n  offlineBanner: (context) => Container(\n    color: Colors.orange,\n    padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),\n    child: const Row(\n      mainAxisAlignment: MainAxisAlignment.center,\n      children: [\n        Icon(Icons.wifi_off, color: Colors.white, size: 16),\n        SizedBox(width: 8),\n        Text('Pas de connexion', style: TextStyle(color: Colors.white)),\n      ],\n    ),\n  ),\n  child: const MyApp(),\n)\n",[386,3032,3033,3039,3056,3073,3112,3124,3141,3149,3189,3204,3238,3244,3250,3256,3270],{"__ignoreMap":440},[444,3034,3035,3037],{"class":446,"line":447},[444,3036,2937],{"class":454},[444,3038,707],{"class":458},[444,3040,3041,3044,3046,3049,3051,3054],{"class":446,"line":462},[444,3042,3043],{"class":458},"  offlineBanner",[444,3045,602],{"class":450},[444,3047,3048],{"class":458}," (context) ",[444,3050,630],{"class":450},[444,3052,3053],{"class":454}," Container",[444,3055,707],{"class":458},[444,3057,3058,3061,3063,3066,3068,3071],{"class":446,"line":469},[444,3059,3060],{"class":458},"    color",[444,3062,602],{"class":450},[444,3064,3065],{"class":454}," Colors",[444,3067,422],{"class":450},[444,3069,3070],{"class":458},"orange",[444,3072,487],{"class":450},[444,3074,3075,3078,3080,3082,3085,3087,3090,3093,3095,3098,3100,3103,3105,3108,3110],{"class":446,"line":475},[444,3076,3077],{"class":458},"    padding",[444,3079,602],{"class":450},[444,3081,653],{"class":565},[444,3083,3084],{"class":454}," EdgeInsets",[444,3086,422],{"class":450},[444,3088,3089],{"class":584},"symmetric",[444,3091,3092],{"class":458},"(vertical",[444,3094,602],{"class":450},[444,3096,3097],{"class":2052}," 8",[444,3099,612],{"class":450},[444,3101,3102],{"class":458}," horizontal",[444,3104,602],{"class":450},[444,3106,3107],{"class":2052}," 16",[444,3109,678],{"class":458},[444,3111,487],{"class":450},[444,3113,3114,3116,3118,3120,3122],{"class":446,"line":481},[444,3115,2995],{"class":458},[444,3117,602],{"class":450},[444,3119,653],{"class":565},[444,3121,2014],{"class":454},[444,3123,707],{"class":458},[444,3125,3126,3129,3131,3134,3136,3139],{"class":446,"line":490},[444,3127,3128],{"class":458},"      mainAxisAlignment",[444,3130,602],{"class":450},[444,3132,3133],{"class":454}," MainAxisAlignment",[444,3135,422],{"class":450},[444,3137,3138],{"class":458},"center",[444,3140,487],{"class":450},[444,3142,3143,3145,3147],{"class":446,"line":497},[444,3144,1994],{"class":458},[444,3146,602],{"class":450},[444,3148,1428],{"class":458},[444,3150,3151,3154,3156,3158,3160,3163,3165,3168,3170,3172,3174,3177,3179,3181,3183,3185,3187],{"class":446,"line":503},[444,3152,3153],{"class":454},"        Icon",[444,3155,1132],{"class":458},[444,3157,2037],{"class":454},[444,3159,422],{"class":450},[444,3161,3162],{"class":458},"wifi_off",[444,3164,612],{"class":450},[444,3166,3167],{"class":458}," color",[444,3169,602],{"class":450},[444,3171,3065],{"class":454},[444,3173,422],{"class":450},[444,3175,3176],{"class":458},"white",[444,3178,612],{"class":450},[444,3180,2047],{"class":458},[444,3182,602],{"class":450},[444,3184,3107],{"class":2052},[444,3186,678],{"class":458},[444,3188,487],{"class":450},[444,3190,3191,3194,3196,3198,3200,3202],{"class":446,"line":509},[444,3192,3193],{"class":454},"        SizedBox",[444,3195,2066],{"class":458},[444,3197,602],{"class":450},[444,3199,3097],{"class":2052},[444,3201,678],{"class":458},[444,3203,487],{"class":450},[444,3205,3206,3209,3211,3214,3216,3219,3221,3224,3227,3229,3231,3233,3236],{"class":446,"line":517},[444,3207,3208],{"class":454},"        Text",[444,3210,1132],{"class":458},[444,3212,3213],{"class":608},"'Pas de connexion'",[444,3215,612],{"class":450},[444,3217,3218],{"class":458}," style",[444,3220,602],{"class":450},[444,3222,3223],{"class":454}," TextStyle",[444,3225,3226],{"class":458},"(color",[444,3228,602],{"class":450},[444,3230,3065],{"class":454},[444,3232,422],{"class":450},[444,3234,3235],{"class":458},"white))",[444,3237,487],{"class":450},[444,3239,3240,3242],{"class":446,"line":522},[444,3241,2160],{"class":458},[444,3243,487],{"class":450},[444,3245,3246,3248],{"class":446,"line":528},[444,3247,753],{"class":458},[444,3249,487],{"class":450},[444,3251,3252,3254],{"class":446,"line":534},[444,3253,760],{"class":458},[444,3255,487],{"class":450},[444,3257,3258,3260,3262,3264,3266,3268],{"class":446,"line":542},[444,3259,2983],{"class":458},[444,3261,602],{"class":450},[444,3263,653],{"class":565},[444,3265,2910],{"class":454},[444,3267,1355],{"class":458},[444,3269,487],{"class":450},[444,3271,3272],{"class":446,"line":1431},[444,3273,1521],{"class":458},[3024,3275,3277],{"id":3276},"contrôle-total-via-builder","Contrôle total via builder",[348,3279,844,3280,3283,3284,3287,3288,3291],{},[386,3281,3282],{},"builder"," quand une réaction à ",[386,3285,3286],{},"NetworkStatus.online"," ou ",[386,3289,3290],{},"NetworkStatus.unknown"," est nécessaire :",[434,3293,3295],{"className":436,"code":3294,"filename":2644,"language":439,"meta":440,"style":440},"NetworkStatusIndicator(\n  builder: (context, status, child) {\n    return Stack(\n      children: [\n        child!,\n        if (status == NetworkStatus.offline)\n          const Positioned(\n            bottom: 0, left: 0, right: 0,\n            child: MyOfflineBanner(),\n          ),\n        if (status == NetworkStatus.unknown)\n          const Positioned(\n            bottom: 0, left: 0, right: 0,\n            child: MyCheckingBanner(),\n          ),\n      ],\n    );\n  },\n  child: const MyApp(),\n)\n",[386,3296,3297,3303,3321,3330,3338,3346,3363,3372,3402,3416,3422,3437,3445,3471,3484,3490,3496,3502,3508,3522],{"__ignoreMap":440},[444,3298,3299,3301],{"class":446,"line":447},[444,3300,2937],{"class":454},[444,3302,707],{"class":458},[444,3304,3305,3307,3309,3311,3313,3316,3318],{"class":446,"line":462},[444,3306,1273],{"class":458},[444,3308,602],{"class":450},[444,3310,1278],{"class":458},[444,3312,612],{"class":450},[444,3314,3315],{"class":458}," status",[444,3317,612],{"class":450},[444,3319,3320],{"class":458}," child) {\n",[444,3322,3323,3325,3328],{"class":446,"line":469},[444,3324,1326],{"class":575},[444,3326,3327],{"class":454}," Stack",[444,3329,707],{"class":458},[444,3331,3332,3334,3336],{"class":446,"line":475},[444,3333,1994],{"class":458},[444,3335,602],{"class":450},[444,3337,1428],{"class":458},[444,3339,3340,3343],{"class":446,"line":481},[444,3341,3342],{"class":458},"        child",[444,3344,3345],{"class":450},"!,\n",[444,3347,3348,3350,3353,3355,3358,3360],{"class":446,"line":490},[444,3349,2003],{"class":575},[444,3351,3352],{"class":458}," (status ",[444,3354,1309],{"class":450},[444,3356,3357],{"class":454}," NetworkStatus",[444,3359,422],{"class":450},[444,3361,3362],{"class":458},"offline)\n",[444,3364,3365,3367,3370],{"class":446,"line":497},[444,3366,2011],{"class":565},[444,3368,3369],{"class":454}," Positioned",[444,3371,707],{"class":458},[444,3373,3374,3377,3379,3382,3384,3387,3389,3391,3393,3396,3398,3400],{"class":446,"line":503},[444,3375,3376],{"class":458},"            bottom",[444,3378,602],{"class":450},[444,3380,3381],{"class":2052}," 0",[444,3383,612],{"class":450},[444,3385,3386],{"class":458}," left",[444,3388,602],{"class":450},[444,3390,3381],{"class":2052},[444,3392,612],{"class":450},[444,3394,3395],{"class":458}," right",[444,3397,602],{"class":450},[444,3399,3381],{"class":2052},[444,3401,487],{"class":450},[444,3403,3404,3407,3409,3412,3414],{"class":446,"line":509},[444,3405,3406],{"class":458},"            child",[444,3408,602],{"class":450},[444,3410,3411],{"class":454}," MyOfflineBanner",[444,3413,1355],{"class":458},[444,3415,487],{"class":450},[444,3417,3418,3420],{"class":446,"line":517},[444,3419,2104],{"class":458},[444,3421,487],{"class":450},[444,3423,3424,3426,3428,3430,3432,3434],{"class":446,"line":522},[444,3425,2003],{"class":575},[444,3427,3352],{"class":458},[444,3429,1309],{"class":450},[444,3431,3357],{"class":454},[444,3433,422],{"class":450},[444,3435,3436],{"class":458},"unknown)\n",[444,3438,3439,3441,3443],{"class":446,"line":528},[444,3440,2011],{"class":565},[444,3442,3369],{"class":454},[444,3444,707],{"class":458},[444,3446,3447,3449,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469],{"class":446,"line":534},[444,3448,3376],{"class":458},[444,3450,602],{"class":450},[444,3452,3381],{"class":2052},[444,3454,612],{"class":450},[444,3456,3386],{"class":458},[444,3458,602],{"class":450},[444,3460,3381],{"class":2052},[444,3462,612],{"class":450},[444,3464,3395],{"class":458},[444,3466,602],{"class":450},[444,3468,3381],{"class":2052},[444,3470,487],{"class":450},[444,3472,3473,3475,3477,3480,3482],{"class":446,"line":542},[444,3474,3406],{"class":458},[444,3476,602],{"class":450},[444,3478,3479],{"class":454}," MyCheckingBanner",[444,3481,1355],{"class":458},[444,3483,487],{"class":450},[444,3485,3486,3488],{"class":446,"line":1431},[444,3487,2104],{"class":458},[444,3489,487],{"class":450},[444,3491,3492,3494],{"class":446,"line":1442},[444,3493,2160],{"class":458},[444,3495,487],{"class":450},[444,3497,3498,3500],{"class":446,"line":1461},[444,3499,753],{"class":458},[444,3501,681],{"class":450},[444,3503,3504,3506],{"class":446,"line":1469},[444,3505,1513],{"class":458},[444,3507,487],{"class":450},[444,3509,3510,3512,3514,3516,3518,3520],{"class":446,"line":1477},[444,3511,2983],{"class":458},[444,3513,602],{"class":450},[444,3515,653],{"class":565},[444,3517,2910],{"class":454},[444,3519,1355],{"class":458},[444,3521,487],{"class":450},[444,3523,3524],{"class":446,"line":1502},[444,3525,1521],{"class":458},[352,3527],{},[355,3529,3531],{"id":3530},"exemple-complet-application-todo-offline-first","Exemple complet : application Todo offline-first",[434,3533,3535],{"className":436,"code":3534,"filename":1554,"language":439,"meta":440,"style":440},"import 'package:flutter/material.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nclass TodoScreen extends StatelessWidget {\n  const TodoScreen({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: QoraBuilder\u003CList\u003CTodo>>(\n        queryKey: const ['todos'],\n        fetcher: api.getTodos,\n        builder: (context, state, fetchStatus) {\n          // En pause → hors-ligne, en attente de charger pour la première fois\n          if (fetchStatus == FetchStatus.paused && state.dataOrNull == null) {\n            return const Center(child: Text('Hors-ligne : connectez-vous pour charger les todos'));\n          }\n\n          return switch (state) {\n            Initial()  => const SizedBox.shrink(),\n            Loading()  => const CircularProgressIndicator(),\n            Failure(:final error) => ErrorScreen(error),\n            Success(:final data)  => TodoList(\n                todos: data,\n                isRefreshing: fetchStatus == FetchStatus.fetching,\n                isStale: fetchStatus == FetchStatus.paused,\n              ),\n          };\n        },\n      ),\n      floatingActionButton: QoraMutationBuilder\u003Cvoid, String, void>(\n        mutator: (title) => api.createTodo(title),\n        options: MutationOptions(\n          offlineQueue: true,\n          optimisticResponse: (title) => null,\n          onSuccess: (_, __, ___) async =>\n              context.qora.invalidate(const ['todos']),\n        ),\n        builder: (context, state, mutate) {\n          final isOptimistic = state is MutationSuccess && state.isOptimistic;\n          return FloatingActionButton.extended(\n            onPressed: state.isPending ? null : () => mutate('Nouveau Todo'),\n            icon: isOptimistic\n                ? const Icon(Icons.schedule)\n                : const Icon(Icons.add),\n            label: Text(\n              isOptimistic ? 'En file hors-ligne' : 'Ajouter un Todo',\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n",[386,3536,3537,3546,3554,3558,3574,3591,3595,3600,3616,3625,3647,3665,3681,3698,3703,3737,3765,3770,3774,3783,3804,3821,3843,3864,3876,3895,3914,3921,3928,3935,3941,3966,3989,4000,4009,4023,4048,4074,4081,4098,4128,4143,4178,4189,4209,4230,4242,4260,4268,4275,4282,4289,4296,4301],{"__ignoreMap":440},[444,3538,3539,3541,3544],{"class":446,"line":447},[444,3540,2651],{"class":2052},[444,3542,3543],{"class":608}," 'package:flutter/material.dart'",[444,3545,681],{"class":450},[444,3547,3548,3550,3552],{"class":446,"line":462},[444,3549,2651],{"class":2052},[444,3551,2663],{"class":608},[444,3553,681],{"class":450},[444,3555,3556],{"class":446,"line":469},[444,3557,494],{"emptyLinePlaceholder":493},[444,3559,3560,3563,3566,3569,3572],{"class":446,"line":475},[444,3561,3562],{"class":450},"class",[444,3564,3565],{"class":454}," TodoScreen",[444,3567,3568],{"class":450}," extends",[444,3570,3571],{"class":454}," StatelessWidget",[444,3573,459],{"class":458},[444,3575,3576,3579,3581,3584,3586,3589],{"class":446,"line":481},[444,3577,3578],{"class":565},"  const",[444,3580,3565],{"class":454},[444,3582,3583],{"class":458},"({super",[444,3585,422],{"class":450},[444,3587,3588],{"class":458},"key})",[444,3590,681],{"class":450},[444,3592,3593],{"class":446,"line":490},[444,3594,494],{"emptyLinePlaceholder":493},[444,3596,3597],{"class":446,"line":497},[444,3598,3599],{"class":565},"  @override\n",[444,3601,3602,3605,3608,3610,3613],{"class":446,"line":503},[444,3603,3604],{"class":454},"  Widget",[444,3606,3607],{"class":584}," build",[444,3609,1132],{"class":458},[444,3611,3612],{"class":454},"BuildContext",[444,3614,3615],{"class":458}," context) {\n",[444,3617,3618,3620,3623],{"class":446,"line":509},[444,3619,1326],{"class":575},[444,3621,3622],{"class":454}," Scaffold",[444,3624,707],{"class":458},[444,3626,3627,3630,3632,3635,3637,3640,3642,3644],{"class":446,"line":517},[444,3628,3629],{"class":458},"      body",[444,3631,602],{"class":450},[444,3633,3634],{"class":454}," QoraBuilder",[444,3636,588],{"class":458},[444,3638,3639],{"class":454},"List",[444,3641,588],{"class":458},[444,3643,1570],{"class":454},[444,3645,3646],{"class":458},">>(\n",[444,3648,3649,3652,3654,3656,3658,3660,3663],{"class":446,"line":522},[444,3650,3651],{"class":458},"        queryKey",[444,3653,602],{"class":450},[444,3655,653],{"class":565},[444,3657,605],{"class":458},[444,3659,1889],{"class":608},[444,3661,3662],{"class":458},"]",[444,3664,487],{"class":450},[444,3666,3667,3670,3672,3674,3676,3679],{"class":446,"line":528},[444,3668,3669],{"class":458},"        fetcher",[444,3671,602],{"class":450},[444,3673,633],{"class":458},[444,3675,422],{"class":450},[444,3677,3678],{"class":458},"getTodos",[444,3680,487],{"class":450},[444,3682,3683,3686,3688,3690,3692,3694,3696],{"class":446,"line":534},[444,3684,3685],{"class":458},"        builder",[444,3687,602],{"class":450},[444,3689,1278],{"class":458},[444,3691,612],{"class":450},[444,3693,1283],{"class":458},[444,3695,612],{"class":450},[444,3697,1288],{"class":458},[444,3699,3700],{"class":446,"line":542},[444,3701,3702],{"class":465},"          // En pause → hors-ligne, en attente de charger pour la première fois\n",[444,3704,3705,3708,3711,3713,3715,3717,3720,3723,3725,3727,3730,3732,3734],{"class":446,"line":1431},[444,3706,3707],{"class":575},"          if",[444,3709,3710],{"class":458}," (fetchStatus ",[444,3712,1309],{"class":450},[444,3714,881],{"class":454},[444,3716,422],{"class":450},[444,3718,3719],{"class":458},"paused ",[444,3721,3722],{"class":450},"&&",[444,3724,1283],{"class":458},[444,3726,422],{"class":450},[444,3728,3729],{"class":458},"dataOrNull ",[444,3731,1309],{"class":450},[444,3733,2135],{"class":450},[444,3735,3736],{"class":458},") {\n",[444,3738,3739,3742,3744,3747,3750,3752,3755,3757,3760,3763],{"class":446,"line":1442},[444,3740,3741],{"class":575},"            return",[444,3743,653],{"class":565},[444,3745,3746],{"class":454}," Center",[444,3748,3749],{"class":458},"(child",[444,3751,602],{"class":450},[444,3753,3754],{"class":454}," Text",[444,3756,1132],{"class":458},[444,3758,3759],{"class":608},"'Hors-ligne : connectez-vous pour charger les todos'",[444,3761,3762],{"class":458},"))",[444,3764,681],{"class":450},[444,3766,3767],{"class":446,"line":1461},[444,3768,3769],{"class":458},"          }\n",[444,3771,3772],{"class":446,"line":1469},[444,3773,494],{"emptyLinePlaceholder":493},[444,3775,3776,3779,3781],{"class":446,"line":1477},[444,3777,3778],{"class":575},"          return",[444,3780,1329],{"class":575},[444,3782,1332],{"class":458},[444,3784,3785,3788,3790,3792,3794,3796,3798,3800,3802],{"class":446,"line":1502},[444,3786,3787],{"class":454},"            Initial",[444,3789,1365],{"class":458},[444,3791,630],{"class":450},[444,3793,653],{"class":565},[444,3795,1347],{"class":454},[444,3797,422],{"class":450},[444,3799,1352],{"class":584},[444,3801,1355],{"class":458},[444,3803,487],{"class":450},[444,3805,3806,3809,3811,3813,3815,3817,3819],{"class":446,"line":1510},[444,3807,3808],{"class":454},"            Loading",[444,3810,1365],{"class":458},[444,3812,630],{"class":450},[444,3814,653],{"class":565},[444,3816,1393],{"class":454},[444,3818,1355],{"class":458},[444,3820,487],{"class":450},[444,3822,3823,3826,3828,3830,3832,3834,3836,3839,3841],{"class":446,"line":1518},[444,3824,3825],{"class":454},"            Failure",[444,3827,1132],{"class":458},[444,3829,602],{"class":450},[444,3831,566],{"class":565},[444,3833,1489],{"class":458},[444,3835,630],{"class":450},[444,3837,3838],{"class":454}," ErrorScreen",[444,3840,1497],{"class":458},[444,3842,487],{"class":450},[444,3844,3845,3848,3850,3852,3854,3857,3859,3862],{"class":446,"line":2019},[444,3846,3847],{"class":454},"            Success",[444,3849,1132],{"class":458},[444,3851,602],{"class":450},[444,3853,566],{"class":565},[444,3855,3856],{"class":458}," data)  ",[444,3858,630],{"class":450},[444,3860,3861],{"class":454}," TodoList",[444,3863,707],{"class":458},[444,3865,3866,3869,3871,3874],{"class":446,"line":2029},[444,3867,3868],{"class":458},"                todos",[444,3870,602],{"class":450},[444,3872,3873],{"class":458}," data",[444,3875,487],{"class":450},[444,3877,3878,3881,3883,3885,3887,3889,3891,3893],{"class":446,"line":2060},[444,3879,3880],{"class":458},"                isRefreshing",[444,3882,602],{"class":450},[444,3884,1306],{"class":458},[444,3886,1309],{"class":450},[444,3888,881],{"class":454},[444,3890,422],{"class":450},[444,3892,965],{"class":458},[444,3894,487],{"class":450},[444,3896,3897,3900,3902,3904,3906,3908,3910,3912],{"class":446,"line":2078},[444,3898,3899],{"class":458},"                isStale",[444,3901,602],{"class":450},[444,3903,1306],{"class":458},[444,3905,1309],{"class":450},[444,3907,881],{"class":454},[444,3909,422],{"class":450},[444,3911,983],{"class":458},[444,3913,487],{"class":450},[444,3915,3916,3919],{"class":446,"line":2093},[444,3917,3918],{"class":458},"              )",[444,3920,487],{"class":450},[444,3922,3923,3926],{"class":446,"line":2101},[444,3924,3925],{"class":458},"          }",[444,3927,681],{"class":450},[444,3929,3930,3933],{"class":446,"line":2109},[444,3931,3932],{"class":458},"        }",[444,3934,487],{"class":450},[444,3936,3937,3939],{"class":446,"line":2117},[444,3938,2756],{"class":458},[444,3940,487],{"class":450},[444,3942,3943,3946,3948,3951,3953,3955,3957,3960,3962,3964],{"class":446,"line":2150},[444,3944,3945],{"class":458},"      floatingActionButton",[444,3947,602],{"class":450},[444,3949,3950],{"class":454}," QoraMutationBuilder",[444,3952,588],{"class":458},[444,3954,1565],{"class":565},[444,3956,804],{"class":458},[444,3958,3959],{"class":454},"String",[444,3961,804],{"class":458},[444,3963,1565],{"class":565},[444,3965,594],{"class":458},[444,3967,3968,3971,3973,3976,3978,3980,3982,3984,3987],{"class":446,"line":2157},[444,3969,3970],{"class":458},"        mutator",[444,3972,602],{"class":450},[444,3974,3975],{"class":458}," (title) ",[444,3977,630],{"class":450},[444,3979,633],{"class":458},[444,3981,422],{"class":450},[444,3983,1595],{"class":584},[444,3985,3986],{"class":458},"(title)",[444,3988,487],{"class":450},[444,3990,3991,3994,3996,3998],{"class":446,"line":2165},[444,3992,3993],{"class":458},"        options",[444,3995,602],{"class":450},[444,3997,1609],{"class":454},[444,3999,707],{"class":458},[444,4001,4002,4005,4007],{"class":446,"line":2172},[444,4003,4004],{"class":458},"          offlineQueue",[444,4006,602],{"class":450},[444,4008,1626],{"class":450},[444,4010,4011,4014,4016,4018,4020],{"class":446,"line":2179},[444,4012,4013],{"class":458},"          optimisticResponse",[444,4015,602],{"class":450},[444,4017,3975],{"class":458},[444,4019,630],{"class":450},[444,4021,4022],{"class":450}," null,\n",[444,4024,4026,4029,4031,4033,4035,4038,4040,4043,4045],{"class":446,"line":4025},36,[444,4027,4028],{"class":458},"          onSuccess",[444,4030,602],{"class":450},[444,4032,1850],{"class":458},[444,4034,612],{"class":450},[444,4036,4037],{"class":458}," __",[444,4039,612],{"class":450},[444,4041,4042],{"class":458}," ___) ",[444,4044,1862],{"class":575},[444,4046,4047],{"class":450}," =>\n",[444,4049,4051,4054,4056,4058,4060,4062,4064,4066,4068,4070,4072],{"class":446,"line":4050},37,[444,4052,4053],{"class":458},"              context",[444,4055,422],{"class":450},[444,4057,1879],{"class":458},[444,4059,422],{"class":450},[444,4061,1884],{"class":584},[444,4063,1132],{"class":458},[444,4065,1451],{"class":565},[444,4067,605],{"class":458},[444,4069,1889],{"class":608},[444,4071,1892],{"class":458},[444,4073,487],{"class":450},[444,4075,4077,4079],{"class":446,"line":4076},38,[444,4078,1472],{"class":458},[444,4080,487],{"class":450},[444,4082,4084,4086,4088,4090,4092,4094,4096],{"class":446,"line":4083},39,[444,4085,3685],{"class":458},[444,4087,602],{"class":450},[444,4089,1278],{"class":458},[444,4091,612],{"class":450},[444,4093,1283],{"class":458},[444,4095,612],{"class":450},[444,4097,1674],{"class":458},[444,4099,4101,4104,4106,4108,4111,4114,4117,4120,4122,4124,4126],{"class":446,"line":4100},40,[444,4102,4103],{"class":565},"          final",[444,4105,1934],{"class":458},[444,4107,572],{"class":450},[444,4109,4110],{"class":458}," state ",[444,4112,4113],{"class":450},"is",[444,4115,4116],{"class":454}," MutationSuccess",[444,4118,4119],{"class":450}," &&",[444,4121,1283],{"class":458},[444,4123,422],{"class":450},[444,4125,1755],{"class":458},[444,4127,681],{"class":450},[444,4129,4131,4133,4136,4138,4141],{"class":446,"line":4130},41,[444,4132,3778],{"class":575},[444,4134,4135],{"class":454}," FloatingActionButton",[444,4137,422],{"class":450},[444,4139,4140],{"class":584},"extended",[444,4142,707],{"class":458},[444,4144,4146,4149,4151,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4174,4176],{"class":446,"line":4145},42,[444,4147,4148],{"class":458},"            onPressed",[444,4150,602],{"class":450},[444,4152,1283],{"class":458},[444,4154,422],{"class":450},[444,4156,2129],{"class":458},[444,4158,2132],{"class":450},[444,4160,2135],{"class":450},[444,4162,1550],{"class":450},[444,4164,627],{"class":458},[444,4166,630],{"class":450},[444,4168,1697],{"class":584},[444,4170,1132],{"class":458},[444,4172,4173],{"class":608},"'Nouveau Todo'",[444,4175,678],{"class":458},[444,4177,487],{"class":450},[444,4179,4181,4184,4186],{"class":446,"line":4180},43,[444,4182,4183],{"class":458},"            icon",[444,4185,602],{"class":450},[444,4187,4188],{"class":458}," isOptimistic\n",[444,4190,4192,4195,4197,4200,4202,4204,4206],{"class":446,"line":4191},44,[444,4193,4194],{"class":450},"                ?",[444,4196,653],{"class":565},[444,4198,4199],{"class":454}," Icon",[444,4201,1132],{"class":458},[444,4203,2037],{"class":454},[444,4205,422],{"class":450},[444,4207,4208],{"class":458},"schedule)\n",[444,4210,4212,4215,4217,4219,4221,4223,4225,4228],{"class":446,"line":4211},45,[444,4213,4214],{"class":450},"                :",[444,4216,653],{"class":565},[444,4218,4199],{"class":454},[444,4220,1132],{"class":458},[444,4222,2037],{"class":454},[444,4224,422],{"class":450},[444,4226,4227],{"class":458},"add)",[444,4229,487],{"class":450},[444,4231,4233,4236,4238,4240],{"class":446,"line":4232},46,[444,4234,4235],{"class":458},"            label",[444,4237,602],{"class":450},[444,4239,3754],{"class":454},[444,4241,707],{"class":458},[444,4243,4245,4248,4250,4253,4255,4258],{"class":446,"line":4244},47,[444,4246,4247],{"class":458},"              isOptimistic ",[444,4249,2132],{"class":450},[444,4251,4252],{"class":608}," 'En file hors-ligne'",[444,4254,1550],{"class":450},[444,4256,4257],{"class":608}," 'Ajouter un Todo'",[444,4259,487],{"class":450},[444,4261,4263,4266],{"class":446,"line":4262},48,[444,4264,4265],{"class":458},"            )",[444,4267,487],{"class":450},[444,4269,4271,4273],{"class":446,"line":4270},49,[444,4272,2104],{"class":458},[444,4274,681],{"class":450},[444,4276,4278,4280],{"class":446,"line":4277},50,[444,4279,3932],{"class":458},[444,4281,487],{"class":450},[444,4283,4285,4287],{"class":446,"line":4284},51,[444,4286,2756],{"class":458},[444,4288,487],{"class":450},[444,4290,4292,4294],{"class":446,"line":4291},52,[444,4293,753],{"class":458},[444,4295,681],{"class":450},[444,4297,4299],{"class":446,"line":4298},53,[444,4300,1194],{"class":458},[444,4302,4304],{"class":446,"line":4303},54,[444,4305,545],{"class":458},[352,4307],{},[355,4309,4311],{"id":4310},"étapes-suivantes","Étapes suivantes",[4313,4314,4315,4324,4332,4340,4348],"ul",{},[4316,4317,4318,4323],"li",{},[4319,4320,4322],"a",{"href":4321},"../flutter-integration/network-status","NetworkStatusBuilder / Indicator"," : Widgets pour l'UI de connectivité",[4316,4325,4326,4329,4330],{},[4319,4327,108],{"href":4328},"../flutter-integration/qora-builder"," : API builder complète avec ",[386,4331,398],{},[4316,4333,4334,4337,4338],{},[4319,4335,113],{"href":4336},"../flutter-integration/qora-mutation-builder"," : File hors-ligne et ",[386,4339,1755],{},[4316,4341,4342,4345,4346],{},[4319,4343,215],{"href":4344},"../api-reference/qora-options"," : Référence du champ ",[386,4347,553],{},[4316,4349,4350,4345,4353],{},[4319,4351,220],{"href":4352},"../api-reference/qora-client-config",[386,4354,4355],{},"reconnectStrategy",[4357,4358,4359],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":440,"searchDepth":462,"depth":462,"links":4361},[4362,4363,4370,4376,4384,4387,4395,4396],{"id":357,"depth":462,"text":243},{"id":427,"depth":462,"text":388,"children":4364},[4365,4367,4369],{"id":549,"depth":469,"text":4366},"Définir networkMode par requête",{"id":684,"depth":469,"text":4368},"Définir networkMode globalement",{"id":771,"depth":469,"text":772},{"id":852,"depth":462,"text":853,"children":4371},[4372,4374],{"id":1065,"depth":469,"text":4373},"Observer FetchStatus en Dart",{"id":1204,"depth":469,"text":4375},"Observer FetchStatus dans Flutter",{"id":1526,"depth":462,"text":1527,"children":4377},[4378,4379,4380,4382,4383],{"id":1536,"depth":469,"text":1537},{"id":1721,"depth":469,"text":1722},{"id":1752,"depth":469,"text":4381},"isOptimistic : styliser les mutations non confirmées",{"id":2184,"depth":469,"text":2185},{"id":2397,"depth":469,"text":2398},{"id":2426,"depth":462,"text":2427,"children":4385},[4386],{"id":2536,"depth":469,"text":2537},{"id":2600,"depth":462,"text":2601,"children":4388},[4389,4391,4393],{"id":2604,"depth":469,"text":4390},"1. Installer connectivity_plus",{"id":2637,"depth":469,"text":4392},"2. Câbler QoraScope",{"id":2933,"depth":469,"text":4394},"3. Ajouter NetworkStatusIndicator",{"id":3530,"depth":462,"text":3531},{"id":4310,"depth":462,"text":4311},"Gérer le mode hors-ligne, les requêtes en pause, la file de mutations hors-ligne et la relecture à la reconnexion avec la couche réseau de Qora.","md",null,{},{"icon":161},{"title":4403,"description":4404},"Réseau adaptatif - Qora","Support hors-ligne complet pour les applications Dart et Flutter avec Qora. NetworkMode, FetchStatus, OfflineMutationQueue et succès optimiste pour les mutations non confirmées.","45F4eelcG7_fV0DArdqRhbmgoJygev__TGrPOnx6FH0",[4407,4409],{"title":153,"path":154,"stem":155,"description":4408,"icon":156,"children":-1},"Persister les résultats des requêtes sur disque et les restaurer au démarrage : donnant à l'application une couche de données instantanée qui fonctionne entièrement hors-ligne.",{"title":163,"path":164,"stem":165,"description":4410,"icon":121,"children":-1},"Implémenter la pagination avant et bidirectionnelle avec InfiniteQueryObserver : chargement au scroll, pull-to-refresh, pagination fenêtrée et APIs basées sur curseur.",1794040404297]