[{"data":1,"prerenderedAt":2485},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-recipes-infinite-queries":342,"-fr-recipes-infinite-queries-surround":2480},[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":163,"body":344,"description":2471,"extension":2472,"links":2473,"meta":2474,"navigation":2475,"path":164,"seo":2476,"stem":165,"__hash__":2479},"docs_fr/fr/04.recipes/06.infinite-queries.md",{"type":345,"value":346,"toc":2450},"minimark",[347,356,372,375,380,390,409,411,415,914,916,922,931,1002,1009,1017,1086,1088,1094,1216,1218,1222,1226,1305,1309,1372,1376,1504,1506,1510,1516,1605,1653,1655,1661,1667,1757,1760,1778,1798,1806,1808,1812,1818,1863,1879,1882,1913,1915,1918,1934,2085,2098,2100,2103,2106,2419,2421,2425,2446],[348,349,350,351,355],"p",{},"Une ",[352,353,354],"strong",{},"requête infinie"," récupère des données par pages et accumule les résultats entre les requêtes. Les pages sont ajoutées en fin ou en début au lieu de remplacer les données existantes.",[348,357,358,359,363,364,367,368,371],{},"Qora implémente ce pattern avec ",[360,361,362],"code",{},"InfiniteQueryObserver",", ",[360,365,366],{},"InfiniteData"," et ",[360,369,370],{},"InfiniteQueryState",".",[373,374],"hr",{},[376,377,379],"h2",{"id":378},"la-machine-détat","La machine d'état",[381,382,388],"pre",{"className":383,"code":385,"language":386,"meta":387},[384],"language-text","InfiniteInitial\n      │\n      │  observer.fetch()\n      ▼\nInfiniteLoading         ← chargement de la page initiale uniquement\n      │\n      ├── success ──▶ InfiniteSuccess\n      │                    │\n      │                    ├── fetchNextPage()     ──▶ InfiniteSuccess (isFetchingNextPage: true)\n      │                    ├── fetchPreviousPage() ──▶ InfiniteSuccess (isFetchingPreviousPage: true)\n      │                    └── fetch failure       ──▶ InfiniteFailure (avec previousData)\n      │\n      └── failure ──▶ InfiniteFailure\n","text","",[360,389,385],{"__ignoreMap":387},[348,391,392,393,396,397,400,401,404,405,408],{},"Conception clé : après le chargement de la première page, l'état ne retourne jamais à ",[360,394,395],{},"InfiniteLoading",". Les fetchs de pages suivantes signalent leur progression via ",[360,398,399],{},"isFetchingNextPage"," / ",[360,402,403],{},"isFetchingPreviousPage"," sur ",[360,406,407],{},"InfiniteSuccess",", de sorte que les pages existantes restent visibles pendant le chargement de plus de données.",[373,410],{},[376,412,414],{"id":413},"configuration-de-base","Configuration de base",[381,416,421],{"className":417,"code":418,"filename":419,"language":420,"meta":387,"style":387},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","final observer = InfiniteQueryObserver\u003CList\u003CPost>, int>(\n  client: client,\n  key: ['posts'],\n  fetcher: (page) => api.getPosts(page: page),\n  options: InfiniteQueryOptions(\n    initialPageParam: 1,\n    // Retourner null quand il n'y a plus de pages.\n    getNextPageParam: (lastPage, allPages) =>\n        lastPage.hasMore ? allPages.length + 1 : null,\n  ),\n);\n\n// Récupérer la première page\nawait observer.fetch();\n\n// S'abonner aux changements d'état\nobserver.stream.listen((state) {\n  switch (state) {\n    case InfiniteInitial() || InfiniteLoading():\n      showSpinner();\n    case InfiniteSuccess(:final data, :final hasNextPage):\n      final posts = data.flatten((page) => page);\n      renderList(posts, hasNextPage: hasNextPage);\n    case InfiniteFailure(:final error):\n      showError(error);\n  }\n});\n\n// Plus tard : déclencher la page suivante (ex. depuis un listener de scroll)\nawait observer.fetchNextPage();\n\n// Toujours disposer quand terminé\nobserver.dispose();\n","posts_screen.dart","dart",[360,422,423,464,479,499,532,546,560,567,587,620,628,637,644,650,670,675,681,700,709,732,742,771,798,818,837,848,854,862,867,873,889,894,900],{"__ignoreMap":387},[424,425,428,432,436,440,444,447,450,452,455,458,461],"span",{"class":426,"line":427},"line",1,[424,429,431],{"class":430},"spNyl","final",[424,433,435],{"class":434},"sTEyZ"," observer ",[424,437,439],{"class":438},"sMK4o","=",[424,441,443],{"class":442},"sBMFI"," InfiniteQueryObserver",[424,445,446],{"class":434},"\u003C",[424,448,449],{"class":442},"List",[424,451,446],{"class":434},[424,453,454],{"class":442},"Post",[424,456,457],{"class":434},">, ",[424,459,460],{"class":442},"int",[424,462,463],{"class":434},">(\n",[424,465,467,470,473,476],{"class":426,"line":466},2,[424,468,469],{"class":434},"  client",[424,471,472],{"class":438},":",[424,474,475],{"class":434}," client",[424,477,478],{"class":438},",\n",[424,480,482,485,487,490,494,497],{"class":426,"line":481},3,[424,483,484],{"class":434},"  key",[424,486,472],{"class":438},[424,488,489],{"class":434}," [",[424,491,493],{"class":492},"sfazB","'posts'",[424,495,496],{"class":434},"]",[424,498,478],{"class":438},[424,500,502,505,507,510,513,516,518,522,525,527,530],{"class":426,"line":501},4,[424,503,504],{"class":434},"  fetcher",[424,506,472],{"class":438},[424,508,509],{"class":434}," (page) ",[424,511,512],{"class":438},"=>",[424,514,515],{"class":434}," api",[424,517,371],{"class":438},[424,519,521],{"class":520},"s2Zo4","getPosts",[424,523,524],{"class":434},"(page",[424,526,472],{"class":438},[424,528,529],{"class":434}," page)",[424,531,478],{"class":438},[424,533,535,538,540,543],{"class":426,"line":534},5,[424,536,537],{"class":434},"  options",[424,539,472],{"class":438},[424,541,542],{"class":442}," InfiniteQueryOptions",[424,544,545],{"class":434},"(\n",[424,547,549,552,554,558],{"class":426,"line":548},6,[424,550,551],{"class":434},"    initialPageParam",[424,553,472],{"class":438},[424,555,557],{"class":556},"sbssI"," 1",[424,559,478],{"class":438},[424,561,563],{"class":426,"line":562},7,[424,564,566],{"class":565},"sHwdD","    // Retourner null quand il n'y a plus de pages.\n",[424,568,570,573,575,578,581,584],{"class":426,"line":569},8,[424,571,572],{"class":434},"    getNextPageParam",[424,574,472],{"class":438},[424,576,577],{"class":434}," (lastPage",[424,579,580],{"class":438},",",[424,582,583],{"class":434}," allPages) ",[424,585,586],{"class":438},"=>\n",[424,588,590,593,595,598,601,604,606,609,612,614,617],{"class":426,"line":589},9,[424,591,592],{"class":434},"        lastPage",[424,594,371],{"class":438},[424,596,597],{"class":434},"hasMore ",[424,599,600],{"class":438},"?",[424,602,603],{"class":434}," allPages",[424,605,371],{"class":438},[424,607,608],{"class":434},"length ",[424,610,611],{"class":438},"+",[424,613,557],{"class":556},[424,615,616],{"class":438}," :",[424,618,619],{"class":438}," null,\n",[424,621,623,626],{"class":426,"line":622},10,[424,624,625],{"class":434},"  )",[424,627,478],{"class":438},[424,629,631,634],{"class":426,"line":630},11,[424,632,633],{"class":434},")",[424,635,636],{"class":438},";\n",[424,638,640],{"class":426,"line":639},12,[424,641,643],{"emptyLinePlaceholder":642},true,"\n",[424,645,647],{"class":426,"line":646},13,[424,648,649],{"class":565},"// Récupérer la première page\n",[424,651,653,657,660,662,665,668],{"class":426,"line":652},14,[424,654,656],{"class":655},"s7zQu","await",[424,658,659],{"class":434}," observer",[424,661,371],{"class":438},[424,663,664],{"class":520},"fetch",[424,666,667],{"class":434},"()",[424,669,636],{"class":438},[424,671,673],{"class":426,"line":672},15,[424,674,643],{"emptyLinePlaceholder":642},[424,676,678],{"class":426,"line":677},16,[424,679,680],{"class":565},"// S'abonner aux changements d'état\n",[424,682,684,687,689,692,694,697],{"class":426,"line":683},17,[424,685,686],{"class":434},"observer",[424,688,371],{"class":438},[424,690,691],{"class":434},"stream",[424,693,371],{"class":438},[424,695,696],{"class":520},"listen",[424,698,699],{"class":434},"((state) {\n",[424,701,703,706],{"class":426,"line":702},18,[424,704,705],{"class":655},"  switch",[424,707,708],{"class":434}," (state) {\n",[424,710,712,715,718,721,724,727,729],{"class":426,"line":711},19,[424,713,714],{"class":655},"    case",[424,716,717],{"class":442}," InfiniteInitial",[424,719,720],{"class":434},"() ",[424,722,723],{"class":438},"||",[424,725,726],{"class":442}," InfiniteLoading",[424,728,667],{"class":434},[424,730,731],{"class":438},":\n",[424,733,735,738,740],{"class":426,"line":734},20,[424,736,737],{"class":520},"      showSpinner",[424,739,667],{"class":434},[424,741,636],{"class":438},[424,743,745,747,750,753,755,757,760,762,764,766,769],{"class":426,"line":744},21,[424,746,714],{"class":655},[424,748,749],{"class":442}," InfiniteSuccess",[424,751,752],{"class":434},"(",[424,754,472],{"class":438},[424,756,431],{"class":430},[424,758,759],{"class":434}," data",[424,761,580],{"class":438},[424,763,616],{"class":438},[424,765,431],{"class":430},[424,767,768],{"class":434}," hasNextPage)",[424,770,731],{"class":438},[424,772,774,777,780,782,784,786,789,792,794,796],{"class":426,"line":773},22,[424,775,776],{"class":430},"      final",[424,778,779],{"class":434}," posts ",[424,781,439],{"class":438},[424,783,759],{"class":434},[424,785,371],{"class":438},[424,787,788],{"class":520},"flatten",[424,790,791],{"class":434},"((page) ",[424,793,512],{"class":438},[424,795,529],{"class":434},[424,797,636],{"class":438},[424,799,801,804,807,809,812,814,816],{"class":426,"line":800},23,[424,802,803],{"class":520},"      renderList",[424,805,806],{"class":434},"(posts",[424,808,580],{"class":438},[424,810,811],{"class":434}," hasNextPage",[424,813,472],{"class":438},[424,815,768],{"class":434},[424,817,636],{"class":438},[424,819,821,823,826,828,830,832,835],{"class":426,"line":820},24,[424,822,714],{"class":655},[424,824,825],{"class":442}," InfiniteFailure",[424,827,752],{"class":434},[424,829,472],{"class":438},[424,831,431],{"class":430},[424,833,834],{"class":434}," error)",[424,836,731],{"class":438},[424,838,840,843,846],{"class":426,"line":839},25,[424,841,842],{"class":520},"      showError",[424,844,845],{"class":434},"(error)",[424,847,636],{"class":438},[424,849,851],{"class":426,"line":850},26,[424,852,853],{"class":434},"  }\n",[424,855,857,860],{"class":426,"line":856},27,[424,858,859],{"class":434},"})",[424,861,636],{"class":438},[424,863,865],{"class":426,"line":864},28,[424,866,643],{"emptyLinePlaceholder":642},[424,868,870],{"class":426,"line":869},29,[424,871,872],{"class":565},"// Plus tard : déclencher la page suivante (ex. depuis un listener de scroll)\n",[424,874,876,878,880,882,885,887],{"class":426,"line":875},30,[424,877,656],{"class":655},[424,879,659],{"class":434},[424,881,371],{"class":438},[424,883,884],{"class":520},"fetchNextPage",[424,886,667],{"class":434},[424,888,636],{"class":438},[424,890,892],{"class":426,"line":891},31,[424,893,643],{"emptyLinePlaceholder":642},[424,895,897],{"class":426,"line":896},32,[424,898,899],{"class":565},"// Toujours disposer quand terminé\n",[424,901,903,905,907,910,912],{"class":426,"line":902},33,[424,904,686],{"class":434},[424,906,371],{"class":438},[424,908,909],{"class":520},"dispose",[424,911,667],{"class":434},[424,913,636],{"class":438},[373,915],{},[376,917,919],{"id":918},"infinitedatatdata-tpageparam",[360,920,921],{},"InfiniteData\u003CTData, TPageParam>",[348,923,924,926,927,930],{},[360,925,366],{}," est un conteneur ",[352,928,929],{},"immuable"," qui maintient toutes les pages chargées et les paramètres utilisés pour les récupérer :",[381,932,934],{"className":417,"code":933,"language":420,"meta":387,"style":387},"state.data.pages        // List\u003CTData> : toutes les pages dans l'ordre\nstate.data.pageParams   // List\u003CTPageParam> : params utilisés pour chaque page\nstate.data.pageCount    // int\nstate.data.isEmpty      // bool\n",[360,935,936,954,970,986],{"__ignoreMap":387},[424,937,938,941,943,946,948,951],{"class":426,"line":427},[424,939,940],{"class":434},"state",[424,942,371],{"class":438},[424,944,945],{"class":434},"data",[424,947,371],{"class":438},[424,949,950],{"class":434},"pages        ",[424,952,953],{"class":565},"// List\u003CTData> : toutes les pages dans l'ordre\n",[424,955,956,958,960,962,964,967],{"class":426,"line":466},[424,957,940],{"class":434},[424,959,371],{"class":438},[424,961,945],{"class":434},[424,963,371],{"class":438},[424,965,966],{"class":434},"pageParams   ",[424,968,969],{"class":565},"// List\u003CTPageParam> : params utilisés pour chaque page\n",[424,971,972,974,976,978,980,983],{"class":426,"line":481},[424,973,940],{"class":434},[424,975,371],{"class":438},[424,977,945],{"class":434},[424,979,371],{"class":438},[424,981,982],{"class":434},"pageCount    ",[424,984,985],{"class":565},"// int\n",[424,987,988,990,992,994,996,999],{"class":426,"line":501},[424,989,940],{"class":434},[424,991,371],{"class":438},[424,993,945],{"class":434},[424,995,371],{"class":438},[424,997,998],{"class":434},"isEmpty      ",[424,1000,1001],{"class":565},"// bool\n",[1003,1004,1006,1008],"h3",{"id":1005},"flatten-des-pages-aux-éléments",[360,1007,788],{}," : des pages aux éléments",[348,1010,1011,1013,1014,616],{},[360,1012,788],{}," convertit une liste de pages en liste plate d'éléments pour ",[360,1015,1016],{},"ListView.builder",[381,1018,1020],{"className":417,"code":1019,"filename":419,"language":420,"meta":387,"style":387},"// TData == List\u003CPost>\nfinal posts = data.flatten((page) => page);\n\n// TData est un objet de réponse avec une liste imbriquée\nfinal posts = data.flatten((page) => page.items);\n",[360,1021,1022,1027,1049,1053,1058],{"__ignoreMap":387},[424,1023,1024],{"class":426,"line":427},[424,1025,1026],{"class":565},"// TData == List\u003CPost>\n",[424,1028,1029,1031,1033,1035,1037,1039,1041,1043,1045,1047],{"class":426,"line":466},[424,1030,431],{"class":430},[424,1032,779],{"class":434},[424,1034,439],{"class":438},[424,1036,759],{"class":434},[424,1038,371],{"class":438},[424,1040,788],{"class":520},[424,1042,791],{"class":434},[424,1044,512],{"class":438},[424,1046,529],{"class":434},[424,1048,636],{"class":438},[424,1050,1051],{"class":426,"line":481},[424,1052,643],{"emptyLinePlaceholder":642},[424,1054,1055],{"class":426,"line":501},[424,1056,1057],{"class":565},"// TData est un objet de réponse avec une liste imbriquée\n",[424,1059,1060,1062,1064,1066,1068,1070,1072,1074,1076,1079,1081,1084],{"class":426,"line":534},[424,1061,431],{"class":430},[424,1063,779],{"class":434},[424,1065,439],{"class":438},[424,1067,759],{"class":434},[424,1069,371],{"class":438},[424,1071,788],{"class":520},[424,1073,791],{"class":434},[424,1075,512],{"class":438},[424,1077,1078],{"class":434}," page",[424,1080,371],{"class":438},[424,1082,1083],{"class":434},"items)",[424,1085,636],{"class":438},[373,1087],{},[376,1089,1091],{"id":1090},"infinitequeryoptions",[360,1092,1093],{},"InfiniteQueryOptions",[1095,1096,1097,1116],"table",{},[1098,1099,1100],"thead",{},[1101,1102,1103,1107,1110,1113],"tr",{},[1104,1105,1106],"th",{},"Option",[1104,1108,1109],{},"Type",[1104,1111,1112],{},"Requis",[1104,1114,1115],{},"Description",[1117,1118,1119,1145,1166,1183,1200],"tbody",{},[1101,1120,1121,1127,1132,1135],{},[1122,1123,1124],"td",{},[360,1125,1126],{},"initialPageParam",[1122,1128,1129],{},[360,1130,1131],{},"TPageParam",[1122,1133,1134],{},"Oui",[1122,1136,1137,1138,363,1141,1144],{},"Paramètre pour la toute première page. Typiquement ",[360,1139,1140],{},"1",[360,1142,1143],{},"0",", ou un curseur vide.",[1101,1146,1147,1152,1157,1159],{},[1122,1148,1149],{},[360,1150,1151],{},"getNextPageParam",[1122,1153,1154],{},[360,1155,1156],{},"TPageParam? Function(TData lastPage, List\u003CTData> allPages)",[1122,1158,1134],{},[1122,1160,1161,1162,1165],{},"Retourner le paramètre de la page suivante, ou ",[360,1163,1164],{},"null"," quand il n'y a plus de pages.",[1101,1167,1168,1173,1178,1180],{},[1122,1169,1170],{},[360,1171,1172],{},"getPreviousPageParam",[1122,1174,1175],{},[360,1176,1177],{},"TPageParam? Function(TData firstPage, List\u003CTData> allPages)?",[1122,1179,472],{},[1122,1181,1182],{},"Retourner le paramètre de la page précédente. Nécessaire uniquement pour le défilement bidirectionnel.",[1101,1184,1185,1190,1195,1197],{},[1122,1186,1187],{},[360,1188,1189],{},"maxPages",[1122,1191,1192],{},[360,1193,1194],{},"int?",[1122,1196,472],{},[1122,1198,1199],{},"Pages maximum en mémoire (pagination fenêtrée). Quand dépassé, la page la plus ancienne est supprimée.",[1101,1201,1202,1207,1211,1213],{},[1122,1203,1204],{},[360,1205,1206],{},"baseOptions",[1122,1208,1209],{},[360,1210,215],{},[1122,1212,472],{},[1122,1214,1215],{},"Options standard de retry, stale time et network mode appliquées à chaque fetch de page.",[373,1217],{},[376,1219,1221],{"id":1220},"stratégies-de-pagination","Stratégies de pagination",[1003,1223,1225],{"id":1224},"numéros-de-page-entiers","Numéros de page entiers",[381,1227,1229],{"className":417,"code":1228,"filename":419,"language":420,"meta":387,"style":387},"InfiniteQueryOptions\u003CList\u003CPost>, int>(\n  initialPageParam: 1,\n  getNextPageParam: (lastPage, allPages) =>\n      lastPage.hasMore ? allPages.length + 1 : null,\n)\n",[360,1230,1231,1249,1260,1275,1300],{"__ignoreMap":387},[424,1232,1233,1235,1237,1239,1241,1243,1245,1247],{"class":426,"line":427},[424,1234,1093],{"class":442},[424,1236,446],{"class":434},[424,1238,449],{"class":442},[424,1240,446],{"class":434},[424,1242,454],{"class":442},[424,1244,457],{"class":434},[424,1246,460],{"class":442},[424,1248,463],{"class":434},[424,1250,1251,1254,1256,1258],{"class":426,"line":466},[424,1252,1253],{"class":434},"  initialPageParam",[424,1255,472],{"class":438},[424,1257,557],{"class":556},[424,1259,478],{"class":438},[424,1261,1262,1265,1267,1269,1271,1273],{"class":426,"line":481},[424,1263,1264],{"class":434},"  getNextPageParam",[424,1266,472],{"class":438},[424,1268,577],{"class":434},[424,1270,580],{"class":438},[424,1272,583],{"class":434},[424,1274,586],{"class":438},[424,1276,1277,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298],{"class":426,"line":501},[424,1278,1279],{"class":434},"      lastPage",[424,1281,371],{"class":438},[424,1283,597],{"class":434},[424,1285,600],{"class":438},[424,1287,603],{"class":434},[424,1289,371],{"class":438},[424,1291,608],{"class":434},[424,1293,611],{"class":438},[424,1295,557],{"class":556},[424,1297,616],{"class":438},[424,1299,619],{"class":438},[424,1301,1302],{"class":426,"line":534},[424,1303,1304],{"class":434},")\n",[1003,1306,1308],{"id":1307},"basé-sur-curseur","Basé sur curseur",[381,1310,1313],{"className":417,"code":1311,"filename":1312,"language":420,"meta":387,"style":387},"InfiniteQueryOptions\u003CFeedPage, String?>(\n  initialPageParam: null,   // null = \"démarrer depuis le début\"\n  getNextPageParam: (lastPage, allPages) => lastPage.nextCursor,\n)\n","feed_screen.dart",[360,1314,1315,1332,1344,1368],{"__ignoreMap":387},[424,1316,1317,1319,1321,1324,1326,1329],{"class":426,"line":427},[424,1318,1093],{"class":442},[424,1320,446],{"class":434},[424,1322,1323],{"class":442},"FeedPage",[424,1325,363],{"class":434},[424,1327,1328],{"class":442},"String",[424,1330,1331],{"class":434},"?>(\n",[424,1333,1334,1336,1338,1341],{"class":426,"line":466},[424,1335,1253],{"class":434},[424,1337,472],{"class":438},[424,1339,1340],{"class":438}," null,",[424,1342,1343],{"class":565},"   // null = \"démarrer depuis le début\"\n",[424,1345,1346,1348,1350,1352,1354,1356,1358,1361,1363,1366],{"class":426,"line":481},[424,1347,1264],{"class":434},[424,1349,472],{"class":438},[424,1351,577],{"class":434},[424,1353,580],{"class":438},[424,1355,583],{"class":434},[424,1357,512],{"class":438},[424,1359,1360],{"class":434}," lastPage",[424,1362,371],{"class":438},[424,1364,1365],{"class":434},"nextCursor",[424,1367,478],{"class":438},[424,1369,1370],{"class":426,"line":501},[424,1371,1304],{"class":434},[1003,1373,1375],{"id":1374},"offsetlimite","Offset/limite",[381,1377,1380],{"className":417,"code":1378,"filename":1379,"language":420,"meta":387,"style":387},"const pageSize = 20;\n\nInfiniteQueryOptions\u003CList\u003CResult>, int>(\n  initialPageParam: 0,\n  getNextPageParam: (lastPage, allPages) {\n    final nextOffset = allPages.length * pageSize;\n    return lastPage.length == pageSize ? nextOffset : null;\n  },\n)\n","search_screen.dart",[360,1381,1382,1397,1401,1420,1431,1444,1468,1493,1500],{"__ignoreMap":387},[424,1383,1384,1387,1390,1392,1395],{"class":426,"line":427},[424,1385,1386],{"class":430},"const",[424,1388,1389],{"class":434}," pageSize ",[424,1391,439],{"class":438},[424,1393,1394],{"class":556}," 20",[424,1396,636],{"class":438},[424,1398,1399],{"class":426,"line":466},[424,1400,643],{"emptyLinePlaceholder":642},[424,1402,1403,1405,1407,1409,1411,1414,1416,1418],{"class":426,"line":481},[424,1404,1093],{"class":442},[424,1406,446],{"class":434},[424,1408,449],{"class":442},[424,1410,446],{"class":434},[424,1412,1413],{"class":442},"Result",[424,1415,457],{"class":434},[424,1417,460],{"class":442},[424,1419,463],{"class":434},[424,1421,1422,1424,1426,1429],{"class":426,"line":501},[424,1423,1253],{"class":434},[424,1425,472],{"class":438},[424,1427,1428],{"class":556}," 0",[424,1430,478],{"class":438},[424,1432,1433,1435,1437,1439,1441],{"class":426,"line":534},[424,1434,1264],{"class":434},[424,1436,472],{"class":438},[424,1438,577],{"class":434},[424,1440,580],{"class":438},[424,1442,1443],{"class":434}," allPages) {\n",[424,1445,1446,1449,1452,1454,1456,1458,1460,1463,1466],{"class":426,"line":548},[424,1447,1448],{"class":430},"    final",[424,1450,1451],{"class":434}," nextOffset ",[424,1453,439],{"class":438},[424,1455,603],{"class":434},[424,1457,371],{"class":438},[424,1459,608],{"class":434},[424,1461,1462],{"class":438},"*",[424,1464,1465],{"class":434}," pageSize",[424,1467,636],{"class":438},[424,1469,1470,1473,1475,1477,1479,1482,1484,1486,1488,1490],{"class":426,"line":562},[424,1471,1472],{"class":655},"    return",[424,1474,1360],{"class":434},[424,1476,371],{"class":438},[424,1478,608],{"class":434},[424,1480,1481],{"class":438},"==",[424,1483,1389],{"class":434},[424,1485,600],{"class":438},[424,1487,1451],{"class":434},[424,1489,472],{"class":438},[424,1491,1492],{"class":438}," null;\n",[424,1494,1495,1498],{"class":426,"line":569},[424,1496,1497],{"class":434},"  }",[424,1499,478],{"class":438},[424,1501,1502],{"class":426,"line":589},[424,1503,1304],{"class":434},[373,1505],{},[376,1507,1509],{"id":1508},"défilement-bidirectionnel","Défilement bidirectionnel",[348,1511,1512,1513,1515],{},"Les fils de chat, timelines et fils de commentaires doivent souvent charger dans les deux directions. Fournir ",[360,1514,1172],{}," pour activer la pagination en arrière :",[381,1517,1520],{"className":417,"code":1518,"filename":1519,"language":420,"meta":387,"style":387},"InfiniteQueryOptions\u003CList\u003CMessage>, String?>(\n  initialPageParam: null,   // Démarrer depuis le dernier message\n  getNextPageParam: (lastPage, allPages) => lastPage.olderCursor,\n  getPreviousPageParam: (firstPage, allPages) => firstPage.newerCursor,\n)\n","chat_screen.dart",[360,1521,1522,1541,1552,1575,1601],{"__ignoreMap":387},[424,1523,1524,1526,1528,1530,1532,1535,1537,1539],{"class":426,"line":427},[424,1525,1093],{"class":442},[424,1527,446],{"class":434},[424,1529,449],{"class":442},[424,1531,446],{"class":434},[424,1533,1534],{"class":442},"Message",[424,1536,457],{"class":434},[424,1538,1328],{"class":442},[424,1540,1331],{"class":434},[424,1542,1543,1545,1547,1549],{"class":426,"line":466},[424,1544,1253],{"class":434},[424,1546,472],{"class":438},[424,1548,1340],{"class":438},[424,1550,1551],{"class":565},"   // Démarrer depuis le dernier message\n",[424,1553,1554,1556,1558,1560,1562,1564,1566,1568,1570,1573],{"class":426,"line":481},[424,1555,1264],{"class":434},[424,1557,472],{"class":438},[424,1559,577],{"class":434},[424,1561,580],{"class":438},[424,1563,583],{"class":434},[424,1565,512],{"class":438},[424,1567,1360],{"class":434},[424,1569,371],{"class":438},[424,1571,1572],{"class":434},"olderCursor",[424,1574,478],{"class":438},[424,1576,1577,1580,1582,1585,1587,1589,1591,1594,1596,1599],{"class":426,"line":501},[424,1578,1579],{"class":434},"  getPreviousPageParam",[424,1581,472],{"class":438},[424,1583,1584],{"class":434}," (firstPage",[424,1586,580],{"class":438},[424,1588,583],{"class":434},[424,1590,512],{"class":438},[424,1592,1593],{"class":434}," firstPage",[424,1595,371],{"class":438},[424,1597,1598],{"class":434},"newerCursor",[424,1600,478],{"class":438},[424,1602,1603],{"class":426,"line":534},[424,1604,1304],{"class":434},[381,1606,1608],{"className":417,"code":1607,"filename":1519,"language":420,"meta":387,"style":387},"// Défilement vers le haut → charger les messages plus anciens\nawait observer.fetchPreviousPage();\n\n// Défilement vers le bas → charger les messages plus récents\nawait observer.fetchNextPage();\n",[360,1609,1610,1615,1630,1634,1639],{"__ignoreMap":387},[424,1611,1612],{"class":426,"line":427},[424,1613,1614],{"class":565},"// Défilement vers le haut → charger les messages plus anciens\n",[424,1616,1617,1619,1621,1623,1626,1628],{"class":426,"line":466},[424,1618,656],{"class":655},[424,1620,659],{"class":434},[424,1622,371],{"class":438},[424,1624,1625],{"class":520},"fetchPreviousPage",[424,1627,667],{"class":434},[424,1629,636],{"class":438},[424,1631,1632],{"class":426,"line":481},[424,1633,643],{"emptyLinePlaceholder":642},[424,1635,1636],{"class":426,"line":501},[424,1637,1638],{"class":565},"// Défilement vers le bas → charger les messages plus récents\n",[424,1640,1641,1643,1645,1647,1649,1651],{"class":426,"line":534},[424,1642,656],{"class":655},[424,1644,659],{"class":434},[424,1646,371],{"class":438},[424,1648,884],{"class":520},[424,1650,667],{"class":434},[424,1652,636],{"class":438},[373,1654],{},[376,1656,1658,1659,633],{"id":1657},"pagination-fenêtrée-maxpages","Pagination fenêtrée (",[360,1660,1189],{},[348,1662,1663,1664,1666],{},"Pour les sessions de défilement longues (fils de type Twitter/X), une liste de pages non bornée cause une utilisation mémoire croissante et des saccades UI. ",[360,1665,1189],{}," limite la fenêtre en mémoire :",[381,1668,1670],{"className":417,"code":1669,"filename":1312,"language":420,"meta":387,"style":387},"InfiniteQueryOptions\u003CList\u003CPost>, int>(\n  initialPageParam: 1,\n  getNextPageParam: (lastPage, allPages) =>\n      lastPage.hasMore ? allPages.length + 1 : null,\n  maxPages: 10,   // Garder au maximum 10 pages en mémoire\n)\n",[360,1671,1672,1690,1700,1714,1738,1753],{"__ignoreMap":387},[424,1673,1674,1676,1678,1680,1682,1684,1686,1688],{"class":426,"line":427},[424,1675,1093],{"class":442},[424,1677,446],{"class":434},[424,1679,449],{"class":442},[424,1681,446],{"class":434},[424,1683,454],{"class":442},[424,1685,457],{"class":434},[424,1687,460],{"class":442},[424,1689,463],{"class":434},[424,1691,1692,1694,1696,1698],{"class":426,"line":466},[424,1693,1253],{"class":434},[424,1695,472],{"class":438},[424,1697,557],{"class":556},[424,1699,478],{"class":438},[424,1701,1702,1704,1706,1708,1710,1712],{"class":426,"line":481},[424,1703,1264],{"class":434},[424,1705,472],{"class":438},[424,1707,577],{"class":434},[424,1709,580],{"class":438},[424,1711,583],{"class":434},[424,1713,586],{"class":438},[424,1715,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736],{"class":426,"line":501},[424,1717,1279],{"class":434},[424,1719,371],{"class":438},[424,1721,597],{"class":434},[424,1723,600],{"class":438},[424,1725,603],{"class":434},[424,1727,371],{"class":438},[424,1729,608],{"class":434},[424,1731,611],{"class":438},[424,1733,557],{"class":556},[424,1735,616],{"class":438},[424,1737,619],{"class":438},[424,1739,1740,1743,1745,1748,1750],{"class":426,"line":534},[424,1741,1742],{"class":434},"  maxPages",[424,1744,472],{"class":438},[424,1746,1747],{"class":556}," 10",[424,1749,580],{"class":438},[424,1751,1752],{"class":565},"   // Garder au maximum 10 pages en mémoire\n",[424,1754,1755],{"class":426,"line":548},[424,1756,1304],{"class":434},[348,1758,1759],{},"Quand la fenêtre glisse :",[1761,1762,1763,1771],"ul",{},[1764,1765,1766,1770],"li",{},[352,1767,1768],{},[360,1769,884],{}," : supprime la page la plus ancienne en tête.",[1764,1772,1773,1777],{},[352,1774,1775],{},[360,1776,1625],{}," : supprime la page la plus récente en queue.",[348,1779,1780,1781,1784,1785,1788,1789,1792,1793,1784,1795,1797],{},"Le bord supprimé redevient navigable : quand l'utilisateur l'atteint, ",[360,1782,1783],{},"hasPreviousPage"," (ou ",[360,1786,1787],{},"hasNextPage",") devient ",[360,1790,1791],{},"true"," et Qora re-récupère la page supprimée en utilisant ",[360,1794,1172],{},[360,1796,1151],{},"). Cela requiert que l'API supporte des paramètres en accès aléatoire (numéros de page stables ou curseurs).",[1799,1800,1801,1802,1805],"tip",{},"Pour la plupart des applications, ",[360,1803,1804],{},"maxPages: 5–10"," fournit un bon équilibre. Chaque page contient 20–50 éléments, donc 10 pages ≈ 200–500 éléments en mémoire : bien dans les capacités de Flutter.",[373,1807],{},[376,1809,1811],{"id":1810},"refetch-après-invalidation","Refetch après invalidation",[348,1813,1814,1815,616],{},"Quand les données deviennent périmées (ex. une mutation change l'état serveur), appeler ",[360,1816,1817],{},"refetch()",[381,1819,1821],{"className":417,"code":1820,"filename":419,"language":420,"meta":387,"style":387},"// Après création d'un nouveau post\nawait api.createPost(title);\nawait observer.refetch();   // Refetch toutes les pages chargées en séquence\n",[360,1822,1823,1828,1844],{"__ignoreMap":387},[424,1824,1825],{"class":426,"line":427},[424,1826,1827],{"class":565},"// Après création d'un nouveau post\n",[424,1829,1830,1832,1834,1836,1839,1842],{"class":426,"line":466},[424,1831,656],{"class":655},[424,1833,515],{"class":434},[424,1835,371],{"class":438},[424,1837,1838],{"class":520},"createPost",[424,1840,1841],{"class":434},"(title)",[424,1843,636],{"class":438},[424,1845,1846,1848,1850,1852,1855,1857,1860],{"class":426,"line":481},[424,1847,656],{"class":655},[424,1849,659],{"class":434},[424,1851,371],{"class":438},[424,1853,1854],{"class":520},"refetch",[424,1856,667],{"class":434},[424,1858,1859],{"class":438},";",[424,1861,1862],{"class":565},"   // Refetch toutes les pages chargées en séquence\n",[348,1864,1865,1867,1868,1871,1872,1875,1876,1878],{},[360,1866,1817],{}," re-récupère chaque page dans la fenêtre courante en utilisant ses ",[360,1869,1870],{},"pageParams"," originaux, en préservant le nombre de pages. Il signale sa progression via ",[360,1873,1874],{},"isFetchingNextPage: true"," sur l'état ",[360,1877,407],{}," existant : les données existantes restent visibles.",[348,1880,1881],{},"L'invalidation peut également se faire depuis n'importe où dans l'application :",[381,1883,1886],{"className":417,"code":1884,"filename":1885,"language":420,"meta":387,"style":387},"client.invalidateInfiniteQuery(['posts']);\n// L'observer détecte InfiniteInitial et refetch automatiquement\n","anywhere.dart",[360,1887,1888,1908],{"__ignoreMap":387},[424,1889,1890,1893,1895,1898,1901,1903,1906],{"class":426,"line":427},[424,1891,1892],{"class":434},"client",[424,1894,371],{"class":438},[424,1896,1897],{"class":520},"invalidateInfiniteQuery",[424,1899,1900],{"class":434},"([",[424,1902,493],{"class":492},[424,1904,1905],{"class":434},"])",[424,1907,636],{"class":438},[424,1909,1910],{"class":426,"line":466},[424,1911,1912],{"class":565},"// L'observer détecte InfiniteInitial et refetch automatiquement\n",[373,1914],{},[376,1916,182],{"id":1917},"gestion-des-erreurs",[348,1919,1920,1921,1923,1924,1926,1927,1930,1931,616],{},"Les erreurs lors de ",[360,1922,884],{}," ou ",[360,1925,1625],{}," transitionnent vers ",[360,1928,1929],{},"InfiniteFailure"," tout en préservant ",[360,1932,1933],{},"previousData",[381,1935,1937],{"className":417,"code":1936,"filename":419,"language":420,"meta":387,"style":387},"case InfiniteFailure(:final error, :final previousData):\n  if (previousData != null) {\n    // Afficher le contenu existant + une bannière d'erreur\n    return Column(children: [\n      PostList(items: previousData.flatten((p) => p)),\n      ErrorBanner(message: 'Échec du chargement : $error'),\n    ]);\n  }\n  // Pas encore de données chargées : afficher l'écran d'erreur complet\n  return ErrorScreen(error);\n",[360,1938,1939,1966,1983,1988,2003,2030,2057,2064,2068,2073],{"__ignoreMap":387},[424,1940,1941,1944,1946,1948,1950,1952,1955,1957,1959,1961,1964],{"class":426,"line":427},[424,1942,1943],{"class":655},"case",[424,1945,825],{"class":442},[424,1947,752],{"class":434},[424,1949,472],{"class":438},[424,1951,431],{"class":430},[424,1953,1954],{"class":434}," error",[424,1956,580],{"class":438},[424,1958,616],{"class":438},[424,1960,431],{"class":430},[424,1962,1963],{"class":434}," previousData)",[424,1965,731],{"class":438},[424,1967,1968,1971,1974,1977,1980],{"class":426,"line":466},[424,1969,1970],{"class":655},"  if",[424,1972,1973],{"class":434}," (previousData ",[424,1975,1976],{"class":438},"!=",[424,1978,1979],{"class":438}," null",[424,1981,1982],{"class":434},") {\n",[424,1984,1985],{"class":426,"line":481},[424,1986,1987],{"class":565},"    // Afficher le contenu existant + une bannière d'erreur\n",[424,1989,1990,1992,1995,1998,2000],{"class":426,"line":501},[424,1991,1472],{"class":655},[424,1993,1994],{"class":442}," Column",[424,1996,1997],{"class":434},"(children",[424,1999,472],{"class":438},[424,2001,2002],{"class":434}," [\n",[424,2004,2005,2008,2011,2013,2016,2018,2020,2023,2025,2028],{"class":426,"line":534},[424,2006,2007],{"class":442},"      PostList",[424,2009,2010],{"class":434},"(items",[424,2012,472],{"class":438},[424,2014,2015],{"class":434}," previousData",[424,2017,371],{"class":438},[424,2019,788],{"class":520},[424,2021,2022],{"class":434},"((p) ",[424,2024,512],{"class":438},[424,2026,2027],{"class":434}," p))",[424,2029,478],{"class":438},[424,2031,2032,2035,2038,2040,2043,2046,2050,2053,2055],{"class":426,"line":548},[424,2033,2034],{"class":442},"      ErrorBanner",[424,2036,2037],{"class":434},"(message",[424,2039,472],{"class":438},[424,2041,2042],{"class":492}," 'Échec du chargement : ",[424,2044,2045],{"class":434},"$",[424,2047,2049],{"class":2048},"sHdIc","error",[424,2051,2052],{"class":492},"'",[424,2054,633],{"class":434},[424,2056,478],{"class":438},[424,2058,2059,2062],{"class":426,"line":562},[424,2060,2061],{"class":434},"    ])",[424,2063,636],{"class":438},[424,2065,2066],{"class":426,"line":569},[424,2067,853],{"class":434},[424,2069,2070],{"class":426,"line":589},[424,2071,2072],{"class":565},"  // Pas encore de données chargées : afficher l'écran d'erreur complet\n",[424,2074,2075,2078,2081,2083],{"class":426,"line":622},[424,2076,2077],{"class":655},"  return",[424,2079,2080],{"class":442}," ErrorScreen",[424,2082,845],{"class":434},[424,2084,636],{"class":438},[348,2086,2087,2088,2091,2092,371],{},"Le retry est automatique pour les fetchs de pages (contrôlé par ",[360,2089,2090],{},"baseOptions.retryCount",", défaut 3). Pour le binding Flutter, voir ",[2093,2094,2096],"a",{"href":2095},"../flutter-integration/infinite-query-builder",[360,2097,118],{},[373,2099],{},[376,2101,148],{"id":2102},"mises-à-jour-optimistes",[348,2104,2105],{},"Écriture directe dans le cache infini pour un retour UI immédiat :",[381,2107,2109],{"className":417,"code":2108,"filename":419,"language":420,"meta":387,"style":387},"// Snapshot avant la mutation\nfinal snapshot = client.getInfiniteQueryData\u003CList\u003CPost>, int>(['posts']);\n\n// Prépendre optimistement le nouveau post à la première page\nif (snapshot != null) {\n  final optimisticData = InfiniteData\u003CList\u003CPost>, int>(\n    pages: [\n      [Post.optimistic(title), ...snapshot.pages.first],\n      ...snapshot.pages.skip(1),\n    ],\n    pageParams: snapshot.pageParams,\n  );\n  client.setInfiniteQueryData(['posts'], optimisticData);\n}\n\ntry {\n  await api.createPost(title);\n  client.invalidateInfiniteQuery(['posts']);\n} catch (_) {\n  // Rollback\n  if (snapshot != null) client.setInfiniteQueryData(['posts'], snapshot);\n}\n",[360,2110,2111,2116,2153,2157,2162,2176,2203,2212,2246,2270,2277,2293,2299,2321,2326,2330,2338,2353,2369,2380,2385,2415],{"__ignoreMap":387},[424,2112,2113],{"class":426,"line":427},[424,2114,2115],{"class":565},"// Snapshot avant la mutation\n",[424,2117,2118,2120,2123,2125,2127,2129,2132,2134,2136,2138,2140,2142,2144,2147,2149,2151],{"class":426,"line":466},[424,2119,431],{"class":430},[424,2121,2122],{"class":434}," snapshot ",[424,2124,439],{"class":438},[424,2126,475],{"class":434},[424,2128,371],{"class":438},[424,2130,2131],{"class":520},"getInfiniteQueryData",[424,2133,446],{"class":434},[424,2135,449],{"class":442},[424,2137,446],{"class":434},[424,2139,454],{"class":442},[424,2141,457],{"class":434},[424,2143,460],{"class":442},[424,2145,2146],{"class":434},">([",[424,2148,493],{"class":492},[424,2150,1905],{"class":434},[424,2152,636],{"class":438},[424,2154,2155],{"class":426,"line":481},[424,2156,643],{"emptyLinePlaceholder":642},[424,2158,2159],{"class":426,"line":501},[424,2160,2161],{"class":565},"// Prépendre optimistement le nouveau post à la première page\n",[424,2163,2164,2167,2170,2172,2174],{"class":426,"line":534},[424,2165,2166],{"class":655},"if",[424,2168,2169],{"class":434}," (snapshot ",[424,2171,1976],{"class":438},[424,2173,1979],{"class":438},[424,2175,1982],{"class":434},[424,2177,2178,2181,2184,2186,2189,2191,2193,2195,2197,2199,2201],{"class":426,"line":548},[424,2179,2180],{"class":430},"  final",[424,2182,2183],{"class":434}," optimisticData ",[424,2185,439],{"class":438},[424,2187,2188],{"class":442}," InfiniteData",[424,2190,446],{"class":434},[424,2192,449],{"class":442},[424,2194,446],{"class":434},[424,2196,454],{"class":442},[424,2198,457],{"class":434},[424,2200,460],{"class":442},[424,2202,463],{"class":434},[424,2204,2205,2208,2210],{"class":426,"line":562},[424,2206,2207],{"class":434},"    pages",[424,2209,472],{"class":438},[424,2211,2002],{"class":434},[424,2213,2214,2217,2219,2221,2224,2226,2228,2231,2234,2236,2239,2241,2244],{"class":426,"line":569},[424,2215,2216],{"class":434},"      [",[424,2218,454],{"class":442},[424,2220,371],{"class":438},[424,2222,2223],{"class":520},"optimistic",[424,2225,1841],{"class":434},[424,2227,580],{"class":438},[424,2229,2230],{"class":438}," ...",[424,2232,2233],{"class":434},"snapshot",[424,2235,371],{"class":438},[424,2237,2238],{"class":434},"pages",[424,2240,371],{"class":438},[424,2242,2243],{"class":434},"first]",[424,2245,478],{"class":438},[424,2247,2248,2251,2253,2255,2257,2259,2262,2264,2266,2268],{"class":426,"line":589},[424,2249,2250],{"class":438},"      ...",[424,2252,2233],{"class":434},[424,2254,371],{"class":438},[424,2256,2238],{"class":434},[424,2258,371],{"class":438},[424,2260,2261],{"class":520},"skip",[424,2263,752],{"class":434},[424,2265,1140],{"class":556},[424,2267,633],{"class":434},[424,2269,478],{"class":438},[424,2271,2272,2275],{"class":426,"line":622},[424,2273,2274],{"class":434},"    ]",[424,2276,478],{"class":438},[424,2278,2279,2282,2284,2287,2289,2291],{"class":426,"line":630},[424,2280,2281],{"class":434},"    pageParams",[424,2283,472],{"class":438},[424,2285,2286],{"class":434}," snapshot",[424,2288,371],{"class":438},[424,2290,1870],{"class":434},[424,2292,478],{"class":438},[424,2294,2295,2297],{"class":426,"line":639},[424,2296,625],{"class":434},[424,2298,636],{"class":438},[424,2300,2301,2303,2305,2308,2310,2312,2314,2316,2319],{"class":426,"line":646},[424,2302,469],{"class":434},[424,2304,371],{"class":438},[424,2306,2307],{"class":520},"setInfiniteQueryData",[424,2309,1900],{"class":434},[424,2311,493],{"class":492},[424,2313,496],{"class":434},[424,2315,580],{"class":438},[424,2317,2318],{"class":434}," optimisticData)",[424,2320,636],{"class":438},[424,2322,2323],{"class":426,"line":652},[424,2324,2325],{"class":434},"}\n",[424,2327,2328],{"class":426,"line":672},[424,2329,643],{"emptyLinePlaceholder":642},[424,2331,2332,2335],{"class":426,"line":677},[424,2333,2334],{"class":655},"try",[424,2336,2337],{"class":434}," {\n",[424,2339,2340,2343,2345,2347,2349,2351],{"class":426,"line":683},[424,2341,2342],{"class":655},"  await",[424,2344,515],{"class":434},[424,2346,371],{"class":438},[424,2348,1838],{"class":520},[424,2350,1841],{"class":434},[424,2352,636],{"class":438},[424,2354,2355,2357,2359,2361,2363,2365,2367],{"class":426,"line":702},[424,2356,469],{"class":434},[424,2358,371],{"class":438},[424,2360,1897],{"class":520},[424,2362,1900],{"class":434},[424,2364,493],{"class":492},[424,2366,1905],{"class":434},[424,2368,636],{"class":438},[424,2370,2371,2374,2377],{"class":426,"line":711},[424,2372,2373],{"class":434},"} ",[424,2375,2376],{"class":655},"catch",[424,2378,2379],{"class":434}," (_) {\n",[424,2381,2382],{"class":426,"line":734},[424,2383,2384],{"class":565},"  // Rollback\n",[424,2386,2387,2389,2391,2393,2395,2398,2400,2402,2404,2406,2408,2410,2413],{"class":426,"line":744},[424,2388,1970],{"class":655},[424,2390,2169],{"class":434},[424,2392,1976],{"class":438},[424,2394,1979],{"class":438},[424,2396,2397],{"class":434},") client",[424,2399,371],{"class":438},[424,2401,2307],{"class":520},[424,2403,1900],{"class":434},[424,2405,493],{"class":492},[424,2407,496],{"class":434},[424,2409,580],{"class":438},[424,2411,2412],{"class":434}," snapshot)",[424,2414,636],{"class":438},[424,2416,2417],{"class":426,"line":773},[424,2418,2325],{"class":434},[373,2420],{},[376,2422,2424],{"id":2423},"étapes-suivantes","Étapes suivantes",[1761,2426,2427,2432,2439],{},[1764,2428,2429,2431],{},[2093,2430,118],{"href":2095}," : Lier les requêtes infinies à l'UI Flutter en un seul widget",[1764,2433,2434,2438],{},[2093,2435,2437],{"href":2436},"../api-reference/infinite-query","Référence API Requêtes Infinies"," : Documentation API complète",[1764,2440,2441,2445],{},[2093,2442,2444],{"href":2443},"./mutations","Guide des Mutations"," : Combiner les mutations avec l'invalidation du cache",[2447,2448,2449],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .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 .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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":387,"searchDepth":466,"depth":466,"links":2451},[2452,2453,2454,2458,2459,2464,2465,2467,2468,2469,2470],{"id":378,"depth":466,"text":379},{"id":413,"depth":466,"text":414},{"id":918,"depth":466,"text":921,"children":2455},[2456],{"id":1005,"depth":481,"text":2457},"flatten : des pages aux éléments",{"id":1090,"depth":466,"text":1093},{"id":1220,"depth":466,"text":1221,"children":2460},[2461,2462,2463],{"id":1224,"depth":481,"text":1225},{"id":1307,"depth":481,"text":1308},{"id":1374,"depth":481,"text":1375},{"id":1508,"depth":466,"text":1509},{"id":1657,"depth":466,"text":2466},"Pagination fenêtrée (maxPages)",{"id":1810,"depth":466,"text":1811},{"id":1917,"depth":466,"text":182},{"id":2102,"depth":466,"text":148},{"id":2423,"depth":466,"text":2424},"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.","md",null,{},{"icon":121},{"title":2477,"description":2478},"Requêtes infinies - Qora","Implémenter la pagination avant et bidirectionnelle avec InfiniteQueryObserver. Chargement au scroll, pull-to-refresh, pagination fenêtrée pour les fils de type Twitter.","4XSL7AOeuJ_iUCV17vQIwdcYbOPrUF2KUipC14leTtU",[2481,2483],{"title":158,"path":159,"stem":160,"description":2482,"icon":161,"children":-1},"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.",{"title":167,"path":168,"stem":169,"description":2484,"icon":170,"children":-1},"Utiliser QoraOptions.dependsOn pour chaîner les requêtes de sorte qu'une ne se déclenche qu'après la résolution d'une autre.",1794040408687]