[{"data":1,"prerenderedAt":1462},["ShallowReactive",2],{"navigation_docs_en":3,"-en-devtools-data-display":342,"-en-devtools-data-display-surround":1457},[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":253,"body":344,"description":1450,"extension":1451,"links":1452,"meta":1453,"navigation":1454,"path":254,"seo":1455,"stem":255,"__hash__":1456},"docs_en/en/06.devtools/4.data-display.md",{"type":345,"value":346,"toc":1434},"minimark",[347,356,359,364,369,485,499,501,505,516,522,620,623,625,632,639,799,802,804,811,822,930,932,936,942,1011,1017,1145,1147,1154,1159,1184,1200,1254,1266,1268,1272,1348,1350,1354,1380,1430],[348,349,350,351,355],"p",{},"The overlay shows cached query data as an expandable JSON tree. How readable that tree is depends on the type ",[352,353,354],"code",{},"T"," returned by the fetcher: most models need no configuration, and the rest need one option.",[357,358],"hr",{},[360,361,363],"h2",{"id":362},"serialization-resolution-order","Serialization resolution order",[348,365,366,368],{},[352,367,202],{}," has no knowledge of domain types. When a fetch settles, the result is passed to the active tracker using the following resolution order:",[370,371,372,388],"table",{},[373,374,375],"thead",{},[376,377,378,382,385],"tr",{},[379,380,381],"th",{},"Priority",[379,383,384],{},"Condition",[379,386,387],{},"Result",[389,390,391,406,430,443,456,471],"tbody",{},[376,392,393,397,403],{},[394,395,396],"td",{},"1",[394,398,399,402],{},[352,400,401],{},"QoraOptions.toJson"," is set",[394,404,405],{},"Calls the provided function and uses its return value",[376,407,408,411,427],{},[394,409,410],{},"2",[394,412,413,416,417,416,420,423,424],{},[352,414,415],{},"String",", ",[352,418,419],{},"num",[352,421,422],{},"bool",", or ",[352,425,426],{},"null",[394,428,429],{},"Passed through unchanged",[376,431,432,435,440],{},[394,433,434],{},"3",[394,436,437],{},[352,438,439],{},"List",[394,441,442],{},"Each element is recursively serialized",[376,444,445,448,453],{},[394,446,447],{},"4",[394,449,450],{},[352,451,452],{},"Map",[394,454,455],{},"Each value is recursively serialized",[376,457,458,461,468],{},[394,459,460],{},"5",[394,462,463,464,467],{},"Object with a ",[352,465,466],{},"toJson()"," method",[394,469,470],{},"Called via dynamic dispatch, result used",[376,472,473,476,479],{},[394,474,475],{},"6",[394,477,478],{},"Everything else",[394,480,481,484],{},[352,482,483],{},".toString()"," called, displayed as a plain string",[348,486,487,488,491,492,495,496,498],{},"The walk is recursive. A ",[352,489,490],{},"List\u003CMap\u003CString, User>>"," is handled correctly without configuration, provided ",[352,493,494],{},"User"," implements ",[352,497,466],{},".",[357,500],{},[360,502,504],{"id":503},"common-scenarios","Common scenarios",[506,507,509,512,513],"h3",{"id":508},"json_serializable-and-freezed",[352,510,511],{},"json_serializable"," and ",[352,514,515],{},"freezed",[348,517,518,519,521],{},"Both code generators produce a ",[352,520,466],{}," method. The serializer detects and calls it automatically. No additional configuration is required.",[523,524,530],"pre",{"className":525,"code":526,"filename":527,"language":528,"meta":529,"style":529},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// @JsonSerializable() or @freezed: no extra config needed\nfetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n);\n","user_repository.dart","dart","",[352,531,532,541,558,584,611],{"__ignoreMap":529},[533,534,537],"span",{"class":535,"line":536},"line",1,[533,538,540],{"class":539},"sHwdD","// @JsonSerializable() or @freezed: no extra config needed\n",[533,542,544,548,552,555],{"class":535,"line":543},2,[533,545,547],{"class":546},"s2Zo4","fetchQuery",[533,549,551],{"class":550},"sTEyZ","\u003C",[533,553,494],{"class":554},"sBMFI",[533,556,557],{"class":550},">(\n",[533,559,561,564,568,571,575,578,581],{"class":535,"line":560},3,[533,562,563],{"class":550},"  key",[533,565,567],{"class":566},"sMK4o",":",[533,569,570],{"class":550}," [",[533,572,574],{"class":573},"sfazB","'users'",[533,576,577],{"class":566},",",[533,579,580],{"class":550}," userId]",[533,582,583],{"class":566},",\n",[533,585,587,590,592,595,598,601,603,606,609],{"class":535,"line":586},4,[533,588,589],{"class":550},"  fetcher",[533,591,567],{"class":566},[533,593,594],{"class":550}," () ",[533,596,597],{"class":566},"=>",[533,599,600],{"class":550}," api",[533,602,498],{"class":566},[533,604,605],{"class":546},"getUser",[533,607,608],{"class":550},"(userId)",[533,610,583],{"class":566},[533,612,614,617],{"class":535,"line":613},5,[533,615,616],{"class":550},")",[533,618,619],{"class":566},";\n",[348,621,622],{},"The overlay renders the full object graph as an expandable tree.",[357,624],{},[506,626,628,629,631],{"id":627},"raw-map-responses","Raw ",[352,630,452],{}," responses",[348,633,634,635,638],{},"When the fetcher returns ",[352,636,637],{},"Map\u003CString, dynamic>"," directly (for example, after manually decoding the HTTP response body), no configuration is required.",[523,640,642],{"className":525,"code":641,"filename":527,"language":528,"meta":529,"style":529},"fetchQuery\u003CMap\u003CString, dynamic>>(\n  key: ['users', userId],\n  fetcher: () async {\n    final response = await http.get(Uri.parse('/users/$userId'));\n    return jsonDecode(response.body) as Map\u003CString, dynamic>;\n  },\n);\n",[352,643,644,664,680,695,749,784,792],{"__ignoreMap":529},[533,645,646,648,650,652,654,656,658,661],{"class":535,"line":536},[533,647,547],{"class":546},[533,649,551],{"class":550},[533,651,452],{"class":554},[533,653,551],{"class":550},[533,655,415],{"class":554},[533,657,416],{"class":550},[533,659,660],{"class":554},"dynamic",[533,662,663],{"class":550},">>(\n",[533,665,666,668,670,672,674,676,678],{"class":535,"line":543},[533,667,563],{"class":550},[533,669,567],{"class":566},[533,671,570],{"class":550},[533,673,574],{"class":573},[533,675,577],{"class":566},[533,677,580],{"class":550},[533,679,583],{"class":566},[533,681,682,684,686,688,692],{"class":535,"line":560},[533,683,589],{"class":550},[533,685,567],{"class":566},[533,687,594],{"class":550},[533,689,691],{"class":690},"s7zQu","async",[533,693,694],{"class":550}," {\n",[533,696,697,701,704,707,710,713,715,718,721,724,726,729,731,734,737,741,744,747],{"class":535,"line":586},[533,698,700],{"class":699},"spNyl","    final",[533,702,703],{"class":550}," response ",[533,705,706],{"class":566},"=",[533,708,709],{"class":690}," await",[533,711,712],{"class":550}," http",[533,714,498],{"class":566},[533,716,717],{"class":546},"get",[533,719,720],{"class":550},"(",[533,722,723],{"class":554},"Uri",[533,725,498],{"class":566},[533,727,728],{"class":546},"parse",[533,730,720],{"class":550},[533,732,733],{"class":573},"'/users/",[533,735,736],{"class":550},"$",[533,738,740],{"class":739},"sHdIc","userId",[533,742,743],{"class":573},"'",[533,745,746],{"class":550},"))",[533,748,619],{"class":566},[533,750,751,754,757,760,762,765,768,771,773,775,777,779,782],{"class":535,"line":613},[533,752,753],{"class":690},"    return",[533,755,756],{"class":546}," jsonDecode",[533,758,759],{"class":550},"(response",[533,761,498],{"class":566},[533,763,764],{"class":550},"body) ",[533,766,767],{"class":566},"as",[533,769,770],{"class":554}," Map",[533,772,551],{"class":550},[533,774,415],{"class":554},[533,776,416],{"class":550},[533,778,660],{"class":554},[533,780,781],{"class":550},">",[533,783,619],{"class":566},[533,785,787,790],{"class":535,"line":786},6,[533,788,789],{"class":550},"  }",[533,791,583],{"class":566},[533,793,795,797],{"class":535,"line":794},7,[533,796,616],{"class":550},[533,798,619],{"class":566},[348,800,801],{},"This approach requires no serialization configuration. The deserialization step must be handled in the fetcher or repository layer rather than in a consuming widget.",[357,803],{},[506,805,807,808],{"id":806},"manual-models-without-tojson","Manual models without ",[352,809,810],{},"toJson",[348,812,813,814,816,817,819,820,498],{},"When a model has no ",[352,815,466],{}," method, the serializer falls back to ",[352,818,483],{}," and displays a single string node. To produce structured output, supply an explicit serializer via ",[352,821,401],{},[523,823,825],{"className":525,"code":824,"filename":527,"language":528,"meta":529,"style":529},"fetchQuery\u003CUser>(\n  key: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: QoraOptions(\n    toJson: (data) => (data as User).toJson(),\n  ),\n);\n",[352,826,827,837,853,873,886,917,924],{"__ignoreMap":529},[533,828,829,831,833,835],{"class":535,"line":536},[533,830,547],{"class":546},[533,832,551],{"class":550},[533,834,494],{"class":554},[533,836,557],{"class":550},[533,838,839,841,843,845,847,849,851],{"class":535,"line":543},[533,840,563],{"class":550},[533,842,567],{"class":566},[533,844,570],{"class":550},[533,846,574],{"class":573},[533,848,577],{"class":566},[533,850,580],{"class":550},[533,852,583],{"class":566},[533,854,855,857,859,861,863,865,867,869,871],{"class":535,"line":560},[533,856,589],{"class":550},[533,858,567],{"class":566},[533,860,594],{"class":550},[533,862,597],{"class":566},[533,864,600],{"class":550},[533,866,498],{"class":566},[533,868,605],{"class":546},[533,870,608],{"class":550},[533,872,583],{"class":566},[533,874,875,878,880,883],{"class":535,"line":586},[533,876,877],{"class":550},"  options",[533,879,567],{"class":566},[533,881,882],{"class":554}," QoraOptions",[533,884,885],{"class":550},"(\n",[533,887,888,891,893,896,898,901,903,906,908,910,912,915],{"class":535,"line":613},[533,889,890],{"class":550},"    toJson",[533,892,567],{"class":566},[533,894,895],{"class":550}," (data) ",[533,897,597],{"class":566},[533,899,900],{"class":550}," (data ",[533,902,767],{"class":566},[533,904,905],{"class":554}," User",[533,907,616],{"class":550},[533,909,498],{"class":566},[533,911,810],{"class":546},[533,913,914],{"class":550},"()",[533,916,583],{"class":566},[533,918,919,922],{"class":535,"line":786},[533,920,921],{"class":550},"  )",[533,923,583],{"class":566},[533,925,926,928],{"class":535,"line":794},[533,927,616],{"class":550},[533,929,619],{"class":566},[357,931],{},[506,933,935],{"id":934},"lists","Lists",[348,937,938,939,941],{},"Lists of typed objects follow the same resolution rules. When the item type implements ",[352,940,466],{},", each element is serialized automatically.",[523,943,946],{"className":525,"code":944,"filename":945,"language":528,"meta":529,"style":529},"fetchQuery\u003CList\u003CPost>>(\n  key: ['posts'],\n  fetcher: () => api.getPosts(),\n  // Post implements toJson(): auto-detected, no extra config.\n);\n","posts_repository.dart",[352,947,948,963,979,1000,1005],{"__ignoreMap":529},[533,949,950,952,954,956,958,961],{"class":535,"line":536},[533,951,547],{"class":546},[533,953,551],{"class":550},[533,955,439],{"class":554},[533,957,551],{"class":550},[533,959,960],{"class":554},"Post",[533,962,663],{"class":550},[533,964,965,967,969,971,974,977],{"class":535,"line":543},[533,966,563],{"class":550},[533,968,567],{"class":566},[533,970,570],{"class":550},[533,972,973],{"class":573},"'posts'",[533,975,976],{"class":550},"]",[533,978,583],{"class":566},[533,980,981,983,985,987,989,991,993,996,998],{"class":535,"line":560},[533,982,589],{"class":550},[533,984,567],{"class":566},[533,986,594],{"class":550},[533,988,597],{"class":566},[533,990,600],{"class":550},[533,992,498],{"class":566},[533,994,995],{"class":546},"getPosts",[533,997,914],{"class":550},[533,999,583],{"class":566},[533,1001,1002],{"class":535,"line":586},[533,1003,1004],{"class":539},"  // Post implements toJson(): auto-detected, no extra config.\n",[533,1006,1007,1009],{"class":535,"line":613},[533,1008,616],{"class":550},[533,1010,619],{"class":566},[348,1012,1013,1014,1016],{},"When individual items lack ",[352,1015,466],{},", provide a serializer:",[523,1018,1020],{"className":525,"code":1019,"filename":945,"language":528,"meta":529,"style":529},"fetchQuery\u003CList\u003CPost>>(\n  key: ['posts'],\n  fetcher: () => api.getPosts(),\n  options: QoraOptions(\n    toJson: (data) => (data as List\u003CPost>).map((p) => p.toJson()).toList(),\n  ),\n);\n",[352,1021,1022,1036,1050,1070,1080,1133,1139],{"__ignoreMap":529},[533,1023,1024,1026,1028,1030,1032,1034],{"class":535,"line":536},[533,1025,547],{"class":546},[533,1027,551],{"class":550},[533,1029,439],{"class":554},[533,1031,551],{"class":550},[533,1033,960],{"class":554},[533,1035,663],{"class":550},[533,1037,1038,1040,1042,1044,1046,1048],{"class":535,"line":543},[533,1039,563],{"class":550},[533,1041,567],{"class":566},[533,1043,570],{"class":550},[533,1045,973],{"class":573},[533,1047,976],{"class":550},[533,1049,583],{"class":566},[533,1051,1052,1054,1056,1058,1060,1062,1064,1066,1068],{"class":535,"line":560},[533,1053,589],{"class":550},[533,1055,567],{"class":566},[533,1057,594],{"class":550},[533,1059,597],{"class":566},[533,1061,600],{"class":550},[533,1063,498],{"class":566},[533,1065,995],{"class":546},[533,1067,914],{"class":550},[533,1069,583],{"class":566},[533,1071,1072,1074,1076,1078],{"class":535,"line":586},[533,1073,877],{"class":550},[533,1075,567],{"class":566},[533,1077,882],{"class":554},[533,1079,885],{"class":550},[533,1081,1082,1084,1086,1088,1090,1092,1094,1097,1099,1101,1104,1106,1109,1112,1114,1117,1119,1121,1124,1126,1129,1131],{"class":535,"line":613},[533,1083,890],{"class":550},[533,1085,567],{"class":566},[533,1087,895],{"class":550},[533,1089,597],{"class":566},[533,1091,900],{"class":550},[533,1093,767],{"class":566},[533,1095,1096],{"class":554}," List",[533,1098,551],{"class":550},[533,1100,960],{"class":554},[533,1102,1103],{"class":550},">)",[533,1105,498],{"class":566},[533,1107,1108],{"class":546},"map",[533,1110,1111],{"class":550},"((p) ",[533,1113,597],{"class":566},[533,1115,1116],{"class":550}," p",[533,1118,498],{"class":566},[533,1120,810],{"class":546},[533,1122,1123],{"class":550},"())",[533,1125,498],{"class":566},[533,1127,1128],{"class":546},"toList",[533,1130,914],{"class":550},[533,1132,583],{"class":566},[533,1134,1135,1137],{"class":535,"line":786},[533,1136,921],{"class":550},[533,1138,583],{"class":566},[533,1140,1141,1143],{"class":535,"line":794},[533,1142,616],{"class":550},[533,1144,619],{"class":566},[357,1146],{},[360,1148,1150,1151,1153],{"id":1149},"the-tojson-option","The ",[352,1152,810],{}," option",[348,1155,1156,1158],{},[352,1157,401],{}," accepts any function with the signature:",[523,1160,1162],{"className":525,"code":1161,"language":528,"meta":529,"style":529},"Object? Function(Object? data)\n",[352,1163,1164],{"__ignoreMap":529},[533,1165,1166,1169,1172,1175,1177,1179,1181],{"class":535,"line":536},[533,1167,1168],{"class":554},"Object",[533,1170,1171],{"class":566},"?",[533,1173,1174],{"class":554}," Function",[533,1176,720],{"class":550},[533,1178,1168],{"class":554},[533,1180,1171],{"class":566},[533,1182,1183],{"class":550}," data)\n",[348,1185,1186,1187,416,1189,416,1191,416,1193,416,1195,423,1197,1199],{},"The return value must be JSON-safe: ",[352,1188,637],{},[352,1190,439],{},[352,1192,415],{},[352,1194,419],{},[352,1196,422],{},[352,1198,426],{},". Returning any other type will cause a runtime error when the DevTools renderer encodes the value.",[523,1201,1203],{"className":525,"code":1202,"filename":527,"language":528,"meta":529,"style":529},"// The cast is safe: T is User and data is the fetcher result.\noptions: QoraOptions(\n  toJson: (data) => (data as User).toJson(),\n),\n",[352,1204,1205,1210,1221,1248],{"__ignoreMap":529},[533,1206,1207],{"class":535,"line":536},[533,1208,1209],{"class":539},"// The cast is safe: T is User and data is the fetcher result.\n",[533,1211,1212,1215,1217,1219],{"class":535,"line":543},[533,1213,1214],{"class":550},"options",[533,1216,567],{"class":566},[533,1218,882],{"class":554},[533,1220,885],{"class":550},[533,1222,1223,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246],{"class":535,"line":560},[533,1224,1225],{"class":550},"  toJson",[533,1227,567],{"class":566},[533,1229,895],{"class":550},[533,1231,597],{"class":566},[533,1233,900],{"class":550},[533,1235,767],{"class":566},[533,1237,905],{"class":554},[533,1239,616],{"class":550},[533,1241,498],{"class":566},[533,1243,810],{"class":546},[533,1245,914],{"class":550},[533,1247,583],{"class":566},[533,1249,1250,1252],{"class":535,"line":586},[533,1251,616],{"class":550},[533,1253,583],{"class":566},[348,1255,1256,1258,1259,1261,1262,1265],{},[352,1257,810],{}," follows the same merge semantics as all other ",[352,1260,215],{}," fields. A value on ",[352,1263,1264],{},"QoraClientConfig.defaultOptions"," applies globally and can be overridden per query.",[357,1267],{},[360,1269,1271],{"id":1270},"when-to-use-each-approach","When to use each approach",[370,1273,1274,1284],{},[373,1275,1276],{},[376,1277,1278,1281],{},[379,1279,1280],{},"Situation",[379,1282,1283],{},"Recommendation",[389,1285,1286,1299,1314,1323,1336],{},[376,1287,1288,1296],{},[394,1289,1290,1292,1293,1295],{},[352,1291,511],{}," or ",[352,1294,515],{}," models",[394,1297,1298],{},"No configuration required. Auto-detected.",[376,1300,1301,1311],{},[394,1302,628,1303,1292,1305,1307,1308],{},[352,1304,452],{},[352,1306,439],{}," from ",[352,1309,1310],{},"jsonDecode",[394,1312,1313],{},"No configuration required. Passed through.",[376,1315,1316,1321],{},[394,1317,1318,1319,467],{},"Manual model with a ",[352,1320,466],{},[394,1322,1298],{},[376,1324,1325,1330],{},[394,1326,1327,1328],{},"Model without ",[352,1329,466],{},[394,1331,1332,1333,498],{},"Provide ",[352,1334,1335],{},"QoraOptions(toJson: ...)",[376,1337,1338,1344],{},[394,1339,1340,1341,1343],{},"Custom serialization with a non-standard ",[352,1342,810],{}," signature",[394,1345,1332,1346,498],{},[352,1347,1335],{},[357,1349],{},[360,1351,1353],{"id":1352},"production-overhead","Production overhead",[348,1355,1356,1357,1360,1361,1364,1365,1368,1369,1371,1372,1375,1376,1379],{},"The serialization path (",[352,1358,1359],{},"_serializeForTracker",") is only executed when ",[352,1362,1363],{},"QoraTracker.needsSerialization"," returns ",[352,1366,1367],{},"true",". In production, ",[352,1370,202],{}," defaults to ",[352,1373,1374],{},"NoOpTracker",", which returns ",[352,1377,1378],{},"false",". No serialization runs and no overhead is introduced.",[523,1381,1384],{"className":525,"code":1382,"filename":1383,"language":528,"meta":529,"style":529},"final client = QoraClient(\n  tracker: kDebugMode ? tracker : null, // null activates NoOpTracker\n);\n","main.dart",[352,1385,1386,1401,1424],{"__ignoreMap":529},[533,1387,1388,1391,1394,1396,1399],{"class":535,"line":536},[533,1389,1390],{"class":699},"final",[533,1392,1393],{"class":550}," client ",[533,1395,706],{"class":566},[533,1397,1398],{"class":554}," QoraClient",[533,1400,885],{"class":550},[533,1402,1403,1406,1408,1411,1413,1416,1418,1421],{"class":535,"line":543},[533,1404,1405],{"class":550},"  tracker",[533,1407,567],{"class":566},[533,1409,1410],{"class":550}," kDebugMode ",[533,1412,1171],{"class":566},[533,1414,1415],{"class":550}," tracker ",[533,1417,567],{"class":566},[533,1419,1420],{"class":566}," null,",[533,1422,1423],{"class":539}," // null activates NoOpTracker\n",[533,1425,1426,1428],{"class":535,"line":560},[533,1427,616],{"class":550},[533,1429,619],{"class":566},[1431,1432,1433],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":529,"searchDepth":543,"depth":543,"links":1435},[1436,1437,1446,1448,1449],{"id":362,"depth":543,"text":363},{"id":503,"depth":543,"text":504,"children":1438},[1439,1441,1443,1445],{"id":508,"depth":560,"text":1440},"json_serializable and freezed",{"id":627,"depth":560,"text":1442},"Raw Map responses",{"id":806,"depth":560,"text":1444},"Manual models without toJson",{"id":934,"depth":560,"text":935},{"id":1149,"depth":543,"text":1447},"The toJson option",{"id":1270,"depth":543,"text":1271},{"id":1352,"depth":543,"text":1353},"How cached query data is turned into the JSON tree shown in the overlay, and how to make custom model types readable.","md",null,{},{"icon":256},{"title":253,"description":1450},"GimTcJLvctLsLf0NGqzzg10n6TRe_joUPJtosfrn0is",[1458,1460],{"title":248,"path":249,"stem":250,"description":1459,"icon":251,"children":-1},"A floating debug panel rendered inside the Flutter app. Inspect queries, mutations, and optimistic updates without an external tool.",{"title":264,"path":265,"stem":266,"description":1461,"icon":267,"children":-1},"Add Qora to an existing Provider app to specialize server-state handling while preserving Provider for UI state and dependency injection.",1794040401255]