[{"data":1,"prerenderedAt":3000},["ShallowReactive",2],{"navigation_docs_en":3,"-en-getting-started-coming-from-tanstack-query":342,"-en-getting-started-coming-from-tanstack-query-surround":2995},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","/en/getting-started","en/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"What is Qora?","/en/getting-started/what-is-qora","en/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/en/getting-started/installation","en/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick Start","/en/getting-started/quick-start","en/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparison","/en/getting-started/comparison","en/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Coming from TanStack Query","/en/getting-started/coming-from-tanstack-query","en/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrating from Other Libraries","/en/getting-started/migrating-from-other-libraries","en/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"AI Assistants","/en/getting-started/ai-assistants","en/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Core Concepts","i-lucide-book-open","/en/core-concepts","en/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Queries","/en/core-concepts/queries","en/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Query Keys","/en/core-concepts/query-keys","en/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"Query States","/en/core-concepts/query-states","en/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Caching","/en/core-concepts/caching","en/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/en/core-concepts/stale-while-revalidate","en/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Deduplication","/en/core-concepts/deduplication","en/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations & Invalidation","/en/core-concepts/mutations","en/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Offline & Network","/en/core-concepts/offline","en/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Flutter Integration","i-lucide-smartphone","/en/flutter-integration","en/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Setup","/en/flutter-integration/setup","en/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/en/flutter-integration/qora-scope","en/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/en/flutter-integration/qora-builder","en/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/en/flutter-integration/qora-mutation-builder","en/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/en/flutter-integration/infinite-query-builder","en/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/en/flutter-integration/hooks","en/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Network Status Widgets","/en/flutter-integration/network-status","en/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Best Practices","/en/flutter-integration/best-practices","en/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Recipes","i-lucide-chef-hat","/en/recipes","en/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/en/recipes/mutations","en/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Optimistic Updates","/en/recipes/optimistic-updates","en/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistence","/en/recipes/persistence","en/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Network Aware","/en/recipes/network-aware","en/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Infinite Queries","/en/recipes/infinite-queries","en/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Dependent Queries","/en/recipes/dependent-queries","en/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Cancellation","/en/recipes/cancel-token","en/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"SSR Hydration","/en/recipes/ssr-hydration","en/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Error Handling","/en/recipes/error-handling","en/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Testing","/en/recipes/testing","en/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Route-Level Prefetching","/en/recipes/prefetch","en/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"API Reference","i-lucide-file-code","/en/api-reference","en/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/en/api-reference/qora-client","en/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/en/api-reference/qora-key","en/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/en/api-reference/qora-state","en/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/en/api-reference/qora-options","en/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/en/api-reference/qora-client-config","en/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"Mutation API","/en/api-reference/qora-mutation","en/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/en/api-reference/persist-qora-client","en/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Infinite Query","/en/api-reference/infinite-query","en/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"DevTools","i-lucide-bug","/en/devtools","en/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Overview","/en/devtools/overview","en/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"In-App Overlay","/en/devtools/overlay","en/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Data Serialization","/en/devtools/data-display","en/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Third Party","i-lucide-puzzle","/en/third-party","en/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"With Provider","/en/third-party/with-provider","en/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"With BLoC","/en/third-party/with-bloc","en/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"With Riverpod","/en/third-party/with-riverpod","en/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"With RxDart","/en/third-party/with-rxdart","en/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"With Dio","/en/third-party/with-dio","en/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"With GraphQL","/en/third-party/with-graphql","en/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Examples","/en/examples","en/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Case Study: User List & Detail","/en/examples/basic-query","en/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Case Study: Optimistic Mutations & Rollback","/en/examples/mutations-optimistic","en/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Case Study: Infinite Scroll Feed","/en/examples/infinite-scroll","en/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Case Study: Offline-First Todo App","/en/examples/offline-first","en/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Case Study: Network Awareness","/en/examples/network-awareness","en/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Case Study: Hooks Integration","/en/examples/hooks-integration","en/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Case Study: Complete Todo App","/en/examples/complete-todo-app","en/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Help","i-lucide-life-buoy","/en/help","en/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/en/help/faq","en/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Troubleshooting","/en/help/troubleshooting","en/09.help/2.troubleshooting",{"id":343,"title":30,"body":344,"description":2986,"extension":2987,"links":2988,"meta":2989,"navigation":2990,"path":31,"seo":2991,"stem":32,"__hash__":2994},"docs_en/en/01.getting-started/6.coming-from-tanstack-query.md",{"type":345,"value":346,"toc":2956},"minimark",[347,351,354,359,530,532,536,541,908,912,1126,1128,1132,1135,1322,1326,1496,1498,1507,1692,1694,1698,1702,1717,1948,1965,1967,1973,1991,2083,2091,2093,2099,2116,2119,2413,2415,2423,2429,2431,2435,2443,2474,2489,2491,2503,2524,2526,2530,2544,2646,2651,2653,2657,2667,2669,2672,2891,2893,2896,2906,2913,2915,2919,2952],[348,349,350],"p",{},"Qora shares the same conceptual model as TanStack Query: query keys, stale-while-revalidate, background refetch, mutation lifecycle hooks, and offline pause-and-replay. Most concepts translate directly. This page maps what you already know to the Qora API.",[352,353],"hr",{},[355,356,358],"h2",{"id":357},"concept-map","Concept Map",[360,361,362,375],"table",{},[363,364,365],"thead",{},[366,367,368,372],"tr",{},[369,370,371],"th",{},"TanStack Query concept",[369,373,374],{},"Qora equivalent",[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) or ",[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) or ",[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,524],{},[381,521,522],{},[384,523,237],{},[381,525,526,529],{},[384,527,528],{},"qora_devtools_overlay"," (in-app)",[352,531],{},[355,533,535],{"id":534},"api-reference-queries","API Reference: Queries",[537,538,540],"h3",{"id":539},"options","Options",[360,542,543,555],{},[363,544,545],{},[366,546,547,550,552],{},[369,548,549],{},"TanStack Query option",[369,551,374],{},[369,553,554],{},"Notes",[376,556,557,575,590,604,622,641,660,680,698,714,735,749,773,799,813,849,867,881,895],{},[366,558,559,564,568],{},[381,560,561],{},[384,562,563],{},"queryKey",[381,565,566],{},[384,567,563],{},[381,569,570,571,574],{},"Same concept. TanStack uses arrays; Qora uses ",[384,572,573],{},"List\u003Cdynamic>",". Structural equality in both.",[366,576,577,582,587],{},[381,578,579],{},[384,580,581],{},"queryFn",[381,583,584],{},[384,585,586],{},"fetcher",[381,588,589],{},"Same role. Renamed.",[366,591,592,597,601],{},[381,593,594],{},[384,595,596],{},"enabled",[381,598,599],{},[384,600,596],{},[381,602,603],{},"Identical.",[366,605,606,611,615],{},[381,607,608],{},[384,609,610],{},"staleTime",[381,612,613],{},[384,614,610],{},[381,616,617,618,621],{},"Identical. ",[384,619,620],{},"Duration.zero"," = always stale.",[366,623,624,634,638],{},[381,625,626,629,630,633],{},[384,627,628],{},"gcTime"," (",[384,631,632],{},"cacheTime"," in v4)",[381,635,636],{},[384,637,628],{},[381,639,640],{},"Now matches v5 naming.",[366,642,643,648,653],{},[381,644,645],{},[384,646,647],{},"retry",[381,649,650],{},[384,651,652],{},"retryCount",[381,654,655,656,659],{},"Renamed. Default is ",[384,657,658],{},"3"," in both.",[366,661,662,667,674],{},[381,663,664],{},[384,665,666],{},"retryDelay",[381,668,669,457,671],{},[384,670,666],{},[384,672,673],{},"retryDelayCalculator",[381,675,676,677,679],{},"Exponential backoff is the default. ",[384,678,673],{}," accepts a function receiving the attempt index.",[366,681,682,687,691],{},[381,683,684],{},[384,685,686],{},"refetchOnWindowFocus",[381,688,689],{},[384,690,686],{},[381,692,693,694,697],{},"Identical. Requires ",[384,695,696],{},"FlutterLifecycleManager",".",[366,699,700,705,709],{},[381,701,702],{},[384,703,704],{},"refetchOnReconnect",[381,706,707],{},[384,708,704],{},[381,710,693,711,697],{},[384,712,713],{},"FlutterConnectivityManager",[366,715,716,721,725],{},[381,717,718],{},[384,719,720],{},"refetchOnMount",[381,722,723],{},[384,724,720],{},[381,726,727,728,731,732,697],{},"Identical semantics. ",[384,729,730],{},"null"," falls back to ",[384,733,734],{},"QoraClientConfig.refetchOnMount",[366,736,737,742,746],{},[381,738,739],{},[384,740,741],{},"refetchInterval",[381,743,744],{},[384,745,741],{},[381,747,748],{},"Identical. Active while at least one subscriber is present.",[366,750,751,756,760],{},[381,752,753],{},[384,754,755],{},"networkMode",[381,757,758],{},[384,759,755],{},[381,761,762,763,766,767,766,770,697],{},"Same name, same three values: ",[384,764,765],{},"online",", ",[384,768,769],{},"always",[384,771,772],{},"offlineFirst",[366,774,775,780,791],{},[381,776,777],{},[384,778,779],{},"select",[381,781,782,784,785,457,788],{},[384,783,779],{}," (rebuild filter) / ",[384,786,787],{},"transform",[384,789,790],{},"state.map()",[381,792,793,794,697],{},"Different semantics, see ",[795,796,798],"a",{"href":797},"#select-filters-rebuilds-it-does-not-transform","below",[366,800,801,806,810],{},[381,802,803],{},[384,804,805],{},"placeholderData",[381,807,808],{},[384,809,805],{},[381,811,812],{},"A function returning a placeholder, for example from another cached query.",[366,814,815,820,836],{},[381,816,817],{},[384,818,819],{},"placeholderData: keepPreviousData",[381,821,822,825,826,457,829,832,833],{},[384,823,824],{},"previousData"," on ",[384,827,828],{},"Loading",[384,830,831],{},"Failure",", or ",[384,834,835],{},"keepPreviousData: true",[381,837,838,840,841,844,845,848],{},[384,839,824],{}," is always present. ",[384,842,843],{},"keepPreviousData"," keeps the entry in ",[384,846,847],{},"Success"," during a refetch.",[366,850,851,856,860],{},[381,852,853],{},[384,854,855],{},"initialData",[381,857,858],{},[384,859,855],{},[381,861,862,863,866],{},"Seeded before the first frame. ",[384,864,865],{},"client.hydrateQuery\u003CT>(key, data)"," does the same imperatively.",[366,868,869,874,878],{},[381,870,871],{},[384,872,873],{},"initialDataUpdatedAt",[381,875,876],{},[384,877,873],{},[381,879,880],{},"Defaults to the epoch, so initial data is stale and refetched on mount.",[366,882,883,888,892],{},[381,884,885],{},[384,886,887],{},"structuralSharing",[381,889,890],{},[384,891,887],{},[381,893,894],{},"Enabled by default. Unchanged nested data keeps its identity across fetches.",[366,896,897,902,905],{},[381,898,899],{},[384,900,901],{},"notifyOnChangeProps",[381,903,904],{},"Not available",[381,906,907],{},"All state transitions emit on the stream.",[537,909,911],{"id":910},"return-values","Return values",[360,913,914,923],{},[363,915,916],{},[366,917,918,921],{},[369,919,920],{},"TanStack Query field",[369,922,374],{},[376,924,925,941,953,965,977,989,1001,1013,1024,1036,1048,1060,1076,1091,1107,1117],{},[366,926,927,932],{},[381,928,929],{},[384,930,931],{},"status: 'pending'",[381,933,934,937,938],{},[384,935,936],{},"state is Initial"," or ",[384,939,940],{},"state is Loading(previousData: null)",[366,942,943,948],{},[381,944,945],{},[384,946,947],{},"status: 'error'",[381,949,950],{},[384,951,952],{},"state is Failure",[366,954,955,960],{},[381,956,957],{},[384,958,959],{},"status: 'success'",[381,961,962],{},[384,963,964],{},"state is Success",[366,966,967,972],{},[381,968,969],{},[384,970,971],{},"fetchStatus: 'fetching'",[381,973,974],{},[384,975,976],{},"fetchStatus == FetchStatus.fetching",[366,978,979,984],{},[381,980,981],{},[384,982,983],{},"fetchStatus: 'paused'",[381,985,986],{},[384,987,988],{},"fetchStatus == FetchStatus.paused",[366,990,991,996],{},[381,992,993],{},[384,994,995],{},"fetchStatus: 'idle'",[381,997,998],{},[384,999,1000],{},"fetchStatus == FetchStatus.idle",[366,1002,1003,1008],{},[381,1004,1005],{},[384,1006,1007],{},"isLoading",[381,1009,1010],{},[384,1011,1012],{},"state.isLoading",[366,1014,1015,1020],{},[381,1016,1017],{},[384,1018,1019],{},"isFetching",[381,1021,1022],{},[384,1023,976],{},[366,1025,1026,1031],{},[381,1027,1028],{},[384,1029,1030],{},"isError",[381,1032,1033],{},[384,1034,1035],{},"state.isError",[366,1037,1038,1043],{},[381,1039,1040],{},[384,1041,1042],{},"isSuccess",[381,1044,1045],{},[384,1046,1047],{},"state.isSuccess",[366,1049,1050,1055],{},[381,1051,1052],{},[384,1053,1054],{},"isPending",[381,1056,1057],{},[384,1058,1059],{},"state is Initial || state is Loading(previousData: null)",[366,1061,1062,1067],{},[381,1063,1064],{},[384,1065,1066],{},"data",[381,1068,1069,937,1072,1075],{},[384,1070,1071],{},"state.dataOrNull",[384,1073,1074],{},"Success(:final data)"," via pattern match",[366,1077,1078,1083],{},[381,1079,1080],{},[384,1081,1082],{},"error",[381,1084,1085,937,1088,1075],{},[384,1086,1087],{},"state.errorOrNull",[384,1089,1090],{},"Failure(:final error)",[366,1092,1093,1098],{},[381,1094,1095],{},[384,1096,1097],{},"dataUpdatedAt",[381,1099,1100,1103,1104,1106],{},[384,1101,1102],{},"state.updatedAt"," (extension, non-null only on ",[384,1105,847],{},")",[366,1108,1109,1114],{},[381,1110,1111],{},[384,1112,1113],{},"errorUpdatedAt",[381,1115,1116],{},"Not available as a separate field",[366,1118,1119,1124],{},[381,1120,1121],{},[384,1122,1123],{},"isFetchedAfterMount",[381,1125,904],{},[352,1127],{},[355,1129,1131],{"id":1130},"api-reference-mutations","API Reference: Mutations",[537,1133,540],{"id":1134},"options-1",[360,1136,1137,1147],{},[363,1138,1139],{},[366,1140,1141,1143,1145],{},[369,1142,549],{},[369,1144,374],{},[369,1146,554],{},[376,1148,1149,1164,1182,1200,1217,1234,1251,1265,1283,1299],{},[366,1150,1151,1156,1161],{},[381,1152,1153],{},[384,1154,1155],{},"mutationFn",[381,1157,1158],{},[384,1159,1160],{},"mutator",[381,1162,1163],{},"Renamed.",[366,1165,1166,1171,1176],{},[381,1167,1168],{},[384,1169,1170],{},"onMutate",[381,1172,1173],{},[384,1174,1175],{},"MutationOptions.onMutate",[381,1177,1178,1179,697],{},"Same role. Return value becomes ",[384,1180,1181],{},"TContext",[366,1183,1184,1189,1194],{},[381,1185,1186],{},[384,1187,1188],{},"onSuccess",[381,1190,1191],{},[384,1192,1193],{},"MutationOptions.onSuccess",[381,1195,1196,1197,697],{},"Same role. Signature: ",[384,1198,1199],{},"(TData, TVariables, TContext?)",[366,1201,1202,1207,1212],{},[381,1203,1204],{},[384,1205,1206],{},"onError",[381,1208,1209],{},[384,1210,1211],{},"MutationOptions.onError",[381,1213,1196,1214,697],{},[384,1215,1216],{},"(Object, TVariables, TContext?)",[366,1218,1219,1224,1229],{},[381,1220,1221],{},[384,1222,1223],{},"onSettled",[381,1225,1226],{},[384,1227,1228],{},"MutationOptions.onSettled",[381,1230,1196,1231,697],{},[384,1232,1233],{},"(TData?, Object?, TVariables, TContext?)",[366,1235,1236,1240,1245],{},[381,1237,1238],{},[384,1239,647],{},[381,1241,1242],{},[384,1243,1244],{},"MutationOptions.retryCount",[381,1246,655,1247,1250],{},[384,1248,1249],{},"0"," (no retry).",[366,1252,1253,1257,1262],{},[381,1254,1255],{},[384,1256,666],{},[381,1258,1259],{},[384,1260,1261],{},"MutationOptions.retryDelay",[381,1263,1264],{},"Exponential backoff.",[366,1266,1267,1271,1276],{},[381,1268,1269],{},[384,1270,755],{},[381,1272,1273],{},[384,1274,1275],{},"MutationOptions.networkMode",[381,1277,1278,1279,1282],{},"Same values. Add ",[384,1280,1281],{},"offlineQueue: true"," to queue writes made offline and replay them on reconnect.",[366,1284,1285,1290,1296],{},[381,1286,1287],{},[384,1288,1289],{},"variables",[381,1291,1292,1295],{},[384,1293,1294],{},"TVariables"," type parameter",[381,1297,1298],{},"Same concept.",[366,1300,1301,1307,1311],{},[381,1302,1303,1306],{},[384,1304,1305],{},"context"," (rollback snapshot)",[381,1308,1309,1295],{},[384,1310,1181],{},[381,1312,1313,1314,1316,1317,1319,1320,697],{},"Same concept. Returned by ",[384,1315,1170],{},", forwarded to ",[384,1318,1206],{},"/",[384,1321,1223],{},[537,1323,1325],{"id":1324},"return-values-state","Return values / state",[360,1327,1328,1336],{},[363,1329,1330],{},[366,1331,1332,1334],{},[369,1333,920],{},[369,1335,374],{},[376,1337,1338,1350,1361,1372,1383,1395,1406,1416,1426,1436,1446,1457,1469,1481],{},[366,1339,1340,1345],{},[381,1341,1342],{},[384,1343,1344],{},"status: 'idle'",[381,1346,1347],{},[384,1348,1349],{},"state is MutationIdle",[366,1351,1352,1356],{},[381,1353,1354],{},[384,1355,931],{},[381,1357,1358],{},[384,1359,1360],{},"state is MutationPending",[366,1362,1363,1367],{},[381,1364,1365],{},[384,1366,947],{},[381,1368,1369],{},[384,1370,1371],{},"state is MutationFailure",[366,1373,1374,1378],{},[381,1375,1376],{},[384,1377,959],{},[381,1379,1380],{},[384,1381,1382],{},"state is MutationSuccess",[366,1384,1385,1390],{},[381,1386,1387],{},[384,1388,1389],{},"isIdle",[381,1391,1392],{},[384,1393,1394],{},"state.isIdle",[366,1396,1397,1401],{},[381,1398,1399],{},[384,1400,1054],{},[381,1402,1403],{},[384,1404,1405],{},"state.isPending",[366,1407,1408,1412],{},[381,1409,1410],{},[384,1411,1030],{},[381,1413,1414],{},[384,1415,1035],{},[366,1417,1418,1422],{},[381,1419,1420],{},[384,1421,1042],{},[381,1423,1424],{},[384,1425,1047],{},[366,1427,1428,1432],{},[381,1429,1430],{},[384,1431,1066],{},[381,1433,1434],{},[384,1435,1071],{},[366,1437,1438,1442],{},[381,1439,1440],{},[384,1441,1082],{},[381,1443,1444],{},[384,1445,1087],{},[366,1447,1448,1452],{},[381,1449,1450],{},[384,1451,1289],{},[381,1453,1454],{},[384,1455,1456],{},"state.variablesOrNull",[366,1458,1459,1464],{},[381,1460,1461],{},[384,1462,1463],{},"mutate(variables)",[381,1465,1466,1468],{},[384,1467,1463],{},": fire-and-forget, errors captured in state",[366,1470,1471,1476],{},[381,1472,1473],{},[384,1474,1475],{},"mutateAsync(variables)",[381,1477,1478,1480],{},[384,1479,1475],{},": awaitable, errors propagated",[366,1482,1483,1488],{},[381,1484,1485],{},[384,1486,1487],{},"reset()",[381,1489,1490,1492,1493],{},[384,1491,1487],{},": transitions back to ",[384,1494,1495],{},"MutationIdle",[352,1497],{},[355,1499,1501,1502,1504,1505],{"id":1500},"api-reference-queryclient-qoraclient","API Reference: ",[384,1503,386],{}," → ",[384,1506,202],{},[360,1508,1509,1518],{},[363,1510,1511],{},[366,1512,1513,1516],{},[369,1514,1515],{},"TanStack Query method",[369,1517,374],{},[376,1519,1520,1532,1547,1559,1575,1590,1602,1617,1627,1640,1653,1665,1681],{},[366,1521,1522,1527],{},[381,1523,1524],{},[384,1525,1526],{},"invalidateQueries({ queryKey })",[381,1528,1529],{},[384,1530,1531],{},"client.invalidate(key)",[366,1533,1534,1539],{},[381,1535,1536],{},[384,1537,1538],{},"invalidateQueries(filter)",[381,1540,1541,937,1544],{},[384,1542,1543],{},"client.invalidateWhere(predicate)",[384,1545,1546],{},"client.invalidateQueries(filter)",[366,1548,1549,1554],{},[381,1550,1551],{},[384,1552,1553],{},"setQueryData(queryKey, updater)",[381,1555,1556],{},[384,1557,1558],{},"client.setQueryData\u003CT>(key, data)",[366,1560,1561,1566],{},[381,1562,1563],{},[384,1564,1565],{},"getQueryData(queryKey)",[381,1567,1568,1571,1572],{},[384,1569,1570],{},"client.getQueryData\u003CT>(key)",": returns ",[384,1573,1574],{},"T?",[366,1576,1577,1582],{},[381,1578,1579],{},[384,1580,1581],{},"getQueryState(queryKey)",[381,1583,1584,1571,1587],{},[384,1585,1586],{},"client.getQueryState\u003CT>(key)",[384,1588,1589],{},"QoraState\u003CT>",[366,1591,1592,1597],{},[381,1593,1594],{},[384,1595,1596],{},"prefetchQuery",[381,1598,1599],{},[384,1600,1601],{},"client.prefetch\u003CT>(key, fetcher, options)",[366,1603,1604,1609],{},[381,1605,1606],{},[384,1607,1608],{},"resetQueries",[381,1610,1611,937,1614],{},[384,1612,1613],{},"client.removeQuery(key)",[384,1615,1616],{},"client.clear()",[366,1618,1619,1624],{},[381,1620,1621],{},[384,1622,1623],{},"cancelQueries",[381,1625,1626],{},"Not available in Qora v1",[366,1628,1629,1634],{},[381,1630,1631],{},[384,1632,1633],{},"isFetching(queryKey)",[381,1635,1636,1639],{},[384,1637,1638],{},"client.isFetchingCount"," (global count)",[366,1641,1642,1647],{},[381,1643,1644],{},[384,1645,1646],{},"setDefaultOptions",[381,1648,1649,1652],{},[384,1650,1651],{},"QoraClientConfig.defaultOptions"," (set at construction)",[366,1654,1655,1660],{},[381,1656,1657],{},[384,1658,1659],{},"getDefaultOptions",[381,1661,1662],{},[384,1663,1664],{},"client.config.defaultOptions",[366,1666,1667,1675],{},[381,1668,1669,457,1672],{},[384,1670,1671],{},"mount",[384,1673,1674],{},"unmount",[381,1676,1677,1678,1680],{},"Handled by ",[384,1679,103],{}," / widget lifecycle",[366,1682,1683,1688],{},[381,1684,1685],{},[384,1686,1687],{},"clear()",[381,1689,1690],{},[384,1691,1616],{},[352,1693],{},[355,1695,1697],{"id":1696},"key-differences","Key Differences",[537,1699,1701],{"id":1700},"sealed-classes-replace-status-strings","Sealed classes replace status strings",[348,1703,1704,1705,1708,1709,766,1711,1713,1714,1716],{},"TanStack Query returns plain objects with string ",[384,1706,1707],{},"status"," fields and boolean shortcuts (",[384,1710,1007],{},[384,1712,1030],{},", etc.). Qora returns a sealed class ",[384,1715,1589],{},". Dart 3 pattern matching makes exhaustive handling compile-time enforced:",[1718,1719,1725],"pre",{"className":1720,"code":1721,"filename":1722,"language":1723,"meta":1724,"style":1724},"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,1726,1727,1736,1761,1788,1808,1815,1821,1832,1875,1913,1939],{"__ignoreMap":1724},[1728,1729,1732],"span",{"class":1730,"line":1731},"line",1,[1728,1733,1735],{"class":1734},"sHwdD","// TanStack Query (React)\n",[1728,1737,1739,1743,1747,1750,1754,1758],{"class":1730,"line":1738},2,[1728,1740,1742],{"class":1741},"s7zQu","if",[1728,1744,1746],{"class":1745},"sTEyZ"," (isLoading) ",[1728,1748,1749],{"class":1741},"return",[1728,1751,1753],{"class":1752},"sMK4o"," \u003C",[1728,1755,1757],{"class":1756},"sBMFI","Spinner",[1728,1759,1760],{"class":1752}," />;\n",[1728,1762,1764,1766,1769,1771,1773,1776,1779,1782,1785],{"class":1730,"line":1763},3,[1728,1765,1742],{"class":1741},[1728,1767,1768],{"class":1745}," (isError) ",[1728,1770,1749],{"class":1741},[1728,1772,1753],{"class":1752},[1728,1774,1775],{"class":1756},"Error",[1728,1777,1778],{"class":1745}," error",[1728,1780,1781],{"class":1752},"=",[1728,1783,1784],{"class":1745},"{error} ",[1728,1786,1787],{"class":1752},"/>;\n",[1728,1789,1791,1793,1795,1798,1801,1803,1806],{"class":1730,"line":1790},4,[1728,1792,1749],{"class":1741},[1728,1794,1753],{"class":1752},[1728,1796,1797],{"class":1756},"UserCard",[1728,1799,1800],{"class":1745}," user",[1728,1802,1781],{"class":1752},[1728,1804,1805],{"class":1745},"{data} ",[1728,1807,1787],{"class":1752},[1728,1809,1811],{"class":1730,"line":1810},5,[1728,1812,1814],{"emptyLinePlaceholder":1813},true,"\n",[1728,1816,1818],{"class":1730,"line":1817},6,[1728,1819,1820],{"class":1734},"// Qora (Dart 3)\n",[1728,1822,1824,1826,1829],{"class":1730,"line":1823},7,[1728,1825,1749],{"class":1741},[1728,1827,1828],{"class":1741}," switch",[1728,1830,1831],{"class":1745}," (state) {\n",[1728,1833,1835,1838,1841,1844,1847,1850,1853,1856,1859,1862,1866,1869,1872],{"class":1730,"line":1834},8,[1728,1836,1837],{"class":1756},"  Initial",[1728,1839,1840],{"class":1745},"() ",[1728,1842,1843],{"class":1752},"||",[1728,1845,1846],{"class":1756}," Loading",[1728,1848,1849],{"class":1745},"(previousData",[1728,1851,1852],{"class":1752},":",[1728,1854,1855],{"class":1752}," null",[1728,1857,1858],{"class":1745},") ",[1728,1860,1861],{"class":1752},"=>",[1728,1863,1865],{"class":1864},"spNyl"," const",[1728,1867,1868],{"class":1756}," CircularProgressIndicator",[1728,1870,1871],{"class":1745},"()",[1728,1873,1874],{"class":1752},",\n",[1728,1876,1878,1881,1884,1886,1889,1891,1894,1897,1899,1901,1903,1905,1908,1911],{"class":1730,"line":1877},9,[1728,1879,1880],{"class":1756},"  Failure",[1728,1882,1883],{"class":1745},"(",[1728,1885,1852],{"class":1752},[1728,1887,1888],{"class":1864},"final",[1728,1890,1778],{"class":1745},[1728,1892,1893],{"class":1752},",",[1728,1895,1896],{"class":1745}," previousData",[1728,1898,1852],{"class":1752},[1728,1900,1855],{"class":1752},[1728,1902,1858],{"class":1745},[1728,1904,1861],{"class":1752},[1728,1906,1907],{"class":1756}," ErrorScreen",[1728,1909,1910],{"class":1745},"(error)",[1728,1912,1874],{"class":1752},[1728,1914,1916,1919,1921,1924,1927,1929,1932,1935,1937],{"class":1730,"line":1915},10,[1728,1917,1918],{"class":1745},"  _ ",[1728,1920,1861],{"class":1752},[1728,1922,1923],{"class":1756}," UserCard",[1728,1925,1926],{"class":1745},"(state",[1728,1928,697],{"class":1752},[1728,1930,1931],{"class":1745},"dataOrNull",[1728,1933,1934],{"class":1752},"!",[1728,1936,1106],{"class":1745},[1728,1938,1874],{"class":1752},[1728,1940,1942,1945],{"class":1730,"line":1941},11,[1728,1943,1944],{"class":1745},"}",[1728,1946,1947],{"class":1752},";\n",[348,1949,1950,1951,1954,1955,766,1957,1960,1961,1964],{},"The ",[384,1952,1953],{},"_"," arm covers ",[384,1956,847],{},[384,1958,1959],{},"Loading(previousData != null)",", and ",[384,1962,1963],{},"Failure(previousData != null)",": all cases where data is available.",[352,1966],{},[537,1968,1970,1972],{"id":1969},"previousdata-is-always-present",[384,1971,824],{}," is always present",[348,1974,1975,1976,1978,1979,1982,1983,1986,1987,1990],{},"TanStack Query v5 keeps the previous data with ",[384,1977,819],{},". In Qora, ",[384,1980,1981],{},"Loading\u003CT>"," and ",[384,1984,1985],{},"Failure\u003CT>"," always carry ",[384,1988,1989],{},"previousData: T?",", so stale data stays accessible during background refreshes and after errors without any option.",[1718,1992,1994],{"className":1720,"code":1993,"filename":1722,"language":1723,"meta":1724,"style":1724},"// Show stale data with a progress indicator during a background refresh\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":1724},[1728,1997,1998],{"class":1730,"line":1731},[1728,1999,2000],{"class":1734},"// Show stale data with a progress indicator during a background refresh\n",[1728,2002,2003,2006,2008,2010,2012,2014,2017,2020,2023,2026],{"class":1730,"line":1738},[1728,2004,2005],{"class":1741},"case",[1728,2007,1846],{"class":1756},[1728,2009,1883],{"class":1745},[1728,2011,1852],{"class":1752},[1728,2013,1888],{"class":1864},[1728,2015,2016],{"class":1745}," previousData) ",[1728,2018,2019],{"class":1741},"when",[1728,2021,2022],{"class":1745}," previousData ",[1728,2024,2025],{"class":1752},"!=",[1728,2027,2028],{"class":1752}," null:\n",[1728,2030,2031,2034,2037,2040,2042],{"class":1730,"line":1763},[1728,2032,2033],{"class":1741},"  return",[1728,2035,2036],{"class":1756}," Stack",[1728,2038,2039],{"class":1745},"(children",[1728,2041,1852],{"class":1752},[1728,2043,2044],{"class":1745}," [\n",[1728,2046,2047,2050,2053],{"class":1730,"line":1790},[1728,2048,2049],{"class":1756},"    UserCard",[1728,2051,2052],{"class":1745},"(previousData)",[1728,2054,1874],{"class":1752},[1728,2056,2057,2060,2063,2066,2068,2072,2074],{"class":1730,"line":1810},[1728,2058,2059],{"class":1864},"    const",[1728,2061,2062],{"class":1756}," LinearProgressIndicator",[1728,2064,2065],{"class":1745},"(minHeight",[1728,2067,1852],{"class":1752},[1728,2069,2071],{"class":2070},"sbssI"," 2",[1728,2073,1106],{"class":1745},[1728,2075,1874],{"class":1752},[1728,2077,2078,2081],{"class":1730,"line":1817},[1728,2079,2080],{"class":1745},"  ])",[1728,2082,1947],{"class":1752},[348,2084,2085,2086,2088,2089,697],{},"If you prefer the entry to stay in ",[384,2087,847],{}," while it refetches, for example to keep a paginated table stable, set ",[384,2090,835],{},[352,2092],{},[537,2094,2096,2098],{"id":2095},"select-filters-rebuilds-it-does-not-transform",[384,2097,779],{}," filters rebuilds, it does not transform",[348,2100,2101,2102,2104,2105,825,2107,1982,2109,2111,2112,2115],{},"In TanStack Query, ",[384,2103,779],{}," transforms the data returned to the component. In Qora, ",[384,2106,779],{},[384,2108,108],{},[384,2110,408],{}," decides ",[2113,2114,2019],"strong",{}," the widget rebuilds: only when the state kind or the selected value changes. The state you receive is always the full one.",[348,2117,2118],{},"To transform data, Qora offers two tools:",[1718,2120,2123],{"className":1720,"code":2121,"filename":2122,"language":1723,"meta":1724,"style":1724},"// TanStack Query\nuseQuery({ queryKey, queryFn, select: (data) => data.name });\n\n// Qora: transform once, in the cache (every subscriber sees the result)\nQoraOptions(transform: (raw) => User.fromJson(raw as Map\u003CString, dynamic>));\n\n// Qora: transform per consumer, on the state\nfinal nameState = userState.map((user) => user.name);\n// QoraState\u003CUser> → QoraState\u003CString>, previousData included\n\n// Qora: rebuild only when the name changes\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,2124,2125,2130,2165,2169,2174,2221,2225,2230,2261,2266,2270,2275,2288,2310,2336,2358,2406],{"__ignoreMap":1724},[1728,2126,2127],{"class":1730,"line":1731},[1728,2128,2129],{"class":1734},"// TanStack Query\n",[1728,2131,2132,2135,2138,2140,2143,2145,2148,2150,2153,2155,2158,2160,2163],{"class":1730,"line":1738},[1728,2133,408],{"class":2134},"s2Zo4",[1728,2136,2137],{"class":1745},"({ queryKey",[1728,2139,1893],{"class":1752},[1728,2141,2142],{"class":1745}," queryFn",[1728,2144,1893],{"class":1752},[1728,2146,2147],{"class":1745}," select",[1728,2149,1852],{"class":1752},[1728,2151,2152],{"class":1745}," (data) ",[1728,2154,1861],{"class":1752},[1728,2156,2157],{"class":1745}," data",[1728,2159,697],{"class":1752},[1728,2161,2162],{"class":1745},"name })",[1728,2164,1947],{"class":1752},[1728,2166,2167],{"class":1730,"line":1763},[1728,2168,1814],{"emptyLinePlaceholder":1813},[1728,2170,2171],{"class":1730,"line":1790},[1728,2172,2173],{"class":1734},"// Qora: transform once, in the cache (every subscriber sees the result)\n",[1728,2175,2176,2178,2181,2183,2186,2188,2191,2193,2196,2199,2202,2205,2208,2211,2213,2216,2219],{"class":1730,"line":1810},[1728,2177,215],{"class":1756},[1728,2179,2180],{"class":1745},"(transform",[1728,2182,1852],{"class":1752},[1728,2184,2185],{"class":1745}," (raw) ",[1728,2187,1861],{"class":1752},[1728,2189,2190],{"class":1756}," User",[1728,2192,697],{"class":1752},[1728,2194,2195],{"class":2134},"fromJson",[1728,2197,2198],{"class":1745},"(raw ",[1728,2200,2201],{"class":1752},"as",[1728,2203,2204],{"class":1756}," Map",[1728,2206,2207],{"class":1745},"\u003C",[1728,2209,2210],{"class":1756},"String",[1728,2212,766],{"class":1745},[1728,2214,2215],{"class":1756},"dynamic",[1728,2217,2218],{"class":1745},">))",[1728,2220,1947],{"class":1752},[1728,2222,2223],{"class":1730,"line":1817},[1728,2224,1814],{"emptyLinePlaceholder":1813},[1728,2226,2227],{"class":1730,"line":1823},[1728,2228,2229],{"class":1734},"// Qora: transform per consumer, on the state\n",[1728,2231,2232,2234,2237,2239,2242,2244,2247,2250,2252,2254,2256,2259],{"class":1730,"line":1834},[1728,2233,1888],{"class":1864},[1728,2235,2236],{"class":1745}," nameState ",[1728,2238,1781],{"class":1752},[1728,2240,2241],{"class":1745}," userState",[1728,2243,697],{"class":1752},[1728,2245,2246],{"class":2134},"map",[1728,2248,2249],{"class":1745},"((user) ",[1728,2251,1861],{"class":1752},[1728,2253,1800],{"class":1745},[1728,2255,697],{"class":1752},[1728,2257,2258],{"class":1745},"name)",[1728,2260,1947],{"class":1752},[1728,2262,2263],{"class":1730,"line":1877},[1728,2264,2265],{"class":1734},"// QoraState\u003CUser> → QoraState\u003CString>, previousData included\n",[1728,2267,2268],{"class":1730,"line":1915},[1728,2269,1814],{"emptyLinePlaceholder":1813},[1728,2271,2272],{"class":1730,"line":1941},[1728,2273,2274],{"class":1734},"// Qora: rebuild only when the name changes\n",[1728,2276,2278,2280,2282,2285],{"class":1730,"line":2277},12,[1728,2279,108],{"class":1756},[1728,2281,2207],{"class":1745},[1728,2283,2284],{"class":1756},"User",[1728,2286,2287],{"class":1745},">(\n",[1728,2289,2291,2294,2296,2299,2303,2305,2308],{"class":1730,"line":2290},13,[1728,2292,2293],{"class":1745},"  queryKey",[1728,2295,1852],{"class":1752},[1728,2297,2298],{"class":1745}," [",[1728,2300,2302],{"class":2301},"sfazB","'users'",[1728,2304,1893],{"class":1752},[1728,2306,2307],{"class":1745}," id]",[1728,2309,1874],{"class":1752},[1728,2311,2313,2316,2318,2321,2323,2326,2328,2331,2334],{"class":1730,"line":2312},14,[1728,2314,2315],{"class":1745},"  fetcher",[1728,2317,1852],{"class":1752},[1728,2319,2320],{"class":1745}," () ",[1728,2322,1861],{"class":1752},[1728,2324,2325],{"class":1745}," api",[1728,2327,697],{"class":1752},[1728,2329,2330],{"class":2134},"getUser",[1728,2332,2333],{"class":1745},"(id)",[1728,2335,1874],{"class":1752},[1728,2337,2339,2342,2344,2347,2349,2351,2353,2356],{"class":1730,"line":2338},15,[1728,2340,2341],{"class":1745},"  select",[1728,2343,1852],{"class":1752},[1728,2345,2346],{"class":1745}," (user) ",[1728,2348,1861],{"class":1752},[1728,2350,1800],{"class":1745},[1728,2352,697],{"class":1752},[1728,2354,2355],{"class":1745},"name",[1728,2357,1874],{"class":1752},[1728,2359,2361,2364,2366,2369,2371,2374,2376,2379,2381,2384,2386,2388,2390,2393,2396,2399,2402,2404],{"class":1730,"line":2360},16,[1728,2362,2363],{"class":1745},"  builder",[1728,2365,1852],{"class":1752},[1728,2367,2368],{"class":1745}," (context",[1728,2370,1893],{"class":1752},[1728,2372,2373],{"class":1745}," state",[1728,2375,1893],{"class":1752},[1728,2377,2378],{"class":1745}," _) ",[1728,2380,1861],{"class":1752},[1728,2382,2383],{"class":1756}," Text",[1728,2385,1926],{"class":1745},[1728,2387,697],{"class":1752},[1728,2389,1931],{"class":1745},[1728,2391,2392],{"class":1752},"?.",[1728,2394,2395],{"class":1745},"name ",[1728,2397,2398],{"class":1752},"??",[1728,2400,2401],{"class":2301}," ''",[1728,2403,1106],{"class":1745},[1728,2405,1874],{"class":1752},[1728,2407,2409,2411],{"class":1730,"line":2408},17,[1728,2410,1106],{"class":1745},[1728,2412,1947],{"class":1752},[352,2414],{},[537,2416,2418,2420,2421],{"id":2417},"gctime-replaces-cachetime",[384,2419,628],{}," replaces ",[384,2422,632],{},[348,2424,2425,2426,2428],{},"Qora uses the TanStack Query v5 name. ",[384,2427,628],{}," is the time an inactive entry stays in memory after its last subscriber cancels.",[352,2430],{},[537,2432,2434],{"id":2433},"widget-api-vs-hook-api","Widget API vs hook API",[348,2436,2437,2438,766,2440,2442],{},"React Query's primary API is hooks (",[384,2439,408],{},[384,2441,425],{},"). Qora provides both a widget API and a hook API:",[2444,2445,2446,2460],"ul",{},[2447,2448,2449,1982,2451,2453,2454,937,2457,697],"li",{},[384,2450,413],{},[384,2452,113],{}," work in any ",[384,2455,2456],{},"StatelessWidget",[384,2458,2459],{},"StatefulWidget",[2447,2461,2462,1982,2464,2466,2467,2470,2471,697],{},[384,2463,417],{},[384,2465,425],{}," require ",[384,2468,2469],{},"HookWidget"," from ",[384,2472,2473],{},"flutter_hooks",[348,2475,2476,2477,2479,2480,2482,2483,766,2486,2488],{},"Both share the same ",[384,2478,202],{}," cache. If a ",[384,2481,108],{}," already fetched ",[384,2484,2485],{},"['users', id]",[384,2487,408],{}," gets it on the first frame from the same entry.",[352,2490],{},[537,2492,2494,2496,2497,2499,2500],{"id":2493},"qorascope-is-a-statefulwidget-not-a-provider",[384,2495,103],{}," is a ",[384,2498,2459],{},", not a ",[384,2501,2502],{},"Provider",[348,2504,2505,2506,2508,2509,2511,2512,2514,2515,2518,2519,937,2521,697],{},"TanStack Query uses ",[384,2507,397],{}," (React context). Qora uses ",[384,2510,103],{},", a ",[384,2513,2459],{}," that exposes the client to its subtree via an internal ",[384,2516,2517],{},"InheritedWidget",". Access the client from any descendant via ",[384,2520,456],{},[384,2522,2523],{},"QoraScope.of(context)",[352,2525],{},[537,2527,2529],{"id":2528},"persistence-requires-explicit-serializer-registration","Persistence requires explicit serializer registration",[348,2531,2532,2533,2536,2537,457,2540,2543],{},"TanStack Query's persistence plugins (e.g. ",[384,2534,2535],{},"createSyncStoragePersister",") use ",[384,2538,2539],{},"JSON.stringify",[384,2541,2542],{},"JSON.parse"," on the full query cache. Qora requires explicit serializer registration per type because Dart has no runtime reflection:",[1718,2545,2547],{"className":1720,"code":2546,"filename":2122,"language":1723,"meta":1724,"style":1724},"// Required before hydrate()\nclient.registerSerializer\u003CUser>(\n  QoraSerializer(toJson: (u) => u.toJson(), fromJson: User.fromJson),\n  name: 'User',\n);\nawait client.hydrate();\n",[384,2548,2549,2554,2570,2611,2623,2629],{"__ignoreMap":1724},[1728,2550,2551],{"class":1730,"line":1731},[1728,2552,2553],{"class":1734},"// Required before hydrate()\n",[1728,2555,2556,2559,2561,2564,2566,2568],{"class":1730,"line":1738},[1728,2557,2558],{"class":1745},"client",[1728,2560,697],{"class":1752},[1728,2562,2563],{"class":2134},"registerSerializer",[1728,2565,2207],{"class":1745},[1728,2567,2284],{"class":1756},[1728,2569,2287],{"class":1745},[1728,2571,2572,2575,2578,2580,2583,2585,2588,2590,2593,2595,2597,2600,2602,2604,2606,2609],{"class":1730,"line":1763},[1728,2573,2574],{"class":1756},"  QoraSerializer",[1728,2576,2577],{"class":1745},"(toJson",[1728,2579,1852],{"class":1752},[1728,2581,2582],{"class":1745}," (u) ",[1728,2584,1861],{"class":1752},[1728,2586,2587],{"class":1745}," u",[1728,2589,697],{"class":1752},[1728,2591,2592],{"class":2134},"toJson",[1728,2594,1871],{"class":1745},[1728,2596,1893],{"class":1752},[1728,2598,2599],{"class":1745}," fromJson",[1728,2601,1852],{"class":1752},[1728,2603,2190],{"class":1756},[1728,2605,697],{"class":1752},[1728,2607,2608],{"class":1745},"fromJson)",[1728,2610,1874],{"class":1752},[1728,2612,2613,2616,2618,2621],{"class":1730,"line":1790},[1728,2614,2615],{"class":1745},"  name",[1728,2617,1852],{"class":1752},[1728,2619,2620],{"class":2301}," 'User'",[1728,2622,1874],{"class":1752},[1728,2624,2625,2627],{"class":1730,"line":1810},[1728,2626,1106],{"class":1745},[1728,2628,1947],{"class":1752},[1728,2630,2631,2634,2637,2639,2642,2644],{"class":1730,"line":1817},[1728,2632,2633],{"class":1741},"await",[1728,2635,2636],{"class":1745}," client",[1728,2638,697],{"class":1752},[1728,2640,2641],{"class":2134},"hydrate",[1728,2643,1871],{"class":1745},[1728,2645,1947],{"class":1752},[348,2647,1950,2648,2650],{},[384,2649,2355],{}," string must be stable across app versions and build modes (including obfuscated builds).",[352,2652],{},[537,2654,2656],{"id":2655},"no-react-suspense-equivalent","No React Suspense equivalent",[348,2658,2659,2660,2663,2664,2666],{},"TanStack Query supports ",[384,2661,2662],{},"suspense: true"," to integrate with React Suspense. Flutter has no equivalent mechanism. All async state is handled through ",[384,2665,1589],{}," pattern matching in the widget tree.",[352,2668],{},[355,2670,163],{"id":2671},"infinite-queries",[360,2673,2674,2684],{},[363,2675,2676],{},[366,2677,2678,2681],{},[369,2679,2680],{},"TanStack Query",[369,2682,2683],{},"Qora",[376,2685,2686,2698,2710,2722,2734,2746,2758,2770,2782,2794,2806,2818,2830,2842,2854,2866,2879],{},[366,2687,2688,2692],{},[381,2689,2690],{},[384,2691,438],{},[381,2693,2694,457,2696],{},[384,2695,118],{},[384,2697,438],{},[366,2699,2700,2705],{},[381,2701,2702],{},[384,2703,2704],{},"queryFn({ pageParam })",[381,2706,2707],{},[384,2708,2709],{},"fetcher(TPageParam pageParam)",[366,2711,2712,2717],{},[381,2713,2714],{},[384,2715,2716],{},"initialPageParam",[381,2718,2719],{},[384,2720,2721],{},"InfiniteQueryOptions.initialPageParam",[366,2723,2724,2729],{},[381,2725,2726],{},[384,2727,2728],{},"getNextPageParam(lastPage, pages)",[381,2730,2731],{},[384,2732,2733],{},"InfiniteQueryOptions.getNextPageParam(lastPage, pages)",[366,2735,2736,2741],{},[381,2737,2738],{},[384,2739,2740],{},"getPreviousPageParam",[381,2742,2743],{},[384,2744,2745],{},"InfiniteQueryOptions.getPreviousPageParam",[366,2747,2748,2753],{},[381,2749,2750],{},[384,2751,2752],{},"maxPages",[381,2754,2755],{},[384,2756,2757],{},"InfiniteQueryOptions.maxPages",[366,2759,2760,2765],{},[381,2761,2762],{},[384,2763,2764],{},"fetchNextPage()",[381,2766,2767],{},[384,2768,2769],{},"observer.fetchNextPage()",[366,2771,2772,2777],{},[381,2773,2774],{},[384,2775,2776],{},"fetchPreviousPage()",[381,2778,2779],{},[384,2780,2781],{},"observer.fetchPreviousPage()",[366,2783,2784,2789],{},[381,2785,2786],{},[384,2787,2788],{},"hasNextPage",[381,2790,2791],{},[384,2792,2793],{},"InfiniteSuccess.hasNextPage",[366,2795,2796,2801],{},[381,2797,2798],{},[384,2799,2800],{},"hasPreviousPage",[381,2802,2803],{},[384,2804,2805],{},"InfiniteSuccess.hasPreviousPage",[366,2807,2808,2813],{},[381,2809,2810],{},[384,2811,2812],{},"isFetchingNextPage",[381,2814,2815],{},[384,2816,2817],{},"InfiniteSuccess.isFetchingNextPage",[366,2819,2820,2825],{},[381,2821,2822],{},[384,2823,2824],{},"isFetchingPreviousPage",[381,2826,2827],{},[384,2828,2829],{},"InfiniteSuccess.isFetchingPreviousPage",[366,2831,2832,2837],{},[381,2833,2834],{},[384,2835,2836],{},"data.pages",[381,2838,2839],{},[384,2840,2841],{},"InfiniteData.pages",[366,2843,2844,2849],{},[381,2845,2846],{},[384,2847,2848],{},"data.pageParams",[381,2850,2851],{},[384,2852,2853],{},"InfiniteData.pageParams",[366,2855,2856,2861],{},[381,2857,2858],{},[384,2859,2860],{},"data.pages.flat()",[381,2862,2863],{},[384,2864,2865],{},"InfiniteData.flatten((page) => page.items)",[366,2867,2868,2874],{},[381,2869,2870,2873],{},[384,2871,2872],{},"queryClient.setQueryData"," (infinite)",[381,2875,2876],{},[384,2877,2878],{},"client.setInfiniteQueryData\u003CTData, TPageParam>(key, InfiniteData)",[366,2880,2881,2886],{},[381,2882,2883,2873],{},[384,2884,2885],{},"queryClient.getQueryData",[381,2887,2888],{},[384,2889,2890],{},"client.getInfiniteQueryData\u003CTData, TPageParam>(key)",[352,2892],{},[355,2894,237],{"id":2895},"devtools",[348,2897,2898,2899,2901,2902,2905],{},"TanStack Query DevTools is a browser panel installed as a React component. Qora's equivalent is an in-app overlay: install ",[384,2900,528],{}," and wrap the app with ",[384,2903,2904],{},"QoraInspector",". It shows queries, mutations and a timeline, and renders nothing in release builds.",[348,2907,2908,2909,2912],{},"See ",[795,2910,2911],{"href":244},"DevTools overview"," for setup instructions.",[352,2914],{},[355,2916,2918],{"id":2917},"related","Related",[2444,2920,2921,2928,2934,2940,2946],{},[2447,2922,2923,2927],{},[795,2924,2926],{"href":2925},"./what-is-qora","What is Qora",": conceptual overview",[2447,2929,2930,2933],{},[795,2931,21],{"href":2932},"./quick-start",": five-minute setup",[2447,2935,2936,2939],{},[795,2937,211],{"href":2938},"../api-reference/qora-state",": sealed class reference",[2447,2941,2942,2945],{},[795,2943,215],{"href":2944},"../api-reference/qora-options",": full per-query option reference",[2447,2947,2948,2951],{},[795,2949,220],{"href":2950},"../api-reference/qora-client-config",": global configuration reference",[2953,2954,2955],"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":1724,"searchDepth":1738,"depth":1738,"links":2957},[2958,2959,2963,2967,2969,2983,2984,2985],{"id":357,"depth":1738,"text":358},{"id":534,"depth":1738,"text":535,"children":2960},[2961,2962],{"id":539,"depth":1763,"text":540},{"id":910,"depth":1763,"text":911},{"id":1130,"depth":1738,"text":1131,"children":2964},[2965,2966],{"id":1134,"depth":1763,"text":540},{"id":1324,"depth":1763,"text":1325},{"id":1500,"depth":1738,"text":2968},"API Reference: QueryClient → QoraClient",{"id":1696,"depth":1738,"text":1697,"children":2970},[2971,2972,2974,2976,2978,2979,2981,2982],{"id":1700,"depth":1763,"text":1701},{"id":1969,"depth":1763,"text":2973},"previousData is always present",{"id":2095,"depth":1763,"text":2975},"select filters rebuilds, it does not transform",{"id":2417,"depth":1763,"text":2977},"gcTime replaces cacheTime",{"id":2433,"depth":1763,"text":2434},{"id":2493,"depth":1763,"text":2980},"QoraScope is a StatefulWidget, not a Provider",{"id":2528,"depth":1763,"text":2529},{"id":2655,"depth":1763,"text":2656},{"id":2671,"depth":1738,"text":163},{"id":2895,"depth":1738,"text":237},{"id":2917,"depth":1738,"text":2918},"A precise mapping of TanStack Query concepts, hooks, and configuration options to their Qora equivalents. Covers what is identical, what is renamed, and what works differently.","md",null,{},{"icon":33},{"title":2992,"description":2993},"Coming from TanStack Query - Qora","Migrate from TanStack Query (React Query) to Qora. Concept map, API equivalents, and key differences explained for developers already familiar with TanStack Query.","Aq6Pjr2YVcxj4ODeEmpZMAIXpmesYas2w_6nPiSCSGs",[2996,2998],{"title":25,"path":26,"stem":27,"description":2997,"icon":28,"children":-1},"How Qora compares to flutter_query and cached_query, the other server-state libraries for Flutter.",{"title":35,"path":36,"stem":37,"description":2999,"icon":38,"children":-1},"Map flutter_query and cached_query concepts to Qora and migrate one screen at a time.",1794040396686]