[{"data":1,"prerenderedAt":3235},["ShallowReactive",2],{"navigation_docs_en":3,"-en-flutter-integration-qora-builder":342,"-en-flutter-integration-qora-builder-surround":3230},[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":108,"body":344,"description":3223,"extension":3224,"links":3225,"meta":3226,"navigation":3227,"path":109,"seo":3228,"stem":110,"__hash__":3229},"docs_en/en/03.flutter-integration/3.qora-builder.md",{"type":345,"value":346,"toc":3196},"minimark",[347,355,358,363,704,707,746,755,757,761,766,796,818,820,824,1025,1027,1031,1036,1047,1345,1347,1353,1361,1674,1720,1737,1739,1745,1748,1857,1871,1873,1879,1887,2033,2064,2066,2072,2082,2282,2291,2293,2297,2306,2429,2431,2435,2444,2550,2556,2558,2565,2571,2728,2791,2796,2824,2836,2838,2842,2853,2875,2878,2880,2887,2893,3067,3073,3132,3137,3139,3143,3192],[348,349,350,354],"p",{},[351,352,353],"code",{},"QoraBuilder\u003CT>"," is the primary way to bind server data to Flutter UI. It handles the full query lifecycle: fetching, caching, reactivity, background revalidation: with a single widget declaration.",[356,357],"hr",{},[359,360,362],"h2",{"id":361},"basic-usage","Basic Usage",[364,365,371],"pre",{"className":366,"code":367,"filename":368,"language":369,"meta":370,"style":370},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraBuilder\u003CList\u003CUser>>(\n  queryKey: ['users'],\n  fetcher: () => api.getUsers(),\n  builder: (context, state, fetchStatus) {\n    return switch (state) {\n      Initial() => const SizedBox.shrink(),\n      Loading(:final previousData) => previousData != null\n          ? Stack(children: [UserList(previousData), const LinearProgressIndicator()])\n          : const CircularProgressIndicator(),\n      Success(:final data) => UserList(data),\n      Failure(:final error, :final previousData) => previousData != null\n          ? Column(children: [UserList(previousData), ErrorBanner(error)])\n          : ErrorScreen(error),\n    };\n  },\n)\n","user_list_screen.dart","dart","",[351,372,373,396,419,448,470,483,510,538,570,585,610,642,668,681,690,698],{"__ignoreMap":370},[374,375,378,381,385,388,390,393],"span",{"class":376,"line":377},"line",1,[374,379,108],{"class":380},"sBMFI",[374,382,384],{"class":383},"sTEyZ","\u003C",[374,386,387],{"class":380},"List",[374,389,384],{"class":383},[374,391,392],{"class":380},"User",[374,394,395],{"class":383},">>(\n",[374,397,399,402,406,409,413,416],{"class":376,"line":398},2,[374,400,401],{"class":383},"  queryKey",[374,403,405],{"class":404},"sMK4o",":",[374,407,408],{"class":383}," [",[374,410,412],{"class":411},"sfazB","'users'",[374,414,415],{"class":383},"]",[374,417,418],{"class":404},",\n",[374,420,422,425,427,430,433,436,439,443,446],{"class":376,"line":421},3,[374,423,424],{"class":383},"  fetcher",[374,426,405],{"class":404},[374,428,429],{"class":383}," () ",[374,431,432],{"class":404},"=>",[374,434,435],{"class":383}," api",[374,437,438],{"class":404},".",[374,440,442],{"class":441},"s2Zo4","getUsers",[374,444,445],{"class":383},"()",[374,447,418],{"class":404},[374,449,451,454,456,459,462,465,467],{"class":376,"line":450},4,[374,452,453],{"class":383},"  builder",[374,455,405],{"class":404},[374,457,458],{"class":383}," (context",[374,460,461],{"class":404},",",[374,463,464],{"class":383}," state",[374,466,461],{"class":404},[374,468,469],{"class":383}," fetchStatus) {\n",[374,471,473,477,480],{"class":376,"line":472},5,[374,474,476],{"class":475},"s7zQu","    return",[374,478,479],{"class":475}," switch",[374,481,482],{"class":383}," (state) {\n",[374,484,486,489,492,494,498,501,503,506,508],{"class":376,"line":485},6,[374,487,488],{"class":380},"      Initial",[374,490,491],{"class":383},"() ",[374,493,432],{"class":404},[374,495,497],{"class":496},"spNyl"," const",[374,499,500],{"class":380}," SizedBox",[374,502,438],{"class":404},[374,504,505],{"class":441},"shrink",[374,507,445],{"class":383},[374,509,418],{"class":404},[374,511,513,516,519,521,524,527,529,532,535],{"class":376,"line":512},7,[374,514,515],{"class":380},"      Loading",[374,517,518],{"class":383},"(",[374,520,405],{"class":404},[374,522,523],{"class":496},"final",[374,525,526],{"class":383}," previousData) ",[374,528,432],{"class":404},[374,530,531],{"class":383}," previousData ",[374,533,534],{"class":404},"!=",[374,536,537],{"class":404}," null\n",[374,539,541,544,547,550,552,554,557,560,562,564,567],{"class":376,"line":540},8,[374,542,543],{"class":404},"          ?",[374,545,546],{"class":380}," Stack",[374,548,549],{"class":383},"(children",[374,551,405],{"class":404},[374,553,408],{"class":383},[374,555,556],{"class":380},"UserList",[374,558,559],{"class":383},"(previousData)",[374,561,461],{"class":404},[374,563,497],{"class":496},[374,565,566],{"class":380}," LinearProgressIndicator",[374,568,569],{"class":383},"()])\n",[374,571,573,576,578,581,583],{"class":376,"line":572},9,[374,574,575],{"class":404},"          :",[374,577,497],{"class":496},[374,579,580],{"class":380}," CircularProgressIndicator",[374,582,445],{"class":383},[374,584,418],{"class":404},[374,586,588,591,593,595,597,600,602,605,608],{"class":376,"line":587},10,[374,589,590],{"class":380},"      Success",[374,592,518],{"class":383},[374,594,405],{"class":404},[374,596,523],{"class":496},[374,598,599],{"class":383}," data) ",[374,601,432],{"class":404},[374,603,604],{"class":380}," UserList",[374,606,607],{"class":383},"(data)",[374,609,418],{"class":404},[374,611,613,616,618,620,622,625,627,630,632,634,636,638,640],{"class":376,"line":612},11,[374,614,615],{"class":380},"      Failure",[374,617,518],{"class":383},[374,619,405],{"class":404},[374,621,523],{"class":496},[374,623,624],{"class":383}," error",[374,626,461],{"class":404},[374,628,629],{"class":404}," :",[374,631,523],{"class":496},[374,633,526],{"class":383},[374,635,432],{"class":404},[374,637,531],{"class":383},[374,639,534],{"class":404},[374,641,537],{"class":404},[374,643,645,647,650,652,654,656,658,660,662,665],{"class":376,"line":644},12,[374,646,543],{"class":404},[374,648,649],{"class":380}," Column",[374,651,549],{"class":383},[374,653,405],{"class":404},[374,655,408],{"class":383},[374,657,556],{"class":380},[374,659,559],{"class":383},[374,661,461],{"class":404},[374,663,664],{"class":380}," ErrorBanner",[374,666,667],{"class":383},"(error)])\n",[374,669,671,673,676,679],{"class":376,"line":670},13,[374,672,575],{"class":404},[374,674,675],{"class":380}," ErrorScreen",[374,677,678],{"class":383},"(error)",[374,680,418],{"class":404},[374,682,684,687],{"class":376,"line":683},14,[374,685,686],{"class":383},"    }",[374,688,689],{"class":404},";\n",[374,691,693,696],{"class":376,"line":692},15,[374,694,695],{"class":383},"  }",[374,697,418],{"class":404},[374,699,701],{"class":376,"line":700},16,[374,702,703],{"class":383},")\n",[348,705,706],{},"The builder receives three arguments:",[708,709,710,723,735],"ol",{},[711,712,713,719,720],"li",{},[714,715,716],"strong",{},[351,717,718],{},"context",": the ",[351,721,722],{},"BuildContext",[711,724,725,730,731,734],{},[714,726,727],{},[351,728,729],{},"state",": the current ",[351,732,733],{},"QoraState\u003CT>"," (what you have)",[711,736,737,730,742,745],{},[714,738,739],{},[351,740,741],{},"fetchStatus",[351,743,744],{},"FetchStatus"," (what Qora is doing right now)",[348,747,748,749,751,752,754],{},"Exhaustive pattern-matching over the sealed ",[351,750,729],{}," is the idiomatic approach. Use ",[351,753,741],{}," for secondary indicators (progress bars, offline chips) without changing the primary state view.",[356,756],{},[359,758,760],{"id":759},"how-it-works","How It Works",[348,762,763,764,405],{},"On mount, ",[351,765,108],{},[708,767,768,778],{},[711,769,770,773,774,777],{},[714,771,772],{},"Subscribes"," to ",[351,775,776],{},"client.watchState\u003CT>(queryKey)",": an observe-only stream that emits every state update for this key (including updates triggered by other widgets or background services).",[711,779,780,783,784,787,788,791,792,795],{},[714,781,782],{},"Fetches"," via ",[351,785,786],{},"client.fetchQuery(...)"," if ",[351,789,790],{},"enabled"," is ",[351,793,794],{},"true",". The client handles deduplication, caching, and stale-while-revalidate automatically.",[348,797,798,799,802,803,806,807,810,811,813,814,817],{},"When the query is ",[714,800,801],{},"externally invalidated"," (via ",[351,804,805],{},"client.invalidate()",", a lifecycle resume, or a reconnect event), the state transitions to ",[351,808,809],{},"Loading(previousData: data)",". ",[351,812,108],{}," detects this pattern in the stream and dispatches a fresh ",[351,815,816],{},"fetchQuery",". The client's deduplication ensures only one network request fires even if multiple widgets are subscribed to the same key.",[356,819],{},[359,821,823],{"id":822},"props","Props",[825,826,827,846],"table",{},[828,829,830],"thead",{},[831,832,833,837,840,843],"tr",{},[834,835,836],"th",{},"Prop",[834,838,839],{},"Type",[834,841,842],{},"Default",[834,844,845],{},"Description",[847,848,849,875,892,909,932,954,984,1003],"tbody",{},[831,850,851,857,869,872],{},[852,853,854],"td",{},[351,855,856],{},"queryKey",[852,858,859,862,863,865,866,868],{},[351,860,861],{},"Object"," (",[351,864,387],{}," or ",[351,867,207],{},")",[852,870,871],{},"required",[852,873,874],{},"Cache key. Changing it triggers re-subscription and a fresh fetch.",[831,876,877,882,887,889],{},[852,878,879],{},[351,880,881],{},"fetcher",[852,883,884],{},[351,885,886],{},"Future\u003CT> Function()",[852,888,871],{},[852,890,891],{},"Async function that returns the data. Must throw on failure.",[831,893,894,899,904,906],{},[852,895,896],{},[351,897,898],{},"builder",[852,900,901],{},[351,902,903],{},"Widget Function(BuildContext, QoraState\u003CT>, FetchStatus)",[852,905,871],{},[852,907,908],{},"Builds the widget tree from the current state and fetch status.",[831,910,911,916,921,926],{},[852,912,913],{},[351,914,915],{},"options",[852,917,918],{},[351,919,920],{},"QoraOptions?",[852,922,923],{},[351,924,925],{},"null",[852,927,928,929,438],{},"Per-query config merged on top of ",[351,930,931],{},"QoraClientConfig.defaultOptions",[831,933,934,938,943,947],{},[852,935,936],{},[351,937,790],{},[852,939,940],{},[351,941,942],{},"bool",[852,944,945],{},[351,946,794],{},[852,948,949,950,953],{},"When ",[351,951,952],{},"false",", no fetch is triggered. The widget still observes the current cached state.",[831,955,956,961,965,969],{},[852,957,958],{},[351,959,960],{},"keepPreviousData",[852,962,963],{},[351,964,942],{},[852,966,967],{},[351,968,952],{},[852,970,971,972,975,976,979,980,983],{},"Augments ",[351,973,974],{},"Loading","/",[351,977,978],{},"Failure"," states with the last known ",[351,981,982],{},"Success"," data from this widget.",[831,985,986,991,996,1000],{},[852,987,988],{},[351,989,990],{},"select",[852,992,993],{},[351,994,995],{},"Object? Function(T data)?",[852,997,998],{},[351,999,925],{},[852,1001,1002],{},"Rebuild filter: the widget rebuilds only when the state kind or this value changes. The builder still receives the full state.",[831,1004,1005,1010,1015,1019],{},[852,1006,1007],{},[351,1008,1009],{},"client",[852,1011,1012],{},[351,1013,1014],{},"QoraClient?",[852,1016,1017],{},[351,1018,925],{},[852,1020,1021,1022,1024],{},"Override the client from ",[351,1023,103],{},". Useful for testing or nested scopes.",[356,1026],{},[359,1028,1030],{"id":1029},"patterns","Patterns",[1032,1033,1035],"h3",{"id":1034},"handling-all-four-states","Handling all four states",[348,1037,1038,1039,1042,1043,1046],{},"Use ",[351,1040,1041],{},".when()"," for exhaustive matching or ",[351,1044,1045],{},".maybeWhen()"," when you only care about specific states:",[364,1048,1051],{"className":366,"code":1049,"filename":1050,"language":369,"meta":370,"style":370},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  builder: (context, state, fetchStatus) {\n    return state.when(\n      onInitial: () => const SizedBox.shrink(),\n      onLoading: (previousData) => previousData != null\n          ? UserCard(user: previousData, isRefreshing: true)\n          : const CircularProgressIndicator(),\n      onSuccess: (user, updatedAt) => UserCard(user: user),\n      onError: (error, stackTrace, previousData) => ErrorScreen(\n        message: error.toString(),\n        onRetry: () => context.qora.invalidate(['users', userId]),\n      ),\n    );\n  },\n)\n","user_screen.dart",[351,1052,1053,1064,1081,1103,1119,1133,1156,1174,1201,1213,1241,1266,1284,1320,1327,1334,1340],{"__ignoreMap":370},[374,1054,1055,1057,1059,1061],{"class":376,"line":377},[374,1056,108],{"class":380},[374,1058,384],{"class":383},[374,1060,392],{"class":380},[374,1062,1063],{"class":383},">(\n",[374,1065,1066,1068,1070,1072,1074,1076,1079],{"class":376,"line":398},[374,1067,401],{"class":383},[374,1069,405],{"class":404},[374,1071,408],{"class":383},[374,1073,412],{"class":411},[374,1075,461],{"class":404},[374,1077,1078],{"class":383}," userId]",[374,1080,418],{"class":404},[374,1082,1083,1085,1087,1089,1091,1093,1095,1098,1101],{"class":376,"line":421},[374,1084,424],{"class":383},[374,1086,405],{"class":404},[374,1088,429],{"class":383},[374,1090,432],{"class":404},[374,1092,435],{"class":383},[374,1094,438],{"class":404},[374,1096,1097],{"class":441},"getUser",[374,1099,1100],{"class":383},"(userId)",[374,1102,418],{"class":404},[374,1104,1105,1107,1109,1111,1113,1115,1117],{"class":376,"line":450},[374,1106,453],{"class":383},[374,1108,405],{"class":404},[374,1110,458],{"class":383},[374,1112,461],{"class":404},[374,1114,464],{"class":383},[374,1116,461],{"class":404},[374,1118,469],{"class":383},[374,1120,1121,1123,1125,1127,1130],{"class":376,"line":472},[374,1122,476],{"class":475},[374,1124,464],{"class":383},[374,1126,438],{"class":404},[374,1128,1129],{"class":475},"when",[374,1131,1132],{"class":383},"(\n",[374,1134,1135,1138,1140,1142,1144,1146,1148,1150,1152,1154],{"class":376,"line":485},[374,1136,1137],{"class":383},"      onInitial",[374,1139,405],{"class":404},[374,1141,429],{"class":383},[374,1143,432],{"class":404},[374,1145,497],{"class":496},[374,1147,500],{"class":380},[374,1149,438],{"class":404},[374,1151,505],{"class":441},[374,1153,445],{"class":383},[374,1155,418],{"class":404},[374,1157,1158,1161,1163,1166,1168,1170,1172],{"class":376,"line":512},[374,1159,1160],{"class":383},"      onLoading",[374,1162,405],{"class":404},[374,1164,1165],{"class":383}," (previousData) ",[374,1167,432],{"class":404},[374,1169,531],{"class":383},[374,1171,534],{"class":404},[374,1173,537],{"class":404},[374,1175,1176,1178,1181,1184,1186,1189,1191,1194,1196,1199],{"class":376,"line":540},[374,1177,543],{"class":404},[374,1179,1180],{"class":380}," UserCard",[374,1182,1183],{"class":383},"(user",[374,1185,405],{"class":404},[374,1187,1188],{"class":383}," previousData",[374,1190,461],{"class":404},[374,1192,1193],{"class":383}," isRefreshing",[374,1195,405],{"class":404},[374,1197,1198],{"class":404}," true",[374,1200,703],{"class":383},[374,1202,1203,1205,1207,1209,1211],{"class":376,"line":572},[374,1204,575],{"class":404},[374,1206,497],{"class":496},[374,1208,580],{"class":380},[374,1210,445],{"class":383},[374,1212,418],{"class":404},[374,1214,1215,1218,1220,1223,1225,1228,1230,1232,1234,1236,1239],{"class":376,"line":587},[374,1216,1217],{"class":383},"      onSuccess",[374,1219,405],{"class":404},[374,1221,1222],{"class":383}," (user",[374,1224,461],{"class":404},[374,1226,1227],{"class":383}," updatedAt) ",[374,1229,432],{"class":404},[374,1231,1180],{"class":380},[374,1233,1183],{"class":383},[374,1235,405],{"class":404},[374,1237,1238],{"class":383}," user)",[374,1240,418],{"class":404},[374,1242,1243,1246,1248,1251,1253,1256,1258,1260,1262,1264],{"class":376,"line":612},[374,1244,1245],{"class":383},"      onError",[374,1247,405],{"class":404},[374,1249,1250],{"class":383}," (error",[374,1252,461],{"class":404},[374,1254,1255],{"class":383}," stackTrace",[374,1257,461],{"class":404},[374,1259,526],{"class":383},[374,1261,432],{"class":404},[374,1263,675],{"class":380},[374,1265,1132],{"class":383},[374,1267,1268,1271,1273,1275,1277,1280,1282],{"class":376,"line":644},[374,1269,1270],{"class":383},"        message",[374,1272,405],{"class":404},[374,1274,624],{"class":383},[374,1276,438],{"class":404},[374,1278,1279],{"class":441},"toString",[374,1281,445],{"class":383},[374,1283,418],{"class":404},[374,1285,1286,1289,1291,1293,1295,1298,1300,1303,1305,1308,1311,1313,1315,1318],{"class":376,"line":670},[374,1287,1288],{"class":383},"        onRetry",[374,1290,405],{"class":404},[374,1292,429],{"class":383},[374,1294,432],{"class":404},[374,1296,1297],{"class":383}," context",[374,1299,438],{"class":404},[374,1301,1302],{"class":383},"qora",[374,1304,438],{"class":404},[374,1306,1307],{"class":441},"invalidate",[374,1309,1310],{"class":383},"([",[374,1312,412],{"class":411},[374,1314,461],{"class":404},[374,1316,1317],{"class":383}," userId])",[374,1319,418],{"class":404},[374,1321,1322,1325],{"class":376,"line":683},[374,1323,1324],{"class":383},"      )",[374,1326,418],{"class":404},[374,1328,1329,1332],{"class":376,"line":692},[374,1330,1331],{"class":383},"    )",[374,1333,689],{"class":404},[374,1335,1336,1338],{"class":376,"line":700},[374,1337,695],{"class":383},[374,1339,418],{"class":404},[374,1341,1343],{"class":376,"line":1342},17,[374,1344,703],{"class":383},[356,1346],{},[1032,1348,1350,1351],{"id":1349},"offline-aware-ui-with-fetchstatus","Offline-aware UI with ",[351,1352,744],{},[348,1354,1355,1357,1358,1360],{},[351,1356,744],{}," is the second axis alongside ",[351,1359,211],{},". Use it to show a background-refresh indicator or an \"offline: waiting\" message without changing the primary state view:",[364,1362,1364],{"className":366,"code":1363,"filename":368,"language":369,"meta":370,"style":370},"QoraBuilder\u003CList\u003CUser>>(\n  queryKey: ['users'],\n  fetcher: api.getUsers,\n  builder: (context, state, fetchStatus) {\n    return switch (state) {\n      Initial() || Loading(previousData: null)\n          when fetchStatus == FetchStatus.paused =>\n          const Center(child: Text('Offline: connect to load')),\n      Initial() || Loading() =>\n          const CircularProgressIndicator(),\n      Success(:final data) => Column(\n          children: [\n            if (fetchStatus == FetchStatus.fetching)\n              const LinearProgressIndicator(),\n            if (fetchStatus == FetchStatus.paused)\n              const OfflineSyncChip(),\n            UserList(data),\n          ],\n        ),\n      Failure(:final error) => ErrorScreen(error),\n    };\n  },\n)\n",[351,1365,1366,1380,1394,1408,1424,1432,1454,1476,1502,1516,1526,1544,1554,1571,1582,1597,1608,1617,1625,1633,1655,1662,1669],{"__ignoreMap":370},[374,1367,1368,1370,1372,1374,1376,1378],{"class":376,"line":377},[374,1369,108],{"class":380},[374,1371,384],{"class":383},[374,1373,387],{"class":380},[374,1375,384],{"class":383},[374,1377,392],{"class":380},[374,1379,395],{"class":383},[374,1381,1382,1384,1386,1388,1390,1392],{"class":376,"line":398},[374,1383,401],{"class":383},[374,1385,405],{"class":404},[374,1387,408],{"class":383},[374,1389,412],{"class":411},[374,1391,415],{"class":383},[374,1393,418],{"class":404},[374,1395,1396,1398,1400,1402,1404,1406],{"class":376,"line":421},[374,1397,424],{"class":383},[374,1399,405],{"class":404},[374,1401,435],{"class":383},[374,1403,438],{"class":404},[374,1405,442],{"class":383},[374,1407,418],{"class":404},[374,1409,1410,1412,1414,1416,1418,1420,1422],{"class":376,"line":450},[374,1411,453],{"class":383},[374,1413,405],{"class":404},[374,1415,458],{"class":383},[374,1417,461],{"class":404},[374,1419,464],{"class":383},[374,1421,461],{"class":404},[374,1423,469],{"class":383},[374,1425,1426,1428,1430],{"class":376,"line":472},[374,1427,476],{"class":475},[374,1429,479],{"class":475},[374,1431,482],{"class":383},[374,1433,1434,1436,1438,1441,1444,1447,1449,1452],{"class":376,"line":485},[374,1435,488],{"class":380},[374,1437,491],{"class":383},[374,1439,1440],{"class":404},"||",[374,1442,1443],{"class":380}," Loading",[374,1445,1446],{"class":383},"(previousData",[374,1448,405],{"class":404},[374,1450,1451],{"class":404}," null",[374,1453,703],{"class":383},[374,1455,1456,1459,1462,1465,1468,1470,1473],{"class":376,"line":512},[374,1457,1458],{"class":475},"          when",[374,1460,1461],{"class":383}," fetchStatus ",[374,1463,1464],{"class":404},"==",[374,1466,1467],{"class":380}," FetchStatus",[374,1469,438],{"class":404},[374,1471,1472],{"class":383},"paused ",[374,1474,1475],{"class":404},"=>\n",[374,1477,1478,1481,1484,1487,1489,1492,1494,1497,1500],{"class":376,"line":540},[374,1479,1480],{"class":496},"          const",[374,1482,1483],{"class":380}," Center",[374,1485,1486],{"class":383},"(child",[374,1488,405],{"class":404},[374,1490,1491],{"class":380}," Text",[374,1493,518],{"class":383},[374,1495,1496],{"class":411},"'Offline: connect to load'",[374,1498,1499],{"class":383},"))",[374,1501,418],{"class":404},[374,1503,1504,1506,1508,1510,1512,1514],{"class":376,"line":572},[374,1505,488],{"class":380},[374,1507,491],{"class":383},[374,1509,1440],{"class":404},[374,1511,1443],{"class":380},[374,1513,491],{"class":383},[374,1515,1475],{"class":404},[374,1517,1518,1520,1522,1524],{"class":376,"line":587},[374,1519,1480],{"class":496},[374,1521,580],{"class":380},[374,1523,445],{"class":383},[374,1525,418],{"class":404},[374,1527,1528,1530,1532,1534,1536,1538,1540,1542],{"class":376,"line":612},[374,1529,590],{"class":380},[374,1531,518],{"class":383},[374,1533,405],{"class":404},[374,1535,523],{"class":496},[374,1537,599],{"class":383},[374,1539,432],{"class":404},[374,1541,649],{"class":380},[374,1543,1132],{"class":383},[374,1545,1546,1549,1551],{"class":376,"line":644},[374,1547,1548],{"class":383},"          children",[374,1550,405],{"class":404},[374,1552,1553],{"class":383}," [\n",[374,1555,1556,1559,1562,1564,1566,1568],{"class":376,"line":670},[374,1557,1558],{"class":475},"            if",[374,1560,1561],{"class":383}," (fetchStatus ",[374,1563,1464],{"class":404},[374,1565,1467],{"class":380},[374,1567,438],{"class":404},[374,1569,1570],{"class":383},"fetching)\n",[374,1572,1573,1576,1578,1580],{"class":376,"line":683},[374,1574,1575],{"class":496},"              const",[374,1577,566],{"class":380},[374,1579,445],{"class":383},[374,1581,418],{"class":404},[374,1583,1584,1586,1588,1590,1592,1594],{"class":376,"line":692},[374,1585,1558],{"class":475},[374,1587,1561],{"class":383},[374,1589,1464],{"class":404},[374,1591,1467],{"class":380},[374,1593,438],{"class":404},[374,1595,1596],{"class":383},"paused)\n",[374,1598,1599,1601,1604,1606],{"class":376,"line":700},[374,1600,1575],{"class":496},[374,1602,1603],{"class":380}," OfflineSyncChip",[374,1605,445],{"class":383},[374,1607,418],{"class":404},[374,1609,1610,1613,1615],{"class":376,"line":1342},[374,1611,1612],{"class":380},"            UserList",[374,1614,607],{"class":383},[374,1616,418],{"class":404},[374,1618,1620,1623],{"class":376,"line":1619},18,[374,1621,1622],{"class":383},"          ]",[374,1624,418],{"class":404},[374,1626,1628,1631],{"class":376,"line":1627},19,[374,1629,1630],{"class":383},"        )",[374,1632,418],{"class":404},[374,1634,1636,1638,1640,1642,1644,1647,1649,1651,1653],{"class":376,"line":1635},20,[374,1637,615],{"class":380},[374,1639,518],{"class":383},[374,1641,405],{"class":404},[374,1643,523],{"class":496},[374,1645,1646],{"class":383}," error) ",[374,1648,432],{"class":404},[374,1650,675],{"class":380},[374,1652,678],{"class":383},[374,1654,418],{"class":404},[374,1656,1658,1660],{"class":376,"line":1657},21,[374,1659,686],{"class":383},[374,1661,689],{"class":404},[374,1663,1665,1667],{"class":376,"line":1664},22,[374,1666,695],{"class":383},[374,1668,418],{"class":404},[374,1670,1672],{"class":376,"line":1671},23,[374,1673,703],{"class":383},[825,1675,1676,1688],{},[828,1677,1678],{},[831,1679,1680,1685],{},[834,1681,1682,1684],{},[351,1683,744],{}," value",[834,1686,1687],{},"Meaning",[847,1689,1690,1700,1710],{},[831,1691,1692,1697],{},[852,1693,1694],{},[351,1695,1696],{},"FetchStatus.fetching",[852,1698,1699],{},"A network request is in-flight.",[831,1701,1702,1707],{},[852,1703,1704],{},[351,1705,1706],{},"FetchStatus.paused",[852,1708,1709],{},"Offline: fetch is queued and will replay on reconnect.",[831,1711,1712,1717],{},[852,1713,1714],{},[351,1715,1716],{},"FetchStatus.idle",[852,1718,1719],{},"No active fetch (data is fresh or the state is terminal).",[1721,1722,1723,1725,1726,791,1729,1732,1733,1736],"tip",{},[351,1724,1706],{}," only appears when ",[351,1727,1728],{},"QoraOptions.networkMode",[351,1730,1731],{},"NetworkMode.online"," (the default) and the device has no connectivity. If you use ",[351,1734,1735],{},"NetworkMode.always",", fetches run regardless of connectivity and this state is never emitted.",[356,1738],{},[1032,1740,1742,1743,868],{"id":1741},"conditional-queries-enabled","Conditional queries (",[351,1744,790],{},[348,1746,1747],{},"Prevent fetching until a dependency is available:",[364,1749,1752],{"className":366,"code":1750,"filename":1751,"language":369,"meta":370,"style":370},"QoraBuilder\u003CProfile>(\n  queryKey: ['profiles', userId],\n  fetcher: () => api.getProfile(userId!),\n  enabled: userId != null,   // No fetch until userId is resolved\n  builder: (context, state, fetchStatus) { ... },\n)\n","profile_screen.dart",[351,1753,1754,1765,1782,1809,1828,1853],{"__ignoreMap":370},[374,1755,1756,1758,1760,1763],{"class":376,"line":377},[374,1757,108],{"class":380},[374,1759,384],{"class":383},[374,1761,1762],{"class":380},"Profile",[374,1764,1063],{"class":383},[374,1766,1767,1769,1771,1773,1776,1778,1780],{"class":376,"line":398},[374,1768,401],{"class":383},[374,1770,405],{"class":404},[374,1772,408],{"class":383},[374,1774,1775],{"class":411},"'profiles'",[374,1777,461],{"class":404},[374,1779,1078],{"class":383},[374,1781,418],{"class":404},[374,1783,1784,1786,1788,1790,1792,1794,1796,1799,1802,1805,1807],{"class":376,"line":421},[374,1785,424],{"class":383},[374,1787,405],{"class":404},[374,1789,429],{"class":383},[374,1791,432],{"class":404},[374,1793,435],{"class":383},[374,1795,438],{"class":404},[374,1797,1798],{"class":441},"getProfile",[374,1800,1801],{"class":383},"(userId",[374,1803,1804],{"class":404},"!",[374,1806,868],{"class":383},[374,1808,418],{"class":404},[374,1810,1811,1814,1816,1819,1821,1824],{"class":376,"line":450},[374,1812,1813],{"class":383},"  enabled",[374,1815,405],{"class":404},[374,1817,1818],{"class":383}," userId ",[374,1820,534],{"class":404},[374,1822,1823],{"class":404}," null,",[374,1825,1827],{"class":1826},"sHwdD","   // No fetch until userId is resolved\n",[374,1829,1830,1832,1834,1836,1838,1840,1842,1845,1848,1851],{"class":376,"line":472},[374,1831,453],{"class":383},[374,1833,405],{"class":404},[374,1835,458],{"class":383},[374,1837,461],{"class":404},[374,1839,464],{"class":383},[374,1841,461],{"class":404},[374,1843,1844],{"class":383}," fetchStatus) { ",[374,1846,1847],{"class":404},"...",[374,1849,1850],{"class":383}," }",[374,1852,418],{"class":404},[374,1854,1855],{"class":376,"line":485},[374,1856,703],{"class":383},[348,1858,949,1859,1861,1862,773,1864,1866,1867,1870],{},[351,1860,790],{}," flips from ",[351,1863,952],{},[351,1865,794],{}," (e.g. via ",[351,1868,1869],{},"setState","), a fetch is triggered automatically.",[356,1872],{},[1032,1874,1876,1877],{"id":1875},"performance-derived-subscriptions-with-select","Performance: derived subscriptions with ",[351,1878,990],{},[348,1880,1881,1883,1884,1886],{},[351,1882,990],{}," lets you derive a computed value from the query data. The widget only rebuilds when the selected value changes (compared via ",[351,1885,1464],{},"). Use it to avoid unnecessary rebuilds when only a subset of the data is needed:",[364,1888,1890],{"className":366,"code":1889,"filename":368,"language":369,"meta":370,"style":370},"// Rebuild only when the user count changes.\nQoraBuilder\u003CList\u003CUser>>(\n  queryKey: ['users'],\n  fetcher: () => api.getUsers(),\n  select: (users) => users.length,\n  builder: (context, state, fetchStatus) =>\n      Text('${state.dataOrNull?.length ?? 0} users'),\n)\n",[351,1891,1892,1897,1911,1925,1945,1967,1986,2029],{"__ignoreMap":370},[374,1893,1894],{"class":376,"line":377},[374,1895,1896],{"class":1826},"// Rebuild only when the user count changes.\n",[374,1898,1899,1901,1903,1905,1907,1909],{"class":376,"line":398},[374,1900,108],{"class":380},[374,1902,384],{"class":383},[374,1904,387],{"class":380},[374,1906,384],{"class":383},[374,1908,392],{"class":380},[374,1910,395],{"class":383},[374,1912,1913,1915,1917,1919,1921,1923],{"class":376,"line":421},[374,1914,401],{"class":383},[374,1916,405],{"class":404},[374,1918,408],{"class":383},[374,1920,412],{"class":411},[374,1922,415],{"class":383},[374,1924,418],{"class":404},[374,1926,1927,1929,1931,1933,1935,1937,1939,1941,1943],{"class":376,"line":450},[374,1928,424],{"class":383},[374,1930,405],{"class":404},[374,1932,429],{"class":383},[374,1934,432],{"class":404},[374,1936,435],{"class":383},[374,1938,438],{"class":404},[374,1940,442],{"class":441},[374,1942,445],{"class":383},[374,1944,418],{"class":404},[374,1946,1947,1950,1952,1955,1957,1960,1962,1965],{"class":376,"line":472},[374,1948,1949],{"class":383},"  select",[374,1951,405],{"class":404},[374,1953,1954],{"class":383}," (users) ",[374,1956,432],{"class":404},[374,1958,1959],{"class":383}," users",[374,1961,438],{"class":404},[374,1963,1964],{"class":383},"length",[374,1966,418],{"class":404},[374,1968,1969,1971,1973,1975,1977,1979,1981,1984],{"class":376,"line":485},[374,1970,453],{"class":383},[374,1972,405],{"class":404},[374,1974,458],{"class":383},[374,1976,461],{"class":404},[374,1978,464],{"class":383},[374,1980,461],{"class":404},[374,1982,1983],{"class":383}," fetchStatus) ",[374,1985,1475],{"class":404},[374,1987,1988,1991,1993,1996,1999,2002,2004,2007,2010,2012,2015,2019,2022,2025,2027],{"class":376,"line":512},[374,1989,1990],{"class":380},"      Text",[374,1992,518],{"class":383},[374,1994,1995],{"class":411},"'",[374,1997,1998],{"class":383},"${",[374,2000,729],{"class":2001},"sHdIc",[374,2003,438],{"class":383},[374,2005,2006],{"class":2001},"dataOrNull",[374,2008,2009],{"class":383},"?.",[374,2011,1964],{"class":2001},[374,2013,2014],{"class":383}," ?? ",[374,2016,2018],{"class":2017},"sbssI","0",[374,2020,2021],{"class":383},"}",[374,2023,2024],{"class":411}," users'",[374,2026,868],{"class":383},[374,2028,418],{"class":404},[374,2030,2031],{"class":376,"line":540},[374,2032,703],{"class":383},[348,2034,2035,2036,2038,2039,2041,2042,2045,2046,2049,2050,2052,2053,2052,2055,2057,2058,2060,2061,2063],{},"The builder still receives the full, up-to-date ",[351,2037,733],{},": ",[351,2040,990],{}," decides ",[2043,2044,1129],"em",{}," to rebuild, not ",[2043,2047,2048],{},"what"," is passed. A change of state kind (",[351,2051,974],{},", ",[351,2054,982],{},[351,2056,978],{},") or of ",[351,2059,744],{}," always rebuilds, so errors and spinners are never hidden. Without ",[351,2062,990],{},", the widget rebuilds on every state change.",[356,2065],{},[1032,2067,2069,2070,868],{"id":2068},"flicker-free-pagination-keeppreviousdata","Flicker-free pagination (",[351,2071,960],{},[348,2073,2074,2075,2078,2079,2081],{},"When the query key changes (e.g. page number increments), the new key starts in ",[351,2076,2077],{},"Initial"," state: causing a jarring full-screen spinner. ",[351,2080,960],{}," prevents this by carrying the last successful data forward into the new key's loading phase:",[364,2083,2086],{"className":366,"code":2084,"filename":2085,"language":369,"meta":370,"style":370},"QoraBuilder\u003CList\u003CPost>>(\n  queryKey: ['posts', currentPage],\n  fetcher: () => api.getPosts(page: currentPage),\n  keepPreviousData: true,\n  builder: (context, state, fetchStatus) {\n    // dataOrNull returns data from Success, Loading.previousData, or Failure.previousData\n    final posts = state.dataOrNull ?? [];\n    return Stack(\n      children: [\n        PostList(posts: posts),\n        if (state.isLoading) const LinearProgressIndicator(),\n      ],\n    );\n  },\n)\n","paginated_posts_screen.dart",[351,2087,2088,2103,2121,2148,2158,2174,2179,2205,2213,2222,2237,2259,2266,2272,2278],{"__ignoreMap":370},[374,2089,2090,2092,2094,2096,2098,2101],{"class":376,"line":377},[374,2091,108],{"class":380},[374,2093,384],{"class":383},[374,2095,387],{"class":380},[374,2097,384],{"class":383},[374,2099,2100],{"class":380},"Post",[374,2102,395],{"class":383},[374,2104,2105,2107,2109,2111,2114,2116,2119],{"class":376,"line":398},[374,2106,401],{"class":383},[374,2108,405],{"class":404},[374,2110,408],{"class":383},[374,2112,2113],{"class":411},"'posts'",[374,2115,461],{"class":404},[374,2117,2118],{"class":383}," currentPage]",[374,2120,418],{"class":404},[374,2122,2123,2125,2127,2129,2131,2133,2135,2138,2141,2143,2146],{"class":376,"line":421},[374,2124,424],{"class":383},[374,2126,405],{"class":404},[374,2128,429],{"class":383},[374,2130,432],{"class":404},[374,2132,435],{"class":383},[374,2134,438],{"class":404},[374,2136,2137],{"class":441},"getPosts",[374,2139,2140],{"class":383},"(page",[374,2142,405],{"class":404},[374,2144,2145],{"class":383}," currentPage)",[374,2147,418],{"class":404},[374,2149,2150,2153,2155],{"class":376,"line":450},[374,2151,2152],{"class":383},"  keepPreviousData",[374,2154,405],{"class":404},[374,2156,2157],{"class":404}," true,\n",[374,2159,2160,2162,2164,2166,2168,2170,2172],{"class":376,"line":472},[374,2161,453],{"class":383},[374,2163,405],{"class":404},[374,2165,458],{"class":383},[374,2167,461],{"class":404},[374,2169,464],{"class":383},[374,2171,461],{"class":404},[374,2173,469],{"class":383},[374,2175,2176],{"class":376,"line":485},[374,2177,2178],{"class":1826},"    // dataOrNull returns data from Success, Loading.previousData, or Failure.previousData\n",[374,2180,2181,2184,2187,2190,2192,2194,2197,2200,2203],{"class":376,"line":512},[374,2182,2183],{"class":496},"    final",[374,2185,2186],{"class":383}," posts ",[374,2188,2189],{"class":404},"=",[374,2191,464],{"class":383},[374,2193,438],{"class":404},[374,2195,2196],{"class":383},"dataOrNull ",[374,2198,2199],{"class":404},"??",[374,2201,2202],{"class":383}," []",[374,2204,689],{"class":404},[374,2206,2207,2209,2211],{"class":376,"line":540},[374,2208,476],{"class":475},[374,2210,546],{"class":380},[374,2212,1132],{"class":383},[374,2214,2215,2218,2220],{"class":376,"line":572},[374,2216,2217],{"class":383},"      children",[374,2219,405],{"class":404},[374,2221,1553],{"class":383},[374,2223,2224,2227,2230,2232,2235],{"class":376,"line":587},[374,2225,2226],{"class":380},"        PostList",[374,2228,2229],{"class":383},"(posts",[374,2231,405],{"class":404},[374,2233,2234],{"class":383}," posts)",[374,2236,418],{"class":404},[374,2238,2239,2242,2245,2247,2250,2253,2255,2257],{"class":376,"line":612},[374,2240,2241],{"class":475},"        if",[374,2243,2244],{"class":383}," (state",[374,2246,438],{"class":404},[374,2248,2249],{"class":383},"isLoading) ",[374,2251,2252],{"class":496},"const",[374,2254,566],{"class":380},[374,2256,445],{"class":383},[374,2258,418],{"class":404},[374,2260,2261,2264],{"class":376,"line":644},[374,2262,2263],{"class":383},"      ]",[374,2265,418],{"class":404},[374,2267,2268,2270],{"class":376,"line":670},[374,2269,1331],{"class":383},[374,2271,689],{"class":404},[374,2273,2274,2276],{"class":376,"line":683},[374,2275,695],{"class":383},[374,2277,418],{"class":404},[374,2279,2280],{"class":376,"line":692},[374,2281,703],{"class":383},[1721,2283,2284,2286,2287,2290],{},[351,2285,960],{}," only fills in the gap: if the client already supplies ",[351,2288,2289],{},"previousData"," in the state, that value takes priority. The widget's local cache is purely a fallback.",[356,2292],{},[1032,2294,2296],{"id":2295},"displaying-a-freshness-timestamp","Displaying a freshness timestamp",[348,2298,2299,2301,2302,2305],{},[351,2300,982],{}," carries ",[351,2303,2304],{},"updatedAt",": the moment the data was last fetched:",[364,2307,2309],{"className":366,"code":2308,"filename":1050,"language":369,"meta":370,"style":370},"onSuccess: (user, updatedAt) => Column(\n  children: [\n    UserCard(user: user),\n    Text(\n      'Last updated ${_timeAgo(updatedAt)}',\n      style: Theme.of(context).textTheme.labelSmall,\n    ),\n  ],\n),\n",[351,2310,2311,2330,2339,2352,2359,2380,2410,2416,2423],{"__ignoreMap":370},[374,2312,2313,2316,2318,2320,2322,2324,2326,2328],{"class":376,"line":377},[374,2314,2315],{"class":383},"onSuccess",[374,2317,405],{"class":404},[374,2319,1222],{"class":383},[374,2321,461],{"class":404},[374,2323,1227],{"class":383},[374,2325,432],{"class":404},[374,2327,649],{"class":380},[374,2329,1132],{"class":383},[374,2331,2332,2335,2337],{"class":376,"line":398},[374,2333,2334],{"class":383},"  children",[374,2336,405],{"class":404},[374,2338,1553],{"class":383},[374,2340,2341,2344,2346,2348,2350],{"class":376,"line":421},[374,2342,2343],{"class":380},"    UserCard",[374,2345,1183],{"class":383},[374,2347,405],{"class":404},[374,2349,1238],{"class":383},[374,2351,418],{"class":404},[374,2353,2354,2357],{"class":376,"line":450},[374,2355,2356],{"class":380},"    Text",[374,2358,1132],{"class":383},[374,2360,2361,2364,2366,2369,2371,2373,2376,2378],{"class":376,"line":472},[374,2362,2363],{"class":411},"      'Last updated ",[374,2365,1998],{"class":383},[374,2367,2368],{"class":441},"_timeAgo",[374,2370,518],{"class":383},[374,2372,2304],{"class":2001},[374,2374,2375],{"class":383},")}",[374,2377,1995],{"class":411},[374,2379,418],{"class":404},[374,2381,2382,2385,2387,2390,2392,2395,2398,2400,2403,2405,2408],{"class":376,"line":485},[374,2383,2384],{"class":383},"      style",[374,2386,405],{"class":404},[374,2388,2389],{"class":380}," Theme",[374,2391,438],{"class":404},[374,2393,2394],{"class":441},"of",[374,2396,2397],{"class":383},"(context)",[374,2399,438],{"class":404},[374,2401,2402],{"class":383},"textTheme",[374,2404,438],{"class":404},[374,2406,2407],{"class":383},"labelSmall",[374,2409,418],{"class":404},[374,2411,2412,2414],{"class":376,"line":512},[374,2413,1331],{"class":383},[374,2415,418],{"class":404},[374,2417,2418,2421],{"class":376,"line":540},[374,2419,2420],{"class":383},"  ]",[374,2422,418],{"class":404},[374,2424,2425,2427],{"class":376,"line":572},[374,2426,868],{"class":383},[374,2428,418],{"class":404},[356,2430],{},[1032,2432,2434],{"id":2433},"polling","Polling",[348,2436,2437,2438,783,2441,2443],{},"Pass ",[351,2439,2440],{},"refetchInterval",[351,2442,915],{}," to poll on a fixed schedule:",[364,2445,2448],{"className":366,"code":2446,"filename":2447,"language":369,"meta":370,"style":370},"QoraBuilder\u003CList\u003CNotification>>(\n  queryKey: ['notifications'],\n  fetcher: api.getNotifications,\n  options: const QoraOptions(refetchInterval: Duration(seconds: 30)),\n  builder: (context, state) { ... },\n)\n","notifications_screen.dart",[351,2449,2450,2465,2480,2495,2527,2546],{"__ignoreMap":370},[374,2451,2452,2454,2456,2458,2460,2463],{"class":376,"line":377},[374,2453,108],{"class":380},[374,2455,384],{"class":383},[374,2457,387],{"class":380},[374,2459,384],{"class":383},[374,2461,2462],{"class":380},"Notification",[374,2464,395],{"class":383},[374,2466,2467,2469,2471,2473,2476,2478],{"class":376,"line":398},[374,2468,401],{"class":383},[374,2470,405],{"class":404},[374,2472,408],{"class":383},[374,2474,2475],{"class":411},"'notifications'",[374,2477,415],{"class":383},[374,2479,418],{"class":404},[374,2481,2482,2484,2486,2488,2490,2493],{"class":376,"line":421},[374,2483,424],{"class":383},[374,2485,405],{"class":404},[374,2487,435],{"class":383},[374,2489,438],{"class":404},[374,2491,2492],{"class":383},"getNotifications",[374,2494,418],{"class":404},[374,2496,2497,2500,2502,2504,2507,2510,2512,2515,2518,2520,2523,2525],{"class":376,"line":450},[374,2498,2499],{"class":383},"  options",[374,2501,405],{"class":404},[374,2503,497],{"class":496},[374,2505,2506],{"class":380}," QoraOptions",[374,2508,2509],{"class":383},"(refetchInterval",[374,2511,405],{"class":404},[374,2513,2514],{"class":380}," Duration",[374,2516,2517],{"class":383},"(seconds",[374,2519,405],{"class":404},[374,2521,2522],{"class":2017}," 30",[374,2524,1499],{"class":383},[374,2526,418],{"class":404},[374,2528,2529,2531,2533,2535,2537,2540,2542,2544],{"class":376,"line":472},[374,2530,453],{"class":383},[374,2532,405],{"class":404},[374,2534,458],{"class":383},[374,2536,461],{"class":404},[374,2538,2539],{"class":383}," state) { ",[374,2541,1847],{"class":404},[374,2543,1850],{"class":383},[374,2545,418],{"class":404},[374,2547,2548],{"class":376,"line":485},[374,2549,703],{"class":383},[348,2551,2552,2553,2555],{},"Polling is active only while the ",[351,2554,108],{}," is in the widget tree. It stops automatically on dispose.",[356,2557],{},[1032,2559,2561,2562,868],{"id":2560},"seeding-initial-data-initialdata","Seeding initial data (",[351,2563,2564],{},"initialData",[348,2566,2567,2570],{},[351,2568,2569],{},"QoraOptions.initialData"," seeds the cache with placeholder data before any fetch completes. Use it for SSR hydration, instant renders from shared preferences, or a previous app session:",[364,2572,2574],{"className":366,"code":2573,"filename":1050,"language":369,"meta":370,"style":370},"QoraBuilder\u003CUser>(\n  queryKey: ['users', userId],\n  fetcher: () => api.getUser(userId),\n  options: QoraOptions(\n    initialData: cachedUser,                          // pre-seed the cache\n    initialDataUpdatedAt: DateTime.now(),             // mark as fresh\n    staleTime: const Duration(minutes: 5),            // skip network if fresh\n  ),\n  builder: (context, state, fetchStatus) { ... },\n)\n",[351,2575,2576,2586,2602,2622,2632,2647,2669,2695,2702,2724],{"__ignoreMap":370},[374,2577,2578,2580,2582,2584],{"class":376,"line":377},[374,2579,108],{"class":380},[374,2581,384],{"class":383},[374,2583,392],{"class":380},[374,2585,1063],{"class":383},[374,2587,2588,2590,2592,2594,2596,2598,2600],{"class":376,"line":398},[374,2589,401],{"class":383},[374,2591,405],{"class":404},[374,2593,408],{"class":383},[374,2595,412],{"class":411},[374,2597,461],{"class":404},[374,2599,1078],{"class":383},[374,2601,418],{"class":404},[374,2603,2604,2606,2608,2610,2612,2614,2616,2618,2620],{"class":376,"line":421},[374,2605,424],{"class":383},[374,2607,405],{"class":404},[374,2609,429],{"class":383},[374,2611,432],{"class":404},[374,2613,435],{"class":383},[374,2615,438],{"class":404},[374,2617,1097],{"class":441},[374,2619,1100],{"class":383},[374,2621,418],{"class":404},[374,2623,2624,2626,2628,2630],{"class":376,"line":450},[374,2625,2499],{"class":383},[374,2627,405],{"class":404},[374,2629,2506],{"class":380},[374,2631,1132],{"class":383},[374,2633,2634,2637,2639,2642,2644],{"class":376,"line":472},[374,2635,2636],{"class":383},"    initialData",[374,2638,405],{"class":404},[374,2640,2641],{"class":383}," cachedUser",[374,2643,461],{"class":404},[374,2645,2646],{"class":1826},"                          // pre-seed the cache\n",[374,2648,2649,2652,2654,2657,2659,2662,2664,2666],{"class":376,"line":485},[374,2650,2651],{"class":383},"    initialDataUpdatedAt",[374,2653,405],{"class":404},[374,2655,2656],{"class":380}," DateTime",[374,2658,438],{"class":404},[374,2660,2661],{"class":441},"now",[374,2663,445],{"class":383},[374,2665,461],{"class":404},[374,2667,2668],{"class":1826},"             // mark as fresh\n",[374,2670,2671,2674,2676,2678,2680,2683,2685,2688,2690,2692],{"class":376,"line":512},[374,2672,2673],{"class":383},"    staleTime",[374,2675,405],{"class":404},[374,2677,497],{"class":496},[374,2679,2514],{"class":380},[374,2681,2682],{"class":383},"(minutes",[374,2684,405],{"class":404},[374,2686,2687],{"class":2017}," 5",[374,2689,868],{"class":383},[374,2691,461],{"class":404},[374,2693,2694],{"class":1826},"            // skip network if fresh\n",[374,2696,2697,2700],{"class":376,"line":540},[374,2698,2699],{"class":383},"  )",[374,2701,418],{"class":404},[374,2703,2704,2706,2708,2710,2712,2714,2716,2718,2720,2722],{"class":376,"line":572},[374,2705,453],{"class":383},[374,2707,405],{"class":404},[374,2709,458],{"class":383},[374,2711,461],{"class":404},[374,2713,464],{"class":383},[374,2715,461],{"class":404},[374,2717,1844],{"class":383},[374,2719,1847],{"class":404},[374,2721,1850],{"class":383},[374,2723,418],{"class":404},[374,2725,2726],{"class":376,"line":587},[374,2727,703],{"class":383},[825,2729,2730,2741],{},[828,2731,2732],{},[831,2733,2734,2737,2739],{},[834,2735,2736],{},"Parameter",[834,2738,842],{},[834,2740,845],{},[847,2742,2743,2760,2777],{},[831,2744,2745,2749,2753],{},[852,2746,2747],{},[351,2748,2564],{},[852,2750,2751],{},[351,2752,925],{},[852,2754,2755,2756,2759],{},"Placeholder data of type ",[351,2757,2758],{},"T"," to pre-populate the cache.",[831,2761,2762,2767,2770],{},[852,2763,2764],{},[351,2765,2766],{},"initialDataUpdatedAt",[852,2768,2769],{},"epoch",[852,2771,2772,2773,2776],{},"Timestamp for staleness calc. Set to ",[351,2774,2775],{},"DateTime.now()"," to skip the network.",[831,2778,2779,2784,2788],{},[852,2780,2781],{},[351,2782,2783],{},"placeholderData",[852,2785,2786],{},[351,2787,925],{},[852,2789,2790],{},"Lazy function that derives initial data from another cache entry.",[348,2792,949,2793,2795],{},[351,2794,2564],{}," is provided:",[2797,2798,2799,2815],"ul",{},[711,2800,2801,2802,862,2805,2807,2808,2811,2812,438],{},"If ",[714,2803,2804],{},"fresh",[351,2806,2304],{}," within ",[351,2809,2810],{},"staleTime","): the widget renders with the placeholder immediately and ",[714,2813,2814],{},"skips the network",[711,2816,2801,2817,2820,2821,438],{},[714,2818,2819],{},"stale"," (default epoch timestamp): the widget renders with the placeholder and triggers a background SWR refetch. The placeholder is carried via ",[351,2822,2823],{},"Loading.previousData",[2825,2826,2827,2829,2830,2832,2833,2835],"note",{},[351,2828,2564],{}," takes precedence over ",[351,2831,2783],{},". A runtime type mismatch is silently ignored (the cache stays ",[351,2834,2077],{}," and fetches normally).",[356,2837],{},[359,2839,2841],{"id":2840},"key-changing-behaviour","Key Changing Behaviour",[348,2843,949,2844,2846,2847,2850,2851,405],{},[351,2845,856],{}," changes (",[351,2848,2849],{},"didUpdateWidget","), ",[351,2852,108],{},[708,2854,2855,2858,2866],{},[711,2856,2857],{},"Cancels the previous stream subscription.",[711,2859,2860,2861,2052,2863,2865],{},"Subscribes to the new key's stream (starting from its current cache state: could be ",[351,2862,2077],{},[351,2864,982],{},", etc.).",[711,2867,2868,2869,2871,2872,2874],{},"Dispatches a fresh ",[351,2870,816],{}," for the new key (if ",[351,2873,790],{},").",[348,2876,2877],{},"This is how pagination, tab switching, and filter changes are handled automatically without any extra state management.",[356,2879],{},[359,2881,2883,2886],{"id":2882},"qorastatebuilder-observe-without-fetching",[351,2884,2885],{},"QoraStateBuilder",": Observe Without Fetching",[348,2888,2889,2892],{},[351,2890,2891],{},"QoraStateBuilder\u003CT>"," subscribes to query state without triggering a fetch. Use it when another widget or service owns the fetch lifecycle and you only want to display the current state.",[364,2894,2897],{"className":366,"code":2895,"filename":2896,"language":369,"meta":370,"style":370},"// NotificationsScreen (a QoraBuilder) owns the fetch.\n// This badge simply mirrors the cached state of the same key.\nQoraStateBuilder\u003CList\u003CNotification>>(\n  queryKey: ['notifications'],\n  builder: (context, state) {\n    final count = state.dataOrNull?.length ?? 0;\n    return Badge(\n      label: Text('$count'),\n      isLabelVisible: count > 0,\n      child: const Icon(Icons.notifications),\n    );\n  },\n)\n","notification_badge.dart",[351,2898,2899,2904,2909,2923,2937,2950,2977,2986,3011,3027,3051,3057,3063],{"__ignoreMap":370},[374,2900,2901],{"class":376,"line":377},[374,2902,2903],{"class":1826},"// NotificationsScreen (a QoraBuilder) owns the fetch.\n",[374,2905,2906],{"class":376,"line":398},[374,2907,2908],{"class":1826},"// This badge simply mirrors the cached state of the same key.\n",[374,2910,2911,2913,2915,2917,2919,2921],{"class":376,"line":421},[374,2912,2885],{"class":380},[374,2914,384],{"class":383},[374,2916,387],{"class":380},[374,2918,384],{"class":383},[374,2920,2462],{"class":380},[374,2922,395],{"class":383},[374,2924,2925,2927,2929,2931,2933,2935],{"class":376,"line":450},[374,2926,401],{"class":383},[374,2928,405],{"class":404},[374,2930,408],{"class":383},[374,2932,2475],{"class":411},[374,2934,415],{"class":383},[374,2936,418],{"class":404},[374,2938,2939,2941,2943,2945,2947],{"class":376,"line":472},[374,2940,453],{"class":383},[374,2942,405],{"class":404},[374,2944,458],{"class":383},[374,2946,461],{"class":404},[374,2948,2949],{"class":383}," state) {\n",[374,2951,2952,2954,2957,2959,2961,2963,2965,2967,2970,2972,2975],{"class":376,"line":485},[374,2953,2183],{"class":496},[374,2955,2956],{"class":383}," count ",[374,2958,2189],{"class":404},[374,2960,464],{"class":383},[374,2962,438],{"class":404},[374,2964,2006],{"class":383},[374,2966,2009],{"class":404},[374,2968,2969],{"class":383},"length ",[374,2971,2199],{"class":404},[374,2973,2974],{"class":2017}," 0",[374,2976,689],{"class":404},[374,2978,2979,2981,2984],{"class":376,"line":512},[374,2980,476],{"class":475},[374,2982,2983],{"class":380}," Badge",[374,2985,1132],{"class":383},[374,2987,2988,2991,2993,2995,2997,2999,3002,3005,3007,3009],{"class":376,"line":540},[374,2989,2990],{"class":383},"      label",[374,2992,405],{"class":404},[374,2994,1491],{"class":380},[374,2996,518],{"class":383},[374,2998,1995],{"class":411},[374,3000,3001],{"class":383},"$",[374,3003,3004],{"class":2001},"count",[374,3006,1995],{"class":411},[374,3008,868],{"class":383},[374,3010,418],{"class":404},[374,3012,3013,3016,3018,3020,3023,3025],{"class":376,"line":572},[374,3014,3015],{"class":383},"      isLabelVisible",[374,3017,405],{"class":404},[374,3019,2956],{"class":383},[374,3021,3022],{"class":404},">",[374,3024,2974],{"class":2017},[374,3026,418],{"class":404},[374,3028,3029,3032,3034,3036,3039,3041,3044,3046,3049],{"class":376,"line":587},[374,3030,3031],{"class":383},"      child",[374,3033,405],{"class":404},[374,3035,497],{"class":496},[374,3037,3038],{"class":380}," Icon",[374,3040,518],{"class":383},[374,3042,3043],{"class":380},"Icons",[374,3045,438],{"class":404},[374,3047,3048],{"class":383},"notifications)",[374,3050,418],{"class":404},[374,3052,3053,3055],{"class":376,"line":612},[374,3054,1331],{"class":383},[374,3056,689],{"class":404},[374,3058,3059,3061],{"class":376,"line":644},[374,3060,695],{"class":383},[374,3062,418],{"class":404},[374,3064,3065],{"class":376,"line":670},[374,3066,703],{"class":383},[1032,3068,3070,3072],{"id":3069},"qorastatebuilder-props",[351,3071,2885],{}," Props",[825,3074,3075,3085],{},[828,3076,3077],{},[831,3078,3079,3081,3083],{},[834,3080,836],{},[834,3082,839],{},[834,3084,845],{},[847,3086,3087,3104,3118],{},[831,3088,3089,3093,3101],{},[852,3090,3091],{},[351,3092,856],{},[852,3094,3095,862,3097,865,3099,868],{},[351,3096,861],{},[351,3098,387],{},[351,3100,207],{},[852,3102,3103],{},"Key to observe.",[831,3105,3106,3110,3115],{},[852,3107,3108],{},[351,3109,898],{},[852,3111,3112],{},[351,3113,3114],{},"Widget Function(BuildContext, QoraState\u003CT>)",[852,3116,3117],{},"Builds the widget tree from the current state.",[831,3119,3120,3124,3128],{},[852,3121,3122],{},[351,3123,1009],{},[852,3125,3126],{},[351,3127,1014],{},[852,3129,1021,3130,438],{},[351,3131,103],{},[1721,3133,3134,3136],{},[351,3135,2885],{}," is ideal for badges, counters, or secondary displays that derive their data from a query fetched elsewhere: for example, a cart item count or an unread message badge in an app bar.",[356,3138],{},[359,3140,3142],{"id":3141},"next-steps","Next Steps",[2797,3144,3145,3156,3170,3176,3186],{},[711,3146,3147,3152,3153,3155],{},[3148,3149,3151],"a",{"href":3150},"../recipes/network-aware","Network Aware Guide",": Full offline setup with ",[351,3154,744],{}," and offline mutation queue",[711,3157,3158,2038,3162,3165,3166,3169],{},[3148,3159,3161],{"href":3160},"./network-status","Network Status",[351,3163,3164],{},"NetworkStatusBuilder"," and ",[351,3167,3168],{},"NetworkStatusIndicator"," widgets",[711,3171,3172,3175],{},[3148,3173,62],{"href":3174},"../core-concepts/query-states",": Full state machine reference",[711,3177,3178,3181,3182,3185],{},[3148,3179,215],{"href":3180},"../api-reference/qora-options",": Stale time, retry, polling, and ",[351,3183,3184],{},"networkMode"," configuration",[711,3187,3188,3191],{},[3148,3189,148],{"href":3190},"../recipes/optimistic-updates",": Instant UI with safe rollback",[3193,3194,3195],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .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 .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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":370,"searchDepth":398,"depth":398,"links":3197},[3198,3199,3200,3201,3216,3217,3222],{"id":361,"depth":398,"text":362},{"id":759,"depth":398,"text":760},{"id":822,"depth":398,"text":823},{"id":1029,"depth":398,"text":1030,"children":3202},[3203,3204,3206,3208,3210,3212,3213,3214],{"id":1034,"depth":421,"text":1035},{"id":1349,"depth":421,"text":3205},"Offline-aware UI with FetchStatus",{"id":1741,"depth":421,"text":3207},"Conditional queries (enabled)",{"id":1875,"depth":421,"text":3209},"Performance: derived subscriptions with select",{"id":2068,"depth":421,"text":3211},"Flicker-free pagination (keepPreviousData)",{"id":2295,"depth":421,"text":2296},{"id":2433,"depth":421,"text":2434},{"id":2560,"depth":421,"text":3215},"Seeding initial data (initialData)",{"id":2840,"depth":398,"text":2841},{"id":2882,"depth":398,"text":3218,"children":3219},"QoraStateBuilder: Observe Without Fetching",[3220],{"id":3069,"depth":421,"text":3221},"QoraStateBuilder Props",{"id":3141,"depth":398,"text":3142},"The widget that fetches data, subscribes to state changes, and rebuilds your UI on every state transition.","md",null,{},{"icon":111},{"title":108,"description":3223},"eNZhIoePNhUhXzH0s0XZGfBLGrwC_WPRDij3KiG90qo",[3231,3233],{"title":103,"path":104,"stem":105,"description":3232,"icon":106,"children":-1},"The StatefulWidget that provides a QoraClient to your widget tree and manages the lifecycle of optional platform managers.",{"title":113,"path":114,"stem":115,"description":3234,"icon":116,"children":-1},"The widget that manages a MutationController lifecycle and rebuilds your UI on every mutation state transition.",1794040396254]