[{"data":1,"prerenderedAt":3002},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-getting-started-coming-from-tanstack-query":342,"-fr-getting-started-coming-from-tanstack-query-surround":2997},[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":30,"body":344,"description":2988,"extension":2989,"links":2990,"meta":2991,"navigation":2992,"path":31,"seo":2993,"stem":32,"__hash__":2996},"docs_fr/fr/01.getting-started/6.coming-from-tanstack-query.md",{"type":345,"value":346,"toc":2958},"minimark",[347,351,354,359,531,533,537,542,909,913,1127,1129,1133,1136,1323,1327,1497,1499,1508,1693,1695,1699,1703,1718,1949,1966,1968,1974,1991,2083,2091,2093,2099,2117,2120,2414,2416,2424,2430,2432,2436,2444,2475,2490,2492,2504,2525,2527,2531,2545,2647,2653,2655,2659,2669,2671,2674,2893,2895,2898,2908,2915,2917,2921,2954],[348,349,350],"p",{},"Qora partage le même modèle conceptuel que TanStack Query : clés de requête, stale-while-revalidate, refetch en arrière-plan, hooks de cycle de vie des mutations et pause-et-replay hors-ligne. La plupart des concepts se traduisent directement. Cette page met en correspondance ce que vous connaissez déjà avec l'API Qora.",[352,353],"hr",{},[355,356,358],"h2",{"id":357},"correspondance-des-concepts","Correspondance des concepts",[360,361,362,375],"table",{},[363,364,365],"thead",{},[366,367,368,372],"tr",{},[369,370,371],"th",{},"Concept TanStack Query",[369,373,374],{},"Équivalent Qora",[376,377,378,391,402,419,432,445,461,477,492,507,518],"tbody",{},[366,379,380,387],{},[381,382,383],"td",{},[384,385,386],"code",{},"QueryClient",[381,388,389],{},[384,390,202],{},[366,392,393,398],{},[381,394,395],{},[384,396,397],{},"QueryClientProvider",[381,399,400],{},[384,401,103],{},[366,403,404,409],{},[381,405,406],{},[384,407,408],{},"useQuery",[381,410,411,414,415,418],{},[384,412,413],{},"QoraBuilder\u003CT>"," (widget) ou ",[384,416,417],{},"useQuery\u003CT>"," (hook)",[366,420,421,426],{},[381,422,423],{},[384,424,425],{},"useMutation",[381,427,428,414,430,418],{},[384,429,113],{},[384,431,425],{},[366,433,434,439],{},[381,435,436],{},[384,437,438],{},"useInfiniteQuery",[381,440,441,414,443,418],{},[384,442,118],{},[384,444,438],{},[366,446,447,452],{},[381,448,449],{},[384,450,451],{},"useQueryClient",[381,453,454,457,458,418],{},[384,455,456],{},"context.qora"," / ",[384,459,460],{},"useQueryClient()",[366,462,463,468],{},[381,464,465],{},[384,466,467],{},"useIsFetching",[381,469,470,473,474],{},[384,471,472],{},"useIsFetching()"," (hook) ou ",[384,475,476],{},"client.fetchingCountStream",[366,478,479,484],{},[381,480,481],{},[384,482,483],{},"useIsMutating",[381,485,486,473,489],{},[384,487,488],{},"useIsMutating()",[384,490,491],{},"client.activeMutations",[366,493,494,499],{},[381,495,496],{},[384,497,498],{},"QueryObserver",[381,500,501,457,504],{},[384,502,503],{},"client.watchQuery\u003CT>",[384,505,506],{},"InfiniteQueryObserver",[366,508,509,514],{},[381,510,511],{},[384,512,513],{},"persistQueryClient",[381,515,516],{},[384,517,229],{},[366,519,520,525],{},[381,521,522],{},[384,523,524],{},"DevTools",[381,526,527,530],{},[384,528,529],{},"qora_devtools_overlay"," (in-app)",[352,532],{},[355,534,536],{"id":535},"référence-api-requêtes","Référence API : requêtes",[538,539,541],"h3",{"id":540},"options","Options",[360,543,544,556],{},[363,545,546],{},[366,547,548,551,553],{},[369,549,550],{},"Option TanStack Query",[369,552,374],{},[369,554,555],{},"Notes",[376,557,558,576,591,605,623,642,661,681,699,715,736,750,774,800,814,850,868,882,896],{},[366,559,560,565,569],{},[381,561,562],{},[384,563,564],{},"queryKey",[381,566,567],{},[384,568,564],{},[381,570,571,572,575],{},"Même concept. TanStack utilise des tableaux ; Qora utilise ",[384,573,574],{},"List\u003Cdynamic>",". Égalité structurelle dans les deux.",[366,577,578,583,588],{},[381,579,580],{},[384,581,582],{},"queryFn",[381,584,585],{},[384,586,587],{},"fetcher",[381,589,590],{},"Même rôle. Renommé.",[366,592,593,598,602],{},[381,594,595],{},[384,596,597],{},"enabled",[381,599,600],{},[384,601,597],{},[381,603,604],{},"Identique.",[366,606,607,612,616],{},[381,608,609],{},[384,610,611],{},"staleTime",[381,613,614],{},[384,615,611],{},[381,617,618,619,622],{},"Identique. ",[384,620,621],{},"Duration.zero"," = toujours périmé.",[366,624,625,635,639],{},[381,626,627,630,631,634],{},[384,628,629],{},"gcTime"," (",[384,632,633],{},"cacheTime"," en v4)",[381,636,637],{},[384,638,629],{},[381,640,641],{},"Désormais identique à la v5.",[366,643,644,649,654],{},[381,645,646],{},[384,647,648],{},"retry",[381,650,651],{},[384,652,653],{},"retryCount",[381,655,656,657,660],{},"Renommé. Valeur par défaut ",[384,658,659],{},"3"," dans les deux.",[366,662,663,668,675],{},[381,664,665],{},[384,666,667],{},"retryDelay",[381,669,670,457,672],{},[384,671,667],{},[384,673,674],{},"retryDelayCalculator",[381,676,677,678,680],{},"Backoff exponentiel par défaut. ",[384,679,674],{}," accepte une fonction recevant l'index de tentative.",[366,682,683,688,692],{},[381,684,685],{},[384,686,687],{},"refetchOnWindowFocus",[381,689,690],{},[384,691,687],{},[381,693,694,695,698],{},"Identique. Nécessite ",[384,696,697],{},"FlutterLifecycleManager",".",[366,700,701,706,710],{},[381,702,703],{},[384,704,705],{},"refetchOnReconnect",[381,707,708],{},[384,709,705],{},[381,711,694,712,698],{},[384,713,714],{},"FlutterConnectivityManager",[366,716,717,722,726],{},[381,718,719],{},[384,720,721],{},"refetchOnMount",[381,723,724],{},[384,725,721],{},[381,727,728,729,732,733,698],{},"Sémantique identique. ",[384,730,731],{},"null"," hérite de ",[384,734,735],{},"QoraClientConfig.refetchOnMount",[366,737,738,743,747],{},[381,739,740],{},[384,741,742],{},"refetchInterval",[381,744,745],{},[384,746,742],{},[381,748,749],{},"Identique. Actif tant qu'au moins un abonné est présent.",[366,751,752,757,761],{},[381,753,754],{},[384,755,756],{},"networkMode",[381,758,759],{},[384,760,756],{},[381,762,763,764,767,768,767,771,698],{},"Même nom, mêmes trois valeurs : ",[384,765,766],{},"online",", ",[384,769,770],{},"always",[384,772,773],{},"offlineFirst",[366,775,776,781,792],{},[381,777,778],{},[384,779,780],{},"select",[381,782,783,785,786,457,789],{},[384,784,780],{}," (filtre de rebuild) / ",[384,787,788],{},"transform",[384,790,791],{},"state.map()",[381,793,794,795,698],{},"Sémantique différente, voir ",[796,797,799],"a",{"href":798},"#select-filtre-les-rebuilds-il-ne-transforme-pas","plus bas",[366,801,802,807,811],{},[381,803,804],{},[384,805,806],{},"placeholderData",[381,808,809],{},[384,810,806],{},[381,812,813],{},"Une fonction qui renvoie un placeholder, par exemple depuis une autre requête en cache.",[366,815,816,821,837],{},[381,817,818],{},[384,819,820],{},"placeholderData: keepPreviousData",[381,822,823,826,827,457,830,833,834],{},[384,824,825],{},"previousData"," sur ",[384,828,829],{},"Loading",[384,831,832],{},"Failure",", ou ",[384,835,836],{},"keepPreviousData: true",[381,838,839,841,842,845,846,849],{},[384,840,825],{}," est toujours présent. ",[384,843,844],{},"keepPreviousData"," garde l'entrée en ",[384,847,848],{},"Success"," pendant un refetch.",[366,851,852,857,861],{},[381,853,854],{},[384,855,856],{},"initialData",[381,858,859],{},[384,860,856],{},[381,862,863,864,867],{},"Injecté avant la première frame. ",[384,865,866],{},"client.hydrateQuery\u003CT>(key, data)"," fait la même chose de façon impérative.",[366,869,870,875,879],{},[381,871,872],{},[384,873,874],{},"initialDataUpdatedAt",[381,876,877],{},[384,878,874],{},[381,880,881],{},"Vaut l'epoch par défaut : les données initiales sont périmées et refetchées au montage.",[366,883,884,889,893],{},[381,885,886],{},[384,887,888],{},"structuralSharing",[381,890,891],{},[384,892,888],{},[381,894,895],{},"Activé par défaut. Les données imbriquées inchangées gardent leur identité d'un fetch à l'autre.",[366,897,898,903,906],{},[381,899,900],{},[384,901,902],{},"notifyOnChangeProps",[381,904,905],{},"Non disponible",[381,907,908],{},"Toutes les transitions d'état émettent sur le stream.",[538,910,912],{"id":911},"valeurs-de-retour","Valeurs de retour",[360,914,915,924],{},[363,916,917],{},[366,918,919,922],{},[369,920,921],{},"Champ TanStack Query",[369,923,374],{},[376,925,926,942,954,966,978,990,1002,1014,1025,1037,1049,1061,1077,1092,1108,1118],{},[366,927,928,933],{},[381,929,930],{},[384,931,932],{},"status: 'pending'",[381,934,935,938,939],{},[384,936,937],{},"state is Initial"," ou ",[384,940,941],{},"state is Loading(previousData: null)",[366,943,944,949],{},[381,945,946],{},[384,947,948],{},"status: 'error'",[381,950,951],{},[384,952,953],{},"state is Failure",[366,955,956,961],{},[381,957,958],{},[384,959,960],{},"status: 'success'",[381,962,963],{},[384,964,965],{},"state is Success",[366,967,968,973],{},[381,969,970],{},[384,971,972],{},"fetchStatus: 'fetching'",[381,974,975],{},[384,976,977],{},"fetchStatus == FetchStatus.fetching",[366,979,980,985],{},[381,981,982],{},[384,983,984],{},"fetchStatus: 'paused'",[381,986,987],{},[384,988,989],{},"fetchStatus == FetchStatus.paused",[366,991,992,997],{},[381,993,994],{},[384,995,996],{},"fetchStatus: 'idle'",[381,998,999],{},[384,1000,1001],{},"fetchStatus == FetchStatus.idle",[366,1003,1004,1009],{},[381,1005,1006],{},[384,1007,1008],{},"isLoading",[381,1010,1011],{},[384,1012,1013],{},"state.isLoading",[366,1015,1016,1021],{},[381,1017,1018],{},[384,1019,1020],{},"isFetching",[381,1022,1023],{},[384,1024,977],{},[366,1026,1027,1032],{},[381,1028,1029],{},[384,1030,1031],{},"isError",[381,1033,1034],{},[384,1035,1036],{},"state.isError",[366,1038,1039,1044],{},[381,1040,1041],{},[384,1042,1043],{},"isSuccess",[381,1045,1046],{},[384,1047,1048],{},"state.isSuccess",[366,1050,1051,1056],{},[381,1052,1053],{},[384,1054,1055],{},"isPending",[381,1057,1058],{},[384,1059,1060],{},"state is Initial || state is Loading(previousData: null)",[366,1062,1063,1068],{},[381,1064,1065],{},[384,1066,1067],{},"data",[381,1069,1070,938,1073,1076],{},[384,1071,1072],{},"state.dataOrNull",[384,1074,1075],{},"Success(:final data)"," via correspondance de motifs",[366,1078,1079,1084],{},[381,1080,1081],{},[384,1082,1083],{},"error",[381,1085,1086,938,1089,1076],{},[384,1087,1088],{},"state.errorOrNull",[384,1090,1091],{},"Failure(:final error)",[366,1093,1094,1099],{},[381,1095,1096],{},[384,1097,1098],{},"dataUpdatedAt",[381,1100,1101,1104,1105,1107],{},[384,1102,1103],{},"state.updatedAt"," (extension, non-null uniquement sur ",[384,1106,848],{},")",[366,1109,1110,1115],{},[381,1111,1112],{},[384,1113,1114],{},"errorUpdatedAt",[381,1116,1117],{},"Non disponible comme champ séparé",[366,1119,1120,1125],{},[381,1121,1122],{},[384,1123,1124],{},"isFetchedAfterMount",[381,1126,905],{},[352,1128],{},[355,1130,1132],{"id":1131},"référence-api-mutations","Référence API : mutations",[538,1134,541],{"id":1135},"options-1",[360,1137,1138,1148],{},[363,1139,1140],{},[366,1141,1142,1144,1146],{},[369,1143,550],{},[369,1145,374],{},[369,1147,555],{},[376,1149,1150,1165,1183,1201,1218,1235,1252,1266,1284,1300],{},[366,1151,1152,1157,1162],{},[381,1153,1154],{},[384,1155,1156],{},"mutationFn",[381,1158,1159],{},[384,1160,1161],{},"mutator",[381,1163,1164],{},"Renommé.",[366,1166,1167,1172,1177],{},[381,1168,1169],{},[384,1170,1171],{},"onMutate",[381,1173,1174],{},[384,1175,1176],{},"MutationOptions.onMutate",[381,1178,1179,1180,698],{},"Même rôle. La valeur de retour devient ",[384,1181,1182],{},"TContext",[366,1184,1185,1190,1195],{},[381,1186,1187],{},[384,1188,1189],{},"onSuccess",[381,1191,1192],{},[384,1193,1194],{},"MutationOptions.onSuccess",[381,1196,1197,1198,698],{},"Même rôle. Signature : ",[384,1199,1200],{},"(TData, TVariables, TContext?)",[366,1202,1203,1208,1213],{},[381,1204,1205],{},[384,1206,1207],{},"onError",[381,1209,1210],{},[384,1211,1212],{},"MutationOptions.onError",[381,1214,1197,1215,698],{},[384,1216,1217],{},"(Object, TVariables, TContext?)",[366,1219,1220,1225,1230],{},[381,1221,1222],{},[384,1223,1224],{},"onSettled",[381,1226,1227],{},[384,1228,1229],{},"MutationOptions.onSettled",[381,1231,1197,1232,698],{},[384,1233,1234],{},"(TData?, Object?, TVariables, TContext?)",[366,1236,1237,1241,1246],{},[381,1238,1239],{},[384,1240,648],{},[381,1242,1243],{},[384,1244,1245],{},"MutationOptions.retryCount",[381,1247,656,1248,1251],{},[384,1249,1250],{},"0"," (pas de retry).",[366,1253,1254,1258,1263],{},[381,1255,1256],{},[384,1257,667],{},[381,1259,1260],{},[384,1261,1262],{},"MutationOptions.retryDelay",[381,1264,1265],{},"Backoff exponentiel.",[366,1267,1268,1272,1277],{},[381,1269,1270],{},[384,1271,756],{},[381,1273,1274],{},[384,1275,1276],{},"MutationOptions.networkMode",[381,1278,1279,1280,1283],{},"Mêmes valeurs. Ajouter ",[384,1281,1282],{},"offlineQueue: true"," pour mettre en file les écritures faites hors-ligne et les rejouer à la reconnexion.",[366,1285,1286,1291,1297],{},[381,1287,1288],{},[384,1289,1290],{},"variables",[381,1292,1293,1294],{},"Paramètre de type ",[384,1295,1296],{},"TVariables",[381,1298,1299],{},"Même concept.",[366,1301,1302,1308,1312],{},[381,1303,1304,1307],{},[384,1305,1306],{},"context"," (snapshot de rollback)",[381,1309,1293,1310],{},[384,1311,1182],{},[381,1313,1314,1315,1317,1318,1320,1321,698],{},"Même concept. Retourné par ",[384,1316,1171],{},", transmis à ",[384,1319,1207],{},"/",[384,1322,1224],{},[538,1324,1326],{"id":1325},"valeurs-de-retour-state","Valeurs de retour / state",[360,1328,1329,1337],{},[363,1330,1331],{},[366,1332,1333,1335],{},[369,1334,921],{},[369,1336,374],{},[376,1338,1339,1351,1362,1373,1384,1396,1407,1417,1427,1437,1447,1458,1470,1482],{},[366,1340,1341,1346],{},[381,1342,1343],{},[384,1344,1345],{},"status: 'idle'",[381,1347,1348],{},[384,1349,1350],{},"state is MutationIdle",[366,1352,1353,1357],{},[381,1354,1355],{},[384,1356,932],{},[381,1358,1359],{},[384,1360,1361],{},"state is MutationPending",[366,1363,1364,1368],{},[381,1365,1366],{},[384,1367,948],{},[381,1369,1370],{},[384,1371,1372],{},"state is MutationFailure",[366,1374,1375,1379],{},[381,1376,1377],{},[384,1378,960],{},[381,1380,1381],{},[384,1382,1383],{},"state is MutationSuccess",[366,1385,1386,1391],{},[381,1387,1388],{},[384,1389,1390],{},"isIdle",[381,1392,1393],{},[384,1394,1395],{},"state.isIdle",[366,1397,1398,1402],{},[381,1399,1400],{},[384,1401,1055],{},[381,1403,1404],{},[384,1405,1406],{},"state.isPending",[366,1408,1409,1413],{},[381,1410,1411],{},[384,1412,1031],{},[381,1414,1415],{},[384,1416,1036],{},[366,1418,1419,1423],{},[381,1420,1421],{},[384,1422,1043],{},[381,1424,1425],{},[384,1426,1048],{},[366,1428,1429,1433],{},[381,1430,1431],{},[384,1432,1067],{},[381,1434,1435],{},[384,1436,1072],{},[366,1438,1439,1443],{},[381,1440,1441],{},[384,1442,1083],{},[381,1444,1445],{},[384,1446,1088],{},[366,1448,1449,1453],{},[381,1450,1451],{},[384,1452,1290],{},[381,1454,1455],{},[384,1456,1457],{},"state.variablesOrNull",[366,1459,1460,1465],{},[381,1461,1462],{},[384,1463,1464],{},"mutate(variables)",[381,1466,1467,1469],{},[384,1468,1464],{},": fire-and-forget, erreurs capturées dans le state",[366,1471,1472,1477],{},[381,1473,1474],{},[384,1475,1476],{},"mutateAsync(variables)",[381,1478,1479,1481],{},[384,1480,1476],{},": awaitable, erreurs propagées",[366,1483,1484,1489],{},[381,1485,1486],{},[384,1487,1488],{},"reset()",[381,1490,1491,1493,1494],{},[384,1492,1488],{},": transitions vers ",[384,1495,1496],{},"MutationIdle",[352,1498],{},[355,1500,1502,1503,1505,1506],{"id":1501},"référence-api-queryclient-vers-qoraclient","Référence API : ",[384,1504,386],{}," vers ",[384,1507,202],{},[360,1509,1510,1519],{},[363,1511,1512],{},[366,1513,1514,1517],{},[369,1515,1516],{},"Méthode TanStack Query",[369,1518,374],{},[376,1520,1521,1533,1548,1560,1576,1591,1603,1618,1628,1641,1654,1666,1682],{},[366,1522,1523,1528],{},[381,1524,1525],{},[384,1526,1527],{},"invalidateQueries({ queryKey })",[381,1529,1530],{},[384,1531,1532],{},"client.invalidate(key)",[366,1534,1535,1540],{},[381,1536,1537],{},[384,1538,1539],{},"invalidateQueries(filter)",[381,1541,1542,938,1545],{},[384,1543,1544],{},"client.invalidateWhere(predicate)",[384,1546,1547],{},"client.invalidateQueries(filter)",[366,1549,1550,1555],{},[381,1551,1552],{},[384,1553,1554],{},"setQueryData(queryKey, updater)",[381,1556,1557],{},[384,1558,1559],{},"client.setQueryData\u003CT>(key, data)",[366,1561,1562,1567],{},[381,1563,1564],{},[384,1565,1566],{},"getQueryData(queryKey)",[381,1568,1569,1572,1573],{},[384,1570,1571],{},"client.getQueryData\u003CT>(key)",": retourne ",[384,1574,1575],{},"T?",[366,1577,1578,1583],{},[381,1579,1580],{},[384,1581,1582],{},"getQueryState(queryKey)",[381,1584,1585,1572,1588],{},[384,1586,1587],{},"client.getQueryState\u003CT>(key)",[384,1589,1590],{},"QoraState\u003CT>",[366,1592,1593,1598],{},[381,1594,1595],{},[384,1596,1597],{},"prefetchQuery",[381,1599,1600],{},[384,1601,1602],{},"client.prefetch\u003CT>(key, fetcher, options)",[366,1604,1605,1610],{},[381,1606,1607],{},[384,1608,1609],{},"resetQueries",[381,1611,1612,938,1615],{},[384,1613,1614],{},"client.removeQuery(key)",[384,1616,1617],{},"client.clear()",[366,1619,1620,1625],{},[381,1621,1622],{},[384,1623,1624],{},"cancelQueries",[381,1626,1627],{},"Non disponible dans Qora v1",[366,1629,1630,1635],{},[381,1631,1632],{},[384,1633,1634],{},"isFetching(queryKey)",[381,1636,1637,1640],{},[384,1638,1639],{},"client.isFetchingCount"," (compteur global)",[366,1642,1643,1648],{},[381,1644,1645],{},[384,1646,1647],{},"setDefaultOptions",[381,1649,1650,1653],{},[384,1651,1652],{},"QoraClientConfig.defaultOptions"," (défini à la construction)",[366,1655,1656,1661],{},[381,1657,1658],{},[384,1659,1660],{},"getDefaultOptions",[381,1662,1663],{},[384,1664,1665],{},"client.config.defaultOptions",[366,1667,1668,1676],{},[381,1669,1670,457,1673],{},[384,1671,1672],{},"mount",[384,1674,1675],{},"unmount",[381,1677,1678,1679,1681],{},"Géré par ",[384,1680,103],{}," / cycle de vie des widgets",[366,1683,1684,1689],{},[381,1685,1686],{},[384,1687,1688],{},"clear()",[381,1690,1691],{},[384,1692,1617],{},[352,1694],{},[355,1696,1698],{"id":1697},"différences-clés","Différences clés",[538,1700,1702],{"id":1701},"les-classes-scellées-remplacent-les-chaînes-de-statut","Les classes scellées remplacent les chaînes de statut",[348,1704,1705,1706,1709,1710,767,1712,1714,1715,1717],{},"TanStack Query retourne des objets simples avec des champs ",[384,1707,1708],{},"status"," sous forme de chaîne et des raccourcis booléens (",[384,1711,1008],{},[384,1713,1031],{},", etc.). Qora retourne une classe scellée ",[384,1716,1590],{},". La correspondance de motifs exhaustive de Dart 3 est appliquée à la compilation, éliminant les branches d'état non gérées :",[1719,1720,1726],"pre",{"className":1721,"code":1722,"filename":1723,"language":1724,"meta":1725,"style":1725},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// TanStack Query (React)\nif (isLoading) return \u003CSpinner />;\nif (isError) return \u003CError error={error} />;\nreturn \u003CUserCard user={data} />;\n\n// Qora (Dart 3)\nreturn switch (state) {\n  Initial() || Loading(previousData: null) => const CircularProgressIndicator(),\n  Failure(:final error, previousData: null) => ErrorScreen(error),\n  _ => UserCard(state.dataOrNull!),\n};\n","user_screen.dart","dart","",[384,1727,1728,1737,1762,1789,1809,1816,1822,1833,1876,1914,1940],{"__ignoreMap":1725},[1729,1730,1733],"span",{"class":1731,"line":1732},"line",1,[1729,1734,1736],{"class":1735},"sHwdD","// TanStack Query (React)\n",[1729,1738,1740,1744,1748,1751,1755,1759],{"class":1731,"line":1739},2,[1729,1741,1743],{"class":1742},"s7zQu","if",[1729,1745,1747],{"class":1746},"sTEyZ"," (isLoading) ",[1729,1749,1750],{"class":1742},"return",[1729,1752,1754],{"class":1753},"sMK4o"," \u003C",[1729,1756,1758],{"class":1757},"sBMFI","Spinner",[1729,1760,1761],{"class":1753}," />;\n",[1729,1763,1765,1767,1770,1772,1774,1777,1780,1783,1786],{"class":1731,"line":1764},3,[1729,1766,1743],{"class":1742},[1729,1768,1769],{"class":1746}," (isError) ",[1729,1771,1750],{"class":1742},[1729,1773,1754],{"class":1753},[1729,1775,1776],{"class":1757},"Error",[1729,1778,1779],{"class":1746}," error",[1729,1781,1782],{"class":1753},"=",[1729,1784,1785],{"class":1746},"{error} ",[1729,1787,1788],{"class":1753},"/>;\n",[1729,1790,1792,1794,1796,1799,1802,1804,1807],{"class":1731,"line":1791},4,[1729,1793,1750],{"class":1742},[1729,1795,1754],{"class":1753},[1729,1797,1798],{"class":1757},"UserCard",[1729,1800,1801],{"class":1746}," user",[1729,1803,1782],{"class":1753},[1729,1805,1806],{"class":1746},"{data} ",[1729,1808,1788],{"class":1753},[1729,1810,1812],{"class":1731,"line":1811},5,[1729,1813,1815],{"emptyLinePlaceholder":1814},true,"\n",[1729,1817,1819],{"class":1731,"line":1818},6,[1729,1820,1821],{"class":1735},"// Qora (Dart 3)\n",[1729,1823,1825,1827,1830],{"class":1731,"line":1824},7,[1729,1826,1750],{"class":1742},[1729,1828,1829],{"class":1742}," switch",[1729,1831,1832],{"class":1746}," (state) {\n",[1729,1834,1836,1839,1842,1845,1848,1851,1854,1857,1860,1863,1867,1870,1873],{"class":1731,"line":1835},8,[1729,1837,1838],{"class":1757},"  Initial",[1729,1840,1841],{"class":1746},"() ",[1729,1843,1844],{"class":1753},"||",[1729,1846,1847],{"class":1757}," Loading",[1729,1849,1850],{"class":1746},"(previousData",[1729,1852,1853],{"class":1753},":",[1729,1855,1856],{"class":1753}," null",[1729,1858,1859],{"class":1746},") ",[1729,1861,1862],{"class":1753},"=>",[1729,1864,1866],{"class":1865},"spNyl"," const",[1729,1868,1869],{"class":1757}," CircularProgressIndicator",[1729,1871,1872],{"class":1746},"()",[1729,1874,1875],{"class":1753},",\n",[1729,1877,1879,1882,1885,1887,1890,1892,1895,1898,1900,1902,1904,1906,1909,1912],{"class":1731,"line":1878},9,[1729,1880,1881],{"class":1757},"  Failure",[1729,1883,1884],{"class":1746},"(",[1729,1886,1853],{"class":1753},[1729,1888,1889],{"class":1865},"final",[1729,1891,1779],{"class":1746},[1729,1893,1894],{"class":1753},",",[1729,1896,1897],{"class":1746}," previousData",[1729,1899,1853],{"class":1753},[1729,1901,1856],{"class":1753},[1729,1903,1859],{"class":1746},[1729,1905,1862],{"class":1753},[1729,1907,1908],{"class":1757}," ErrorScreen",[1729,1910,1911],{"class":1746},"(error)",[1729,1913,1875],{"class":1753},[1729,1915,1917,1920,1922,1925,1928,1930,1933,1936,1938],{"class":1731,"line":1916},10,[1729,1918,1919],{"class":1746},"  _ ",[1729,1921,1862],{"class":1753},[1729,1923,1924],{"class":1757}," UserCard",[1729,1926,1927],{"class":1746},"(state",[1729,1929,698],{"class":1753},[1729,1931,1932],{"class":1746},"dataOrNull",[1729,1934,1935],{"class":1753},"!",[1729,1937,1107],{"class":1746},[1729,1939,1875],{"class":1753},[1729,1941,1943,1946],{"class":1731,"line":1942},11,[1729,1944,1945],{"class":1746},"}",[1729,1947,1948],{"class":1753},";\n",[348,1950,1951,1952,1955,1956,767,1958,1961,1962,1965],{},"Le bras ",[384,1953,1954],{},"_"," couvre ",[384,1957,848],{},[384,1959,1960],{},"Loading(previousData != null)"," et ",[384,1963,1964],{},"Failure(previousData != null)"," : tous les cas où les données sont disponibles.",[352,1967],{},[538,1969,1971,1973],{"id":1970},"previousdata-est-toujours-présent",[384,1972,825],{}," est toujours présent",[348,1975,1976,1977,1979,1980,1961,1983,1986,1987,1990],{},"TanStack Query v5 conserve les données précédentes avec ",[384,1978,820],{},". Dans Qora, ",[384,1981,1982],{},"Loading\u003CT>",[384,1984,1985],{},"Failure\u003CT>"," portent toujours ",[384,1988,1989],{},"previousData: T?"," : les données périmées restent accessibles pendant les rafraîchissements en arrière-plan et après une erreur, sans aucune option.",[1719,1992,1994],{"className":1721,"code":1993,"filename":1723,"language":1724,"meta":1725,"style":1725},"// Afficher les données périmées avec un indicateur pendant un rafraîchissement\ncase Loading(:final previousData) when previousData != null:\n  return Stack(children: [\n    UserCard(previousData),\n    const LinearProgressIndicator(minHeight: 2),\n  ]);\n",[384,1995,1996,2001,2029,2045,2055,2076],{"__ignoreMap":1725},[1729,1997,1998],{"class":1731,"line":1732},[1729,1999,2000],{"class":1735},"// Afficher les données périmées avec un indicateur pendant un rafraîchissement\n",[1729,2002,2003,2006,2008,2010,2012,2014,2017,2020,2023,2026],{"class":1731,"line":1739},[1729,2004,2005],{"class":1742},"case",[1729,2007,1847],{"class":1757},[1729,2009,1884],{"class":1746},[1729,2011,1853],{"class":1753},[1729,2013,1889],{"class":1865},[1729,2015,2016],{"class":1746}," previousData) ",[1729,2018,2019],{"class":1742},"when",[1729,2021,2022],{"class":1746}," previousData ",[1729,2024,2025],{"class":1753},"!=",[1729,2027,2028],{"class":1753}," null:\n",[1729,2030,2031,2034,2037,2040,2042],{"class":1731,"line":1764},[1729,2032,2033],{"class":1742},"  return",[1729,2035,2036],{"class":1757}," Stack",[1729,2038,2039],{"class":1746},"(children",[1729,2041,1853],{"class":1753},[1729,2043,2044],{"class":1746}," [\n",[1729,2046,2047,2050,2053],{"class":1731,"line":1791},[1729,2048,2049],{"class":1757},"    UserCard",[1729,2051,2052],{"class":1746},"(previousData)",[1729,2054,1875],{"class":1753},[1729,2056,2057,2060,2063,2066,2068,2072,2074],{"class":1731,"line":1811},[1729,2058,2059],{"class":1865},"    const",[1729,2061,2062],{"class":1757}," LinearProgressIndicator",[1729,2064,2065],{"class":1746},"(minHeight",[1729,2067,1853],{"class":1753},[1729,2069,2071],{"class":2070},"sbssI"," 2",[1729,2073,1107],{"class":1746},[1729,2075,1875],{"class":1753},[1729,2077,2078,2081],{"class":1731,"line":1818},[1729,2079,2080],{"class":1746},"  ])",[1729,2082,1948],{"class":1753},[348,2084,2085,2086,2088,2089,698],{},"Si vous préférez que l'entrée reste en ",[384,2087,848],{}," pendant le refetch, par exemple pour garder un tableau paginé stable, utilisez ",[384,2090,836],{},[352,2092],{},[538,2094,2096,2098],{"id":2095},"select-filtre-les-rebuilds-il-ne-transforme-pas",[384,2097,780],{}," filtre les rebuilds, il ne transforme pas",[348,2100,2101,2102,2104,2105,826,2107,1961,2109,2111,2112,2116],{},"Dans TanStack Query, ",[384,2103,780],{}," transforme les données renvoyées au composant. Dans Qora, ",[384,2106,780],{},[384,2108,108],{},[384,2110,408],{}," décide ",[2113,2114,2115],"strong",{},"quand"," le widget se reconstruit : uniquement quand le type d'état ou la valeur sélectionnée change. L'état reçu est toujours l'état complet.",[348,2118,2119],{},"Pour transformer les données, Qora propose deux outils :",[1719,2121,2124],{"className":1721,"code":2122,"filename":2123,"language":1724,"meta":1725,"style":1725},"// TanStack Query\nuseQuery({ queryKey, queryFn, select: (data) => data.name });\n\n// Qora : transformer une fois, dans le cache (tous les abonnés voient le résultat)\nQoraOptions(transform: (raw) => User.fromJson(raw as Map\u003CString, dynamic>));\n\n// Qora : transformer par consommateur, sur l'état\nfinal nameState = userState.map((user) => user.name);\n// QoraState\u003CUser> → QoraState\u003CString>, previousData compris\n\n// Qora : reconstruire uniquement quand le nom change\nQoraBuilder\u003CUser>(\n  queryKey: ['users', id],\n  fetcher: () => api.getUser(id),\n  select: (user) => user.name,\n  builder: (context, state, _) => Text(state.dataOrNull?.name ?? ''),\n);\n","main.dart",[384,2125,2126,2131,2166,2170,2175,2222,2226,2231,2262,2267,2271,2276,2289,2311,2337,2359,2407],{"__ignoreMap":1725},[1729,2127,2128],{"class":1731,"line":1732},[1729,2129,2130],{"class":1735},"// TanStack Query\n",[1729,2132,2133,2136,2139,2141,2144,2146,2149,2151,2154,2156,2159,2161,2164],{"class":1731,"line":1739},[1729,2134,408],{"class":2135},"s2Zo4",[1729,2137,2138],{"class":1746},"({ queryKey",[1729,2140,1894],{"class":1753},[1729,2142,2143],{"class":1746}," queryFn",[1729,2145,1894],{"class":1753},[1729,2147,2148],{"class":1746}," select",[1729,2150,1853],{"class":1753},[1729,2152,2153],{"class":1746}," (data) ",[1729,2155,1862],{"class":1753},[1729,2157,2158],{"class":1746}," data",[1729,2160,698],{"class":1753},[1729,2162,2163],{"class":1746},"name })",[1729,2165,1948],{"class":1753},[1729,2167,2168],{"class":1731,"line":1764},[1729,2169,1815],{"emptyLinePlaceholder":1814},[1729,2171,2172],{"class":1731,"line":1791},[1729,2173,2174],{"class":1735},"// Qora : transformer une fois, dans le cache (tous les abonnés voient le résultat)\n",[1729,2176,2177,2179,2182,2184,2187,2189,2192,2194,2197,2200,2203,2206,2209,2212,2214,2217,2220],{"class":1731,"line":1811},[1729,2178,215],{"class":1757},[1729,2180,2181],{"class":1746},"(transform",[1729,2183,1853],{"class":1753},[1729,2185,2186],{"class":1746}," (raw) ",[1729,2188,1862],{"class":1753},[1729,2190,2191],{"class":1757}," User",[1729,2193,698],{"class":1753},[1729,2195,2196],{"class":2135},"fromJson",[1729,2198,2199],{"class":1746},"(raw ",[1729,2201,2202],{"class":1753},"as",[1729,2204,2205],{"class":1757}," Map",[1729,2207,2208],{"class":1746},"\u003C",[1729,2210,2211],{"class":1757},"String",[1729,2213,767],{"class":1746},[1729,2215,2216],{"class":1757},"dynamic",[1729,2218,2219],{"class":1746},">))",[1729,2221,1948],{"class":1753},[1729,2223,2224],{"class":1731,"line":1818},[1729,2225,1815],{"emptyLinePlaceholder":1814},[1729,2227,2228],{"class":1731,"line":1824},[1729,2229,2230],{"class":1735},"// Qora : transformer par consommateur, sur l'état\n",[1729,2232,2233,2235,2238,2240,2243,2245,2248,2251,2253,2255,2257,2260],{"class":1731,"line":1835},[1729,2234,1889],{"class":1865},[1729,2236,2237],{"class":1746}," nameState ",[1729,2239,1782],{"class":1753},[1729,2241,2242],{"class":1746}," userState",[1729,2244,698],{"class":1753},[1729,2246,2247],{"class":2135},"map",[1729,2249,2250],{"class":1746},"((user) ",[1729,2252,1862],{"class":1753},[1729,2254,1801],{"class":1746},[1729,2256,698],{"class":1753},[1729,2258,2259],{"class":1746},"name)",[1729,2261,1948],{"class":1753},[1729,2263,2264],{"class":1731,"line":1878},[1729,2265,2266],{"class":1735},"// QoraState\u003CUser> → QoraState\u003CString>, previousData compris\n",[1729,2268,2269],{"class":1731,"line":1916},[1729,2270,1815],{"emptyLinePlaceholder":1814},[1729,2272,2273],{"class":1731,"line":1942},[1729,2274,2275],{"class":1735},"// Qora : reconstruire uniquement quand le nom change\n",[1729,2277,2279,2281,2283,2286],{"class":1731,"line":2278},12,[1729,2280,108],{"class":1757},[1729,2282,2208],{"class":1746},[1729,2284,2285],{"class":1757},"User",[1729,2287,2288],{"class":1746},">(\n",[1729,2290,2292,2295,2297,2300,2304,2306,2309],{"class":1731,"line":2291},13,[1729,2293,2294],{"class":1746},"  queryKey",[1729,2296,1853],{"class":1753},[1729,2298,2299],{"class":1746}," [",[1729,2301,2303],{"class":2302},"sfazB","'users'",[1729,2305,1894],{"class":1753},[1729,2307,2308],{"class":1746}," id]",[1729,2310,1875],{"class":1753},[1729,2312,2314,2317,2319,2322,2324,2327,2329,2332,2335],{"class":1731,"line":2313},14,[1729,2315,2316],{"class":1746},"  fetcher",[1729,2318,1853],{"class":1753},[1729,2320,2321],{"class":1746}," () ",[1729,2323,1862],{"class":1753},[1729,2325,2326],{"class":1746}," api",[1729,2328,698],{"class":1753},[1729,2330,2331],{"class":2135},"getUser",[1729,2333,2334],{"class":1746},"(id)",[1729,2336,1875],{"class":1753},[1729,2338,2340,2343,2345,2348,2350,2352,2354,2357],{"class":1731,"line":2339},15,[1729,2341,2342],{"class":1746},"  select",[1729,2344,1853],{"class":1753},[1729,2346,2347],{"class":1746}," (user) ",[1729,2349,1862],{"class":1753},[1729,2351,1801],{"class":1746},[1729,2353,698],{"class":1753},[1729,2355,2356],{"class":1746},"name",[1729,2358,1875],{"class":1753},[1729,2360,2362,2365,2367,2370,2372,2375,2377,2380,2382,2385,2387,2389,2391,2394,2397,2400,2403,2405],{"class":1731,"line":2361},16,[1729,2363,2364],{"class":1746},"  builder",[1729,2366,1853],{"class":1753},[1729,2368,2369],{"class":1746}," (context",[1729,2371,1894],{"class":1753},[1729,2373,2374],{"class":1746}," state",[1729,2376,1894],{"class":1753},[1729,2378,2379],{"class":1746}," _) ",[1729,2381,1862],{"class":1753},[1729,2383,2384],{"class":1757}," Text",[1729,2386,1927],{"class":1746},[1729,2388,698],{"class":1753},[1729,2390,1932],{"class":1746},[1729,2392,2393],{"class":1753},"?.",[1729,2395,2396],{"class":1746},"name ",[1729,2398,2399],{"class":1753},"??",[1729,2401,2402],{"class":2302}," ''",[1729,2404,1107],{"class":1746},[1729,2406,1875],{"class":1753},[1729,2408,2410,2412],{"class":1731,"line":2409},17,[1729,2411,1107],{"class":1746},[1729,2413,1948],{"class":1753},[352,2415],{},[538,2417,2419,2421,2422],{"id":2418},"gctime-remplace-cachetime",[384,2420,629],{}," remplace ",[384,2423,633],{},[348,2425,2426,2427,2429],{},"Qora utilise le nom de TanStack Query v5. ",[384,2428,629],{}," est la durée pendant laquelle une entrée inactive reste en mémoire après l'annulation de son dernier abonné.",[352,2431],{},[538,2433,2435],{"id":2434},"api-widget-vs-api-hook","API Widget vs API Hook",[348,2437,2438,2439,767,2441,2443],{},"L'API principale de React Query est basée sur les hooks (",[384,2440,408],{},[384,2442,425],{},"). Qora fournit les deux :",[2445,2446,2447,2461],"ul",{},[2448,2449,2450,1961,2452,2454,2455,938,2458,698],"li",{},[384,2451,413],{},[384,2453,113],{}," fonctionnent dans tout ",[384,2456,2457],{},"StatelessWidget",[384,2459,2460],{},"StatefulWidget",[2448,2462,2463,1961,2465,2467,2468,2471,2472,698],{},[384,2464,417],{},[384,2466,425],{}," nécessitent ",[384,2469,2470],{},"HookWidget"," de ",[384,2473,2474],{},"flutter_hooks",[348,2476,2477,2478,2480,2481,2483,2484,767,2487,2489],{},"Les deux partagent le même cache ",[384,2479,202],{},". Si un ",[384,2482,108],{}," a déjà récupéré ",[384,2485,2486],{},"['users', id]",[384,2488,408],{}," l'obtient au premier frame depuis la même entrée.",[352,2491],{},[538,2493,2495,2497,2498,2500,2501],{"id":2494},"qorascope-est-un-statefulwidget-pas-un-provider",[384,2496,103],{}," est un ",[384,2499,2460],{},", pas un ",[384,2502,2503],{},"Provider",[348,2505,2506,2507,2509,2510,2512,2513,2515,2516,2519,2520,938,2522,698],{},"TanStack Query utilise ",[384,2508,397],{}," (contexte React). Qora utilise ",[384,2511,103],{},", un ",[384,2514,2460],{}," qui expose le client à son sous-arbre via un ",[384,2517,2518],{},"InheritedWidget"," interne. Accéder au client depuis n'importe quel descendant via ",[384,2521,456],{},[384,2523,2524],{},"QoraScope.of(context)",[352,2526],{},[538,2528,2530],{"id":2529},"la-persistance-nécessite-un-enregistrement-explicite-des-sérialiseurs","La persistance nécessite un enregistrement explicite des sérialiseurs",[348,2532,2533,2534,2537,2538,457,2541,2544],{},"Les plugins de persistance de TanStack Query (ex. ",[384,2535,2536],{},"createSyncStoragePersister",") utilisent ",[384,2539,2540],{},"JSON.stringify",[384,2542,2543],{},"JSON.parse"," sur le cache de requêtes complet. Qora nécessite un enregistrement explicite des sérialiseurs par type car Dart n'a pas de réflexion à l'exécution :",[1719,2546,2548],{"className":1721,"code":2547,"filename":2123,"language":1724,"meta":1725,"style":1725},"// Requis avant hydrate()\nclient.registerSerializer\u003CUser>(\n  QoraSerializer(toJson: (u) => u.toJson(), fromJson: User.fromJson),\n  name: 'User',\n);\nawait client.hydrate();\n",[384,2549,2550,2555,2571,2612,2624,2630],{"__ignoreMap":1725},[1729,2551,2552],{"class":1731,"line":1732},[1729,2553,2554],{"class":1735},"// Requis avant hydrate()\n",[1729,2556,2557,2560,2562,2565,2567,2569],{"class":1731,"line":1739},[1729,2558,2559],{"class":1746},"client",[1729,2561,698],{"class":1753},[1729,2563,2564],{"class":2135},"registerSerializer",[1729,2566,2208],{"class":1746},[1729,2568,2285],{"class":1757},[1729,2570,2288],{"class":1746},[1729,2572,2573,2576,2579,2581,2584,2586,2589,2591,2594,2596,2598,2601,2603,2605,2607,2610],{"class":1731,"line":1764},[1729,2574,2575],{"class":1757},"  QoraSerializer",[1729,2577,2578],{"class":1746},"(toJson",[1729,2580,1853],{"class":1753},[1729,2582,2583],{"class":1746}," (u) ",[1729,2585,1862],{"class":1753},[1729,2587,2588],{"class":1746}," u",[1729,2590,698],{"class":1753},[1729,2592,2593],{"class":2135},"toJson",[1729,2595,1872],{"class":1746},[1729,2597,1894],{"class":1753},[1729,2599,2600],{"class":1746}," fromJson",[1729,2602,1853],{"class":1753},[1729,2604,2191],{"class":1757},[1729,2606,698],{"class":1753},[1729,2608,2609],{"class":1746},"fromJson)",[1729,2611,1875],{"class":1753},[1729,2613,2614,2617,2619,2622],{"class":1731,"line":1791},[1729,2615,2616],{"class":1746},"  name",[1729,2618,1853],{"class":1753},[1729,2620,2621],{"class":2302}," 'User'",[1729,2623,1875],{"class":1753},[1729,2625,2626,2628],{"class":1731,"line":1811},[1729,2627,1107],{"class":1746},[1729,2629,1948],{"class":1753},[1729,2631,2632,2635,2638,2640,2643,2645],{"class":1731,"line":1818},[1729,2633,2634],{"class":1742},"await",[1729,2636,2637],{"class":1746}," client",[1729,2639,698],{"class":1753},[1729,2641,2642],{"class":2135},"hydrate",[1729,2644,1872],{"class":1746},[1729,2646,1948],{"class":1753},[348,2648,2649,2650,2652],{},"La chaîne ",[384,2651,2356],{}," doit être stable entre les versions de l'application et les modes de build (y compris les builds obfusqués).",[352,2654],{},[538,2656,2658],{"id":2657},"pas-déquivalent-react-suspense","Pas d'équivalent React Suspense",[348,2660,2661,2662,2665,2666,2668],{},"TanStack Query supporte ",[384,2663,2664],{},"suspense: true"," pour s'intégrer avec React Suspense. Flutter n'a pas de mécanisme équivalent. Tout état asynchrone est géré via la correspondance de motifs sur ",[384,2667,1590],{}," dans l'arbre de widgets.",[352,2670],{},[355,2672,163],{"id":2673},"requêtes-infinies",[360,2675,2676,2686],{},[363,2677,2678],{},[366,2679,2680,2683],{},[369,2681,2682],{},"TanStack Query",[369,2684,2685],{},"Qora",[376,2687,2688,2700,2712,2724,2736,2748,2760,2772,2784,2796,2808,2820,2832,2844,2856,2868,2881],{},[366,2689,2690,2694],{},[381,2691,2692],{},[384,2693,438],{},[381,2695,2696,457,2698],{},[384,2697,118],{},[384,2699,438],{},[366,2701,2702,2707],{},[381,2703,2704],{},[384,2705,2706],{},"queryFn({ pageParam })",[381,2708,2709],{},[384,2710,2711],{},"fetcher(TPageParam pageParam)",[366,2713,2714,2719],{},[381,2715,2716],{},[384,2717,2718],{},"initialPageParam",[381,2720,2721],{},[384,2722,2723],{},"InfiniteQueryOptions.initialPageParam",[366,2725,2726,2731],{},[381,2727,2728],{},[384,2729,2730],{},"getNextPageParam(lastPage, pages)",[381,2732,2733],{},[384,2734,2735],{},"InfiniteQueryOptions.getNextPageParam(lastPage, pages)",[366,2737,2738,2743],{},[381,2739,2740],{},[384,2741,2742],{},"getPreviousPageParam",[381,2744,2745],{},[384,2746,2747],{},"InfiniteQueryOptions.getPreviousPageParam",[366,2749,2750,2755],{},[381,2751,2752],{},[384,2753,2754],{},"maxPages",[381,2756,2757],{},[384,2758,2759],{},"InfiniteQueryOptions.maxPages",[366,2761,2762,2767],{},[381,2763,2764],{},[384,2765,2766],{},"fetchNextPage()",[381,2768,2769],{},[384,2770,2771],{},"observer.fetchNextPage()",[366,2773,2774,2779],{},[381,2775,2776],{},[384,2777,2778],{},"fetchPreviousPage()",[381,2780,2781],{},[384,2782,2783],{},"observer.fetchPreviousPage()",[366,2785,2786,2791],{},[381,2787,2788],{},[384,2789,2790],{},"hasNextPage",[381,2792,2793],{},[384,2794,2795],{},"InfiniteSuccess.hasNextPage",[366,2797,2798,2803],{},[381,2799,2800],{},[384,2801,2802],{},"hasPreviousPage",[381,2804,2805],{},[384,2806,2807],{},"InfiniteSuccess.hasPreviousPage",[366,2809,2810,2815],{},[381,2811,2812],{},[384,2813,2814],{},"isFetchingNextPage",[381,2816,2817],{},[384,2818,2819],{},"InfiniteSuccess.isFetchingNextPage",[366,2821,2822,2827],{},[381,2823,2824],{},[384,2825,2826],{},"isFetchingPreviousPage",[381,2828,2829],{},[384,2830,2831],{},"InfiniteSuccess.isFetchingPreviousPage",[366,2833,2834,2839],{},[381,2835,2836],{},[384,2837,2838],{},"data.pages",[381,2840,2841],{},[384,2842,2843],{},"InfiniteData.pages",[366,2845,2846,2851],{},[381,2847,2848],{},[384,2849,2850],{},"data.pageParams",[381,2852,2853],{},[384,2854,2855],{},"InfiniteData.pageParams",[366,2857,2858,2863],{},[381,2859,2860],{},[384,2861,2862],{},"data.pages.flat()",[381,2864,2865],{},[384,2866,2867],{},"InfiniteData.flatten((page) => page.items)",[366,2869,2870,2876],{},[381,2871,2872,2875],{},[384,2873,2874],{},"queryClient.setQueryData"," (infini)",[381,2877,2878],{},[384,2879,2880],{},"client.setInfiniteQueryData\u003CTData, TPageParam>(key, InfiniteData)",[366,2882,2883,2888],{},[381,2884,2885,2875],{},[384,2886,2887],{},"queryClient.getQueryData",[381,2889,2890],{},[384,2891,2892],{},"client.getInfiniteQueryData\u003CTData, TPageParam>(key)",[352,2894],{},[355,2896,524],{"id":2897},"devtools",[348,2899,2900,2901,2903,2904,2907],{},"Les DevTools de TanStack Query sont un panneau navigateur installé comme composant React. L'équivalent dans Qora est un overlay intégré à l'application : installez ",[384,2902,529],{}," et enveloppez l'application avec ",[384,2905,2906],{},"QoraInspector",". Il montre les requêtes, les mutations et une timeline, et n'affiche rien en build release.",[348,2909,2910,2911,2914],{},"Voir ",[796,2912,2913],{"href":244},"Vue d'ensemble des DevTools"," pour les instructions de configuration.",[352,2916],{},[355,2918,2920],{"id":2919},"liens-connexes","Liens connexes",[2445,2922,2923,2930,2936,2942,2948],{},[2448,2924,2925,2929],{},[796,2926,2928],{"href":2927},"./what-is-qora","Qu'est-ce que Qora"," : vue d'ensemble conceptuelle",[2448,2931,2932,2935],{},[796,2933,21],{"href":2934},"./quick-start"," : configuration en cinq minutes",[2448,2937,2938,2941],{},[796,2939,211],{"href":2940},"../api-reference/qora-state"," : référence de la classe scellée",[2448,2943,2944,2947],{},[796,2945,215],{"href":2946},"../api-reference/qora-options"," : référence complète des options par requête",[2448,2949,2950,2953],{},[796,2951,220],{"href":2952},"../api-reference/qora-client-config"," : référence de la configuration globale",[2955,2956,2957],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":1725,"searchDepth":1739,"depth":1739,"links":2959},[2960,2961,2965,2969,2971,2985,2986,2987],{"id":357,"depth":1739,"text":358},{"id":535,"depth":1739,"text":536,"children":2962},[2963,2964],{"id":540,"depth":1764,"text":541},{"id":911,"depth":1764,"text":912},{"id":1131,"depth":1739,"text":1132,"children":2966},[2967,2968],{"id":1135,"depth":1764,"text":541},{"id":1325,"depth":1764,"text":1326},{"id":1501,"depth":1739,"text":2970},"Référence API : QueryClient vers QoraClient",{"id":1697,"depth":1739,"text":1698,"children":2972},[2973,2974,2976,2978,2980,2981,2983,2984],{"id":1701,"depth":1764,"text":1702},{"id":1970,"depth":1764,"text":2975},"previousData est toujours présent",{"id":2095,"depth":1764,"text":2977},"select filtre les rebuilds, il ne transforme pas",{"id":2418,"depth":1764,"text":2979},"gcTime remplace cacheTime",{"id":2434,"depth":1764,"text":2435},{"id":2494,"depth":1764,"text":2982},"QoraScope est un StatefulWidget, pas un Provider",{"id":2529,"depth":1764,"text":2530},{"id":2657,"depth":1764,"text":2658},{"id":2673,"depth":1739,"text":163},{"id":2897,"depth":1739,"text":524},{"id":2919,"depth":1739,"text":2920},"Correspondance précise des concepts, hooks et options de configuration de TanStack Query vers leurs équivalents Qora. Couvre ce qui est identique, ce qui est renommé et ce qui fonctionne différemment.","md",null,{},{"icon":33},{"title":2994,"description":2995},"Venant de TanStack Query - Qora","Migrer de TanStack Query (React Query) vers Qora. Correspondance des concepts, équivalents d'API et différences clés expliqués pour les développeurs déjà familiers avec TanStack Query.","p56UO6TAXYH0In5OJmYVCo5OuwQb2qns_RbBTdbyAHk",[2998,3000],{"title":25,"path":26,"stem":27,"description":2999,"icon":28,"children":-1},"Comment Qora se compare à flutter_query et cached_query, les autres bibliothèques de state serveur pour Flutter.",{"title":35,"path":36,"stem":37,"description":3001,"icon":38,"children":-1},"Faire correspondre les concepts de flutter_query et cached_query à Qora et migrer écran par écran.",1794040405234]