[{"data":1,"prerenderedAt":1827},["ShallowReactive",2],{"navigation_docs_en":3,"-en-api-reference-qora-key":342,"-en-api-reference-qora-key-surround":1822},[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":207,"body":344,"description":1815,"extension":1816,"links":1817,"meta":1818,"navigation":1819,"path":208,"seo":1820,"stem":209,"__hash__":1821},"docs_en/en/05.api-reference/2.qora-key.md",{"type":345,"value":346,"toc":1795},"minimark",[347,351,355,459,467,470,474,481,484,537,539,545,548,572,574,580,583,628,630,636,639,681,683,689,694,730,732,736,741,762,765,817,819,823,831,943,946,1037,1050,1052,1058,1084,1090,1108,1114,1181,1195,1197,1201,1204,1556,1558,1561,1565,1678,1682,1791],[348,349,243],"h2",{"id":350},"overview",[352,353,354],"p",{},"Every Qora query is identified by a key. Qora accepts two equivalent formats:",[356,357,363],"pre",{"className":358,"code":359,"filename":360,"language":361,"meta":362,"style":362},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Raw list: frictionless, no import needed\nkey: ['users', userId]\n\n// QoraKey wrapper: explicit, typed\nkey: QoraKey(['users', userId])\nkey: QoraKey.withId('users', userId)\n","main.dart","dart","",[364,365,366,375,399,406,412,433],"code",{"__ignoreMap":362},[367,368,371],"span",{"class":369,"line":370},"line",1,[367,372,374],{"class":373},"sHwdD","// Raw list: frictionless, no import needed\n",[367,376,378,382,386,389,393,396],{"class":369,"line":377},2,[367,379,381],{"class":380},"sTEyZ","key",[367,383,385],{"class":384},"sMK4o",":",[367,387,388],{"class":380}," [",[367,390,392],{"class":391},"sfazB","'users'",[367,394,395],{"class":384},",",[367,397,398],{"class":380}," userId]\n",[367,400,402],{"class":369,"line":401},3,[367,403,405],{"emptyLinePlaceholder":404},true,"\n",[367,407,409],{"class":369,"line":408},4,[367,410,411],{"class":373},"// QoraKey wrapper: explicit, typed\n",[367,413,415,417,419,423,426,428,430],{"class":369,"line":414},5,[367,416,381],{"class":380},[367,418,385],{"class":384},[367,420,422],{"class":421},"sBMFI"," QoraKey",[367,424,425],{"class":380},"([",[367,427,392],{"class":391},[367,429,395],{"class":384},[367,431,432],{"class":380}," userId])\n",[367,434,436,438,440,442,445,449,452,454,456],{"class":369,"line":435},6,[367,437,381],{"class":380},[367,439,385],{"class":384},[367,441,422],{"class":421},[367,443,444],{"class":384},".",[367,446,448],{"class":447},"s2Zo4","withId",[367,450,451],{"class":380},"(",[367,453,392],{"class":391},[367,455,395],{"class":384},[367,457,458],{"class":380}," userId)\n",[352,460,461,462,466],{},"Both are normalised to the same internal representation and compared with ",[463,464,465],"strong",{},"deep structural equality",". They are fully interchangeable: you can mix them across calls to the same logical query.",[468,469],"hr",{},[348,471,473],{"id":472},"constructors","Constructors",[475,476,478],"h3",{"id":477},"qorakeylistdynamic-parts",[364,479,480],{},"QoraKey(List\u003Cdynamic> parts)",[352,482,483],{},"Direct constructor from a list of parts.",[356,485,487],{"className":358,"code":486,"filename":360,"language":361,"meta":362,"style":362},"QoraKey(['users', userId])\nQoraKey(['posts', {'status': 'published', 'page': 1}])\n",[364,488,489,501],{"__ignoreMap":362},[367,490,491,493,495,497,499],{"class":369,"line":370},[367,492,207],{"class":421},[367,494,425],{"class":380},[367,496,392],{"class":391},[367,498,395],{"class":384},[367,500,432],{"class":380},[367,502,503,505,507,510,512,515,518,520,523,525,528,530,534],{"class":369,"line":377},[367,504,207],{"class":421},[367,506,425],{"class":380},[367,508,509],{"class":391},"'posts'",[367,511,395],{"class":384},[367,513,514],{"class":380}," {",[367,516,517],{"class":391},"'status'",[367,519,385],{"class":384},[367,521,522],{"class":391}," 'published'",[367,524,395],{"class":384},[367,526,527],{"class":391}," 'page'",[367,529,385],{"class":384},[367,531,533],{"class":532},"sbssI"," 1",[367,535,536],{"class":380},"}])\n",[468,538],{},[475,540,542],{"id":541},"qorakeysinglestring-key",[364,543,544],{},"QoraKey.single(String key)",[352,546,547],{},"Shorthand for a single-segment key.",[356,549,551],{"className":358,"code":550,"filename":360,"language":361,"meta":362,"style":362},"QoraKey.single('users')  // equivalent to QoraKey(['users'])\n",[364,552,553],{"__ignoreMap":362},[367,554,555,557,559,562,564,566,569],{"class":369,"line":370},[367,556,207],{"class":421},[367,558,444],{"class":384},[367,560,561],{"class":447},"single",[367,563,451],{"class":380},[367,565,392],{"class":391},[367,567,568],{"class":380},")  ",[367,570,571],{"class":373},"// equivalent to QoraKey(['users'])\n",[468,573],{},[475,575,577],{"id":576},"qorakeywithidstring-entity-dynamic-id",[364,578,579],{},"QoraKey.withId(String entity, dynamic id)",[352,581,582],{},"Shorthand for an entity + ID key.",[356,584,586],{"className":358,"code":585,"filename":360,"language":361,"meta":362,"style":362},"QoraKey.withId('users', userId)     // ['users', userId]\nQoraKey.withId('posts', postId)     // ['posts', postId]\n",[364,587,588,608],{"__ignoreMap":362},[367,589,590,592,594,596,598,600,602,605],{"class":369,"line":370},[367,591,207],{"class":421},[367,593,444],{"class":384},[367,595,448],{"class":447},[367,597,451],{"class":380},[367,599,392],{"class":391},[367,601,395],{"class":384},[367,603,604],{"class":380}," userId)     ",[367,606,607],{"class":373},"// ['users', userId]\n",[367,609,610,612,614,616,618,620,622,625],{"class":369,"line":377},[367,611,207],{"class":421},[367,613,444],{"class":384},[367,615,448],{"class":447},[367,617,451],{"class":380},[367,619,509],{"class":391},[367,621,395],{"class":384},[367,623,624],{"class":380}," postId)     ",[367,626,627],{"class":373},"// ['posts', postId]\n",[468,629],{},[475,631,633],{"id":632},"qorakeywithfilterstring-entity-mapstring-dynamic-filter",[364,634,635],{},"QoraKey.withFilter(String entity, Map\u003CString, dynamic> filter)",[352,637,638],{},"Shorthand for an entity + filter map key.",[356,640,642],{"className":358,"code":641,"filename":360,"language":361,"meta":362,"style":362},"QoraKey.withFilter('posts', {'status': 'published', 'page': page})\n// ['posts', {'status': 'published', 'page': page}]\n",[364,643,644,676],{"__ignoreMap":362},[367,645,646,648,650,653,655,657,659,661,663,665,667,669,671,673],{"class":369,"line":370},[367,647,207],{"class":421},[367,649,444],{"class":384},[367,651,652],{"class":447},"withFilter",[367,654,451],{"class":380},[367,656,509],{"class":391},[367,658,395],{"class":384},[367,660,514],{"class":380},[367,662,517],{"class":391},[367,664,385],{"class":384},[367,666,522],{"class":391},[367,668,395],{"class":384},[367,670,527],{"class":391},[367,672,385],{"class":384},[367,674,675],{"class":380}," page})\n",[367,677,678],{"class":369,"line":377},[367,679,680],{"class":373},"// ['posts', {'status': 'published', 'page': page}]\n",[468,682],{},[475,684,686],{"id":685},"qorakeyfromlistdynamic-parts",[364,687,688],{},"QoraKey.from(List\u003Cdynamic> parts)",[352,690,691,692,444],{},"Factory constructor that converts a raw list to a ",[364,693,207],{},[356,695,697],{"className":358,"code":696,"filename":360,"language":361,"meta":362,"style":362},"final key = QoraKey.from(['users', userId]);\n",[364,698,699],{"__ignoreMap":362},[367,700,701,705,708,711,713,715,718,720,722,724,727],{"class":369,"line":370},[367,702,704],{"class":703},"spNyl","final",[367,706,707],{"class":380}," key ",[367,709,710],{"class":384},"=",[367,712,422],{"class":421},[367,714,444],{"class":384},[367,716,717],{"class":447},"from",[367,719,425],{"class":380},[367,721,392],{"class":391},[367,723,395],{"class":384},[367,725,726],{"class":380}," userId])",[367,728,729],{"class":384},";\n",[468,731],{},[348,733,735],{"id":734},"properties","Properties",[475,737,739],{"id":738},"parts",[364,740,738],{},[356,742,744],{"className":358,"code":743,"language":361,"meta":362,"style":362},"final List\u003Cdynamic> parts\n",[364,745,746],{"__ignoreMap":362},[367,747,748,750,753,756,759],{"class":369,"line":370},[367,749,704],{"class":703},[367,751,752],{"class":421}," List",[367,754,755],{"class":380},"\u003C",[367,757,758],{"class":421},"dynamic",[367,760,761],{"class":380},"> parts\n",[352,763,764],{},"The raw key segments as an unmodifiable list.",[356,766,768],{"className":358,"code":767,"filename":360,"language":361,"meta":362,"style":362},"final key = QoraKey.withId('users', 42);\nprint(key.parts); // [users, 42]\n",[364,769,770,798],{"__ignoreMap":362},[367,771,772,774,776,778,780,782,784,786,788,790,793,796],{"class":369,"line":370},[367,773,704],{"class":703},[367,775,707],{"class":380},[367,777,710],{"class":384},[367,779,422],{"class":421},[367,781,444],{"class":384},[367,783,448],{"class":447},[367,785,451],{"class":380},[367,787,392],{"class":391},[367,789,395],{"class":384},[367,791,792],{"class":532}," 42",[367,794,795],{"class":380},")",[367,797,729],{"class":384},[367,799,800,803,806,808,811,814],{"class":369,"line":377},[367,801,802],{"class":447},"print",[367,804,805],{"class":380},"(key",[367,807,444],{"class":384},[367,809,810],{"class":380},"parts)",[367,812,813],{"class":384},";",[367,815,816],{"class":373}," // [users, 42]\n",[468,818],{},[348,820,822],{"id":821},"equality","Equality",[352,824,825,827,828,830],{},[364,826,207],{}," uses ",[463,829,465],{},": two keys are equal if their parts are recursively equal:",[356,832,834],{"className":358,"code":833,"filename":360,"language":361,"meta":362,"style":362},"QoraKey(['users', 1]) == QoraKey(['users', 1])  // true\nQoraKey(['users', 1]) == QoraKey(['users', 2])  // false\n\n// Raw list and QoraKey are normalised identically\n['users', 1] == QoraKey(['users', 1])           // normalised to same cache entry\n",[364,835,836,870,902,906,911],{"__ignoreMap":362},[367,837,838,840,842,844,846,848,851,854,856,858,860,862,864,867],{"class":369,"line":370},[367,839,207],{"class":421},[367,841,425],{"class":380},[367,843,392],{"class":391},[367,845,395],{"class":384},[367,847,533],{"class":532},[367,849,850],{"class":380},"]) ",[367,852,853],{"class":384},"==",[367,855,422],{"class":421},[367,857,425],{"class":380},[367,859,392],{"class":391},[367,861,395],{"class":384},[367,863,533],{"class":532},[367,865,866],{"class":380},"])  ",[367,868,869],{"class":373},"// true\n",[367,871,872,874,876,878,880,882,884,886,888,890,892,894,897,899],{"class":369,"line":377},[367,873,207],{"class":421},[367,875,425],{"class":380},[367,877,392],{"class":391},[367,879,395],{"class":384},[367,881,533],{"class":532},[367,883,850],{"class":380},[367,885,853],{"class":384},[367,887,422],{"class":421},[367,889,425],{"class":380},[367,891,392],{"class":391},[367,893,395],{"class":384},[367,895,896],{"class":532}," 2",[367,898,866],{"class":380},[367,900,901],{"class":373},"// false\n",[367,903,904],{"class":369,"line":401},[367,905,405],{"emptyLinePlaceholder":404},[367,907,908],{"class":369,"line":408},[367,909,910],{"class":373},"// Raw list and QoraKey are normalised identically\n",[367,912,913,916,918,920,922,925,927,929,931,933,935,937,940],{"class":369,"line":414},[367,914,915],{"class":380},"[",[367,917,392],{"class":391},[367,919,395],{"class":384},[367,921,533],{"class":532},[367,923,924],{"class":380},"] ",[367,926,853],{"class":384},[367,928,422],{"class":421},[367,930,425],{"class":380},[367,932,392],{"class":391},[367,934,395],{"class":384},[367,936,533],{"class":532},[367,938,939],{"class":380},"])           ",[367,941,942],{"class":373},"// normalised to same cache entry\n",[352,944,945],{},"Supported types in key parts:",[947,948,949,962],"table",{},[950,951,952],"thead",{},[953,954,955,959],"tr",{},[956,957,958],"th",{},"Type",[956,960,961],{},"Support",[963,964,965,983,992,1002,1012,1022],"tbody",{},[953,966,967,980],{},[968,969,970,973,974,973,977],"td",{},[364,971,972],{},"int",", ",[364,975,976],{},"double",[364,978,979],{},"bool",[968,981,982],{},"Full structural equality",[953,984,985,990],{},[968,986,987],{},[364,988,989],{},"String",[968,991,982],{},[953,993,994,999],{},[968,995,996],{},[364,997,998],{},"null",[968,1000,1001],{},"Supported as a key part                            \"../5.api-reference\"",[953,1003,1004,1009],{},[968,1005,1006],{},[364,1007,1008],{},"List",[968,1010,1011],{},"Recursively compared",[953,1013,1014,1019],{},[968,1015,1016],{},[364,1017,1018],{},"Map",[968,1020,1021],{},"Order-independent recursive comparison",[953,1023,1024,1027],{},[968,1025,1026],{},"Custom objects",[968,1028,1029,1030,1033,1034],{},"Must override ",[364,1031,1032],{},"operator =="," and ",[364,1035,1036],{},"hashCode",[1038,1039,1040,1041,1044,1045,1033,1047,1049],"warning",{},"Using custom objects (e.g. ",[364,1042,1043],{},"UserFilter",") in key parts without overriding ",[364,1046,1032],{},[364,1048,1036],{}," causes a new cache entry on every call. Use primitive-serialisable values or implement equality explicitly.",[468,1051],{},[348,1053,1055],{"id":1054},"normalizekey",[364,1056,1057],{},"normalizeKey",[356,1059,1061],{"className":358,"code":1060,"language":361,"meta":362,"style":362},"List\u003Cdynamic> normalizeKey(Object key)\n",[364,1062,1063],{"__ignoreMap":362},[367,1064,1065,1067,1069,1071,1074,1076,1078,1081],{"class":369,"line":370},[367,1066,1008],{"class":421},[367,1068,755],{"class":380},[367,1070,758],{"class":421},[367,1072,1073],{"class":380},"> ",[367,1075,1057],{"class":447},[367,1077,451],{"class":380},[367,1079,1080],{"class":421},"Object",[367,1082,1083],{"class":380}," key)\n",[352,1085,1086,1087,385],{},"Top-level function that normalises any valid key input to an unmodifiable ",[364,1088,1089],{},"List\u003Cdynamic>",[1091,1092,1093,1102,1105],"ul",{},[1094,1095,1096,1097,1099,1100],"li",{},"Accepts ",[364,1098,207],{}," or ",[364,1101,1089],{},[1094,1103,1104],{},"Validates that parts are serialisable",[1094,1106,1107],{},"Returns a deep-copied, unmodifiable list",[352,1109,1110,1111,1113],{},"This is called internally by every ",[364,1112,202],{}," method. You rarely need to call it directly.",[356,1115,1117],{"className":358,"code":1116,"filename":360,"language":361,"meta":362,"style":362},"final parts = normalizeKey(['users', 1]);   // [users, 1] (unmodifiable)\nfinal parts = normalizeKey(QoraKey.withId('users', 1));  // same result\n",[364,1118,1119,1147],{"__ignoreMap":362},[367,1120,1121,1123,1126,1128,1131,1133,1135,1137,1139,1142,1144],{"class":369,"line":370},[367,1122,704],{"class":703},[367,1124,1125],{"class":380}," parts ",[367,1127,710],{"class":384},[367,1129,1130],{"class":447}," normalizeKey",[367,1132,425],{"class":380},[367,1134,392],{"class":391},[367,1136,395],{"class":384},[367,1138,533],{"class":532},[367,1140,1141],{"class":380},"])",[367,1143,813],{"class":384},[367,1145,1146],{"class":373},"   // [users, 1] (unmodifiable)\n",[367,1148,1149,1151,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171,1173,1176,1178],{"class":369,"line":377},[367,1150,704],{"class":703},[367,1152,1125],{"class":380},[367,1154,710],{"class":384},[367,1156,1130],{"class":447},[367,1158,451],{"class":380},[367,1160,207],{"class":421},[367,1162,444],{"class":384},[367,1164,448],{"class":447},[367,1166,451],{"class":380},[367,1168,392],{"class":391},[367,1170,395],{"class":384},[367,1172,533],{"class":532},[367,1174,1175],{"class":380},"))",[367,1177,813],{"class":384},[367,1179,1180],{"class":373},"  // same result\n",[352,1182,1183,1186,1187,1190,1191,1099,1193,444],{},[463,1184,1185],{},"Throws"," ",[364,1188,1189],{},"ArgumentError"," if the key is not a ",[364,1192,1008],{},[364,1194,207],{},[468,1196],{},[348,1198,1200],{"id":1199},"key-factories-pattern","Key Factories Pattern",[352,1202,1203],{},"Centralise your key definitions to avoid typos and simplify invalidation:",[356,1205,1208],{"className":358,"code":1206,"filename":1207,"language":361,"meta":362,"style":362},"abstract class Keys {\n  // Users\n  static List\u003Cdynamic> users()               => ['users'];\n  static List\u003Cdynamic> user(int id)          => ['users', id];\n  static List\u003Cdynamic> userPosts(int userId) => ['users', userId, 'posts'];\n\n  // Posts\n  static List\u003Cdynamic> posts(Map\u003CString, dynamic> filters) => ['posts', filters];\n  static List\u003Cdynamic> post(int id)          => ['posts', id];\n}\n\n// Usage\nawait client.fetchQuery\u003CUser>(\n  key: Keys.user(userId),\n  fetcher: () => api.getUser(userId),\n);\n\nclient.invalidateWhere((key) => equalsKey(key, Keys.users()));\n","lib/query_keys.dart",[364,1209,1210,1224,1229,1260,1295,1337,1341,1347,1391,1425,1431,1436,1442,1465,1485,1510,1517,1522],{"__ignoreMap":362},[367,1211,1212,1215,1218,1221],{"class":369,"line":370},[367,1213,1214],{"class":384},"abstract",[367,1216,1217],{"class":384}," class",[367,1219,1220],{"class":421}," Keys",[367,1222,1223],{"class":380}," {\n",[367,1225,1226],{"class":369,"line":377},[367,1227,1228],{"class":373},"  // Users\n",[367,1230,1231,1234,1236,1238,1240,1242,1245,1248,1251,1253,1255,1258],{"class":369,"line":401},[367,1232,1233],{"class":703},"  static",[367,1235,752],{"class":421},[367,1237,755],{"class":380},[367,1239,758],{"class":421},[367,1241,1073],{"class":380},[367,1243,1244],{"class":447},"users",[367,1246,1247],{"class":380},"()               ",[367,1249,1250],{"class":384},"=>",[367,1252,388],{"class":380},[367,1254,392],{"class":391},[367,1256,1257],{"class":380},"]",[367,1259,729],{"class":384},[367,1261,1262,1264,1266,1268,1270,1272,1275,1277,1279,1282,1284,1286,1288,1290,1293],{"class":369,"line":408},[367,1263,1233],{"class":703},[367,1265,752],{"class":421},[367,1267,755],{"class":380},[367,1269,758],{"class":421},[367,1271,1073],{"class":380},[367,1273,1274],{"class":447},"user",[367,1276,451],{"class":380},[367,1278,972],{"class":421},[367,1280,1281],{"class":380}," id)          ",[367,1283,1250],{"class":384},[367,1285,388],{"class":380},[367,1287,392],{"class":391},[367,1289,395],{"class":384},[367,1291,1292],{"class":380}," id]",[367,1294,729],{"class":384},[367,1296,1297,1299,1301,1303,1305,1307,1310,1312,1314,1317,1319,1321,1323,1325,1328,1330,1333,1335],{"class":369,"line":414},[367,1298,1233],{"class":703},[367,1300,752],{"class":421},[367,1302,755],{"class":380},[367,1304,758],{"class":421},[367,1306,1073],{"class":380},[367,1308,1309],{"class":447},"userPosts",[367,1311,451],{"class":380},[367,1313,972],{"class":421},[367,1315,1316],{"class":380}," userId) ",[367,1318,1250],{"class":384},[367,1320,388],{"class":380},[367,1322,392],{"class":391},[367,1324,395],{"class":384},[367,1326,1327],{"class":380}," userId",[367,1329,395],{"class":384},[367,1331,1332],{"class":391}," 'posts'",[367,1334,1257],{"class":380},[367,1336,729],{"class":384},[367,1338,1339],{"class":369,"line":435},[367,1340,405],{"emptyLinePlaceholder":404},[367,1342,1344],{"class":369,"line":1343},7,[367,1345,1346],{"class":373},"  // Posts\n",[367,1348,1350,1352,1354,1356,1358,1360,1363,1365,1367,1369,1371,1373,1375,1378,1380,1382,1384,1386,1389],{"class":369,"line":1349},8,[367,1351,1233],{"class":703},[367,1353,752],{"class":421},[367,1355,755],{"class":380},[367,1357,758],{"class":421},[367,1359,1073],{"class":380},[367,1361,1362],{"class":447},"posts",[367,1364,451],{"class":380},[367,1366,1018],{"class":421},[367,1368,755],{"class":380},[367,1370,989],{"class":421},[367,1372,973],{"class":380},[367,1374,758],{"class":421},[367,1376,1377],{"class":380},"> filters) ",[367,1379,1250],{"class":384},[367,1381,388],{"class":380},[367,1383,509],{"class":391},[367,1385,395],{"class":384},[367,1387,1388],{"class":380}," filters]",[367,1390,729],{"class":384},[367,1392,1394,1396,1398,1400,1402,1404,1407,1409,1411,1413,1415,1417,1419,1421,1423],{"class":369,"line":1393},9,[367,1395,1233],{"class":703},[367,1397,752],{"class":421},[367,1399,755],{"class":380},[367,1401,758],{"class":421},[367,1403,1073],{"class":380},[367,1405,1406],{"class":447},"post",[367,1408,451],{"class":380},[367,1410,972],{"class":421},[367,1412,1281],{"class":380},[367,1414,1250],{"class":384},[367,1416,388],{"class":380},[367,1418,509],{"class":391},[367,1420,395],{"class":384},[367,1422,1292],{"class":380},[367,1424,729],{"class":384},[367,1426,1428],{"class":369,"line":1427},10,[367,1429,1430],{"class":380},"}\n",[367,1432,1434],{"class":369,"line":1433},11,[367,1435,405],{"emptyLinePlaceholder":404},[367,1437,1439],{"class":369,"line":1438},12,[367,1440,1441],{"class":373},"// Usage\n",[367,1443,1445,1449,1452,1454,1457,1459,1462],{"class":369,"line":1444},13,[367,1446,1448],{"class":1447},"s7zQu","await",[367,1450,1451],{"class":380}," client",[367,1453,444],{"class":384},[367,1455,1456],{"class":447},"fetchQuery",[367,1458,755],{"class":380},[367,1460,1461],{"class":421},"User",[367,1463,1464],{"class":380},">(\n",[367,1466,1468,1471,1473,1475,1477,1479,1482],{"class":369,"line":1467},14,[367,1469,1470],{"class":380},"  key",[367,1472,385],{"class":384},[367,1474,1220],{"class":421},[367,1476,444],{"class":384},[367,1478,1274],{"class":447},[367,1480,1481],{"class":380},"(userId)",[367,1483,1484],{"class":384},",\n",[367,1486,1488,1491,1493,1496,1498,1501,1503,1506,1508],{"class":369,"line":1487},15,[367,1489,1490],{"class":380},"  fetcher",[367,1492,385],{"class":384},[367,1494,1495],{"class":380}," () ",[367,1497,1250],{"class":384},[367,1499,1500],{"class":380}," api",[367,1502,444],{"class":384},[367,1504,1505],{"class":447},"getUser",[367,1507,1481],{"class":380},[367,1509,1484],{"class":384},[367,1511,1513,1515],{"class":369,"line":1512},16,[367,1514,795],{"class":380},[367,1516,729],{"class":384},[367,1518,1520],{"class":369,"line":1519},17,[367,1521,405],{"emptyLinePlaceholder":404},[367,1523,1525,1528,1530,1533,1536,1538,1541,1543,1545,1547,1549,1551,1554],{"class":369,"line":1524},18,[367,1526,1527],{"class":380},"client",[367,1529,444],{"class":384},[367,1531,1532],{"class":447},"invalidateWhere",[367,1534,1535],{"class":380},"((key) ",[367,1537,1250],{"class":384},[367,1539,1540],{"class":447}," equalsKey",[367,1542,805],{"class":380},[367,1544,395],{"class":384},[367,1546,1220],{"class":421},[367,1548,444],{"class":384},[367,1550,1244],{"class":447},[367,1552,1553],{"class":380},"()))",[367,1555,729],{"class":384},[468,1557],{},[348,1559,133],{"id":1560},"best-practices",[475,1562,1564],{"id":1563},"do","Do",[356,1566,1568],{"className":358,"code":1567,"filename":360,"language":361,"meta":362,"style":362},"// Consistent structure: entity first, then ID/filters\n['users', userId]\n['users', userId, 'posts']\n['posts', {'status': 'published'}]\n\n// Use primitives: always comparable\n['users', userId.toString()]\n['posts', {'page': page, 'limit': 20}]\n",[364,1569,1570,1575,1585,1602,1621,1625,1630,1648],{"__ignoreMap":362},[367,1571,1572],{"class":369,"line":370},[367,1573,1574],{"class":373},"// Consistent structure: entity first, then ID/filters\n",[367,1576,1577,1579,1581,1583],{"class":369,"line":377},[367,1578,915],{"class":380},[367,1580,392],{"class":391},[367,1582,395],{"class":384},[367,1584,398],{"class":380},[367,1586,1587,1589,1591,1593,1595,1597,1599],{"class":369,"line":401},[367,1588,915],{"class":380},[367,1590,392],{"class":391},[367,1592,395],{"class":384},[367,1594,1327],{"class":380},[367,1596,395],{"class":384},[367,1598,1332],{"class":391},[367,1600,1601],{"class":380},"]\n",[367,1603,1604,1606,1608,1610,1612,1614,1616,1618],{"class":369,"line":408},[367,1605,915],{"class":380},[367,1607,509],{"class":391},[367,1609,395],{"class":384},[367,1611,514],{"class":380},[367,1613,517],{"class":391},[367,1615,385],{"class":384},[367,1617,522],{"class":391},[367,1619,1620],{"class":380},"}]\n",[367,1622,1623],{"class":369,"line":414},[367,1624,405],{"emptyLinePlaceholder":404},[367,1626,1627],{"class":369,"line":435},[367,1628,1629],{"class":373},"// Use primitives: always comparable\n",[367,1631,1632,1634,1636,1638,1640,1642,1645],{"class":369,"line":1343},[367,1633,915],{"class":380},[367,1635,392],{"class":391},[367,1637,395],{"class":384},[367,1639,1327],{"class":380},[367,1641,444],{"class":384},[367,1643,1644],{"class":447},"toString",[367,1646,1647],{"class":380},"()]\n",[367,1649,1650,1652,1654,1656,1658,1661,1663,1666,1668,1671,1673,1676],{"class":369,"line":1349},[367,1651,915],{"class":380},[367,1653,509],{"class":391},[367,1655,395],{"class":384},[367,1657,514],{"class":380},[367,1659,1660],{"class":391},"'page'",[367,1662,385],{"class":384},[367,1664,1665],{"class":380}," page",[367,1667,395],{"class":384},[367,1669,1670],{"class":391}," 'limit'",[367,1672,385],{"class":384},[367,1674,1675],{"class":532}," 20",[367,1677,1620],{"class":380},[475,1679,1681],{"id":1680},"dont","Don't",[356,1683,1685],{"className":358,"code":1684,"filename":360,"language":361,"meta":362,"style":362},"// Inconsistent ordering\n['users', userId]\n[userId, 'users']  // Bad: Different cache entry\n\n// Custom objects without equality\n['users', UserFilter(status: 'active')]  // Bad: Identity equality: always a miss\n\n// Computed values that vary on each call\n['posts', DateTime.now().toIso8601String()]  // Bad: Never hits cache\n",[364,1686,1687,1692,1702,1718,1722,1727,1752,1756,1761],{"__ignoreMap":362},[367,1688,1689],{"class":369,"line":370},[367,1690,1691],{"class":373},"// Inconsistent ordering\n",[367,1693,1694,1696,1698,1700],{"class":369,"line":377},[367,1695,915],{"class":380},[367,1697,392],{"class":391},[367,1699,395],{"class":384},[367,1701,398],{"class":380},[367,1703,1704,1707,1709,1712,1715],{"class":369,"line":401},[367,1705,1706],{"class":380},"[userId",[367,1708,395],{"class":384},[367,1710,1711],{"class":391}," 'users'",[367,1713,1714],{"class":380},"]  ",[367,1716,1717],{"class":373},"// Bad: Different cache entry\n",[367,1719,1720],{"class":369,"line":408},[367,1721,405],{"emptyLinePlaceholder":404},[367,1723,1724],{"class":369,"line":414},[367,1725,1726],{"class":373},"// Custom objects without equality\n",[367,1728,1729,1731,1733,1735,1738,1741,1743,1746,1749],{"class":369,"line":435},[367,1730,915],{"class":380},[367,1732,392],{"class":391},[367,1734,395],{"class":384},[367,1736,1737],{"class":421}," UserFilter",[367,1739,1740],{"class":380},"(status",[367,1742,385],{"class":384},[367,1744,1745],{"class":391}," 'active'",[367,1747,1748],{"class":380},")]  ",[367,1750,1751],{"class":373},"// Bad: Identity equality: always a miss\n",[367,1753,1754],{"class":369,"line":1343},[367,1755,405],{"emptyLinePlaceholder":404},[367,1757,1758],{"class":369,"line":1349},[367,1759,1760],{"class":373},"// Computed values that vary on each call\n",[367,1762,1763,1765,1767,1769,1772,1774,1777,1780,1782,1785,1788],{"class":369,"line":1393},[367,1764,915],{"class":380},[367,1766,509],{"class":391},[367,1768,395],{"class":384},[367,1770,1771],{"class":421}," DateTime",[367,1773,444],{"class":384},[367,1775,1776],{"class":447},"now",[367,1778,1779],{"class":380},"()",[367,1781,444],{"class":384},[367,1783,1784],{"class":447},"toIso8601String",[367,1786,1787],{"class":380},"()]  ",[367,1789,1790],{"class":373},"// Bad: Never hits cache\n",[1792,1793,1794],"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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":362,"searchDepth":377,"depth":377,"links":1796},[1797,1798,1805,1808,1809,1810,1811],{"id":350,"depth":377,"text":243},{"id":472,"depth":377,"text":473,"children":1799},[1800,1801,1802,1803,1804],{"id":477,"depth":401,"text":480},{"id":541,"depth":401,"text":544},{"id":576,"depth":401,"text":579},{"id":632,"depth":401,"text":635},{"id":685,"depth":401,"text":688},{"id":734,"depth":377,"text":735,"children":1806},[1807],{"id":738,"depth":401,"text":738},{"id":821,"depth":377,"text":822},{"id":1054,"depth":377,"text":1057},{"id":1199,"depth":377,"text":1200},{"id":1560,"depth":377,"text":133,"children":1812},[1813,1814],{"id":1563,"depth":401,"text":1564},{"id":1680,"depth":401,"text":1681},"Typed, immutable query key with structural equality. Supports both raw List and QoraKey syntax.","md",null,{},{"icon":60},{"title":207,"description":1815},"bmV2oFCzHTcckiup74Y3vRKVLY322OrikcZWG0hVP8c",[1823,1825],{"title":202,"path":203,"stem":204,"description":1824,"icon":205,"children":-1},"The central engine of Qora: manages queries, cache, deduplication, retries, and reactive state",{"title":211,"path":212,"stem":213,"description":1826,"icon":65,"children":-1},"Sealed class hierarchy representing the four possible states of a query. Exhaustive pattern matching is enforced at compile time.",1794040400994]