[{"data":1,"prerenderedAt":1798},["ShallowReactive",2],{"navigation_docs_en":3,"-en-flutter-integration-qora-scope":342,"-en-flutter-integration-qora-scope-surround":1793},[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":103,"body":344,"description":1786,"extension":1787,"links":1788,"meta":1789,"navigation":1790,"path":104,"seo":1791,"stem":105,"__hash__":1792},"docs_en/en/03.flutter-integration/2.qora-scope.md",{"type":345,"value":346,"toc":1764},"minimark",[347,357,360,365,370,506,512,515,638,668,670,674,681,684,853,859,872,966,972,982,1040,1046,1051,1081,1083,1087,1093,1241,1247,1249,1253,1259,1277,1331,1341,1347,1371,1377,1394,1403,1429,1448,1455,1465,1521,1523,1526,1716,1718,1722,1760],[348,349,350,353,354,356],"p",{},[351,352,103],"code",{}," is the single point of truth for your ",[351,355,202],{}," in Flutter. Wrap your app (or a sub-tree) with it once, and every descendant gains access to the same cache and request pipeline.",[358,359],"hr",{},[361,362,364],"h2",{"id":363},"anatomy","Anatomy",[366,367,369],"h3",{"id":368},"default-constructor","Default constructor",[371,372,378],"pre",{"className":373,"code":374,"filename":375,"language":376,"meta":377,"style":377},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QoraScope(\n  // Required: the shared cache and request engine\n  client: client,\n\n  // Optional: invalidates queries on app resume\n  lifecycleManager: FlutterLifecycleManager(qoraClient: client),\n\n  // Optional: pure signal provider for network connectivity\n  connectivityManager: FlutterConnectivityManager(),\n\n  child: const MyApp(),\n)\n","main.dart","dart","",[351,379,380,392,399,415,422,428,449,454,460,476,481,500],{"__ignoreMap":377},[381,382,385,388],"span",{"class":383,"line":384},"line",1,[381,386,103],{"class":387},"sBMFI",[381,389,391],{"class":390},"sTEyZ","(\n",[381,393,395],{"class":383,"line":394},2,[381,396,398],{"class":397},"sHwdD","  // Required: the shared cache and request engine\n",[381,400,402,405,409,412],{"class":383,"line":401},3,[381,403,404],{"class":390},"  client",[381,406,408],{"class":407},"sMK4o",":",[381,410,411],{"class":390}," client",[381,413,414],{"class":407},",\n",[381,416,418],{"class":383,"line":417},4,[381,419,421],{"emptyLinePlaceholder":420},true,"\n",[381,423,425],{"class":383,"line":424},5,[381,426,427],{"class":397},"  // Optional: invalidates queries on app resume\n",[381,429,431,434,436,439,442,444,447],{"class":383,"line":430},6,[381,432,433],{"class":390},"  lifecycleManager",[381,435,408],{"class":407},[381,437,438],{"class":387}," FlutterLifecycleManager",[381,440,441],{"class":390},"(qoraClient",[381,443,408],{"class":407},[381,445,446],{"class":390}," client)",[381,448,414],{"class":407},[381,450,452],{"class":383,"line":451},7,[381,453,421],{"emptyLinePlaceholder":420},[381,455,457],{"class":383,"line":456},8,[381,458,459],{"class":397},"  // Optional: pure signal provider for network connectivity\n",[381,461,463,466,468,471,474],{"class":383,"line":462},9,[381,464,465],{"class":390},"  connectivityManager",[381,467,408],{"class":407},[381,469,470],{"class":387}," FlutterConnectivityManager",[381,472,473],{"class":390},"()",[381,475,414],{"class":407},[381,477,479],{"class":383,"line":478},10,[381,480,421],{"emptyLinePlaceholder":420},[381,482,484,487,489,493,496,498],{"class":383,"line":483},11,[381,485,486],{"class":390},"  child",[381,488,408],{"class":407},[381,490,492],{"class":491},"spNyl"," const",[381,494,495],{"class":387}," MyApp",[381,497,473],{"class":390},[381,499,414],{"class":407},[381,501,503],{"class":383,"line":502},12,[381,504,505],{"class":390},")\n",[366,507,509],{"id":508},"qorascopeauto",[351,510,511],{},"QoraScope.auto()",[348,513,514],{},"A convenience constructor that wires both managers automatically:",[371,516,518],{"className":373,"code":517,"filename":375,"language":376,"meta":377,"style":377},"QoraScope.auto(\n  client: QoraClient(),\n  child: const MyApp(),\n)\n// Equivalent to passing FlutterLifecycleManager + FlutterConnectivityManager manually.\n\n// Disable specific listeners:\nQoraScope.auto(\n  client: QoraClient(),\n  enableLifecycle: false,\n  enableConnectivity: false,\n  child: const MyApp(),\n)\n",[351,519,520,533,546,560,564,569,573,578,588,600,610,619,633],{"__ignoreMap":377},[381,521,522,524,527,531],{"class":383,"line":384},[381,523,103],{"class":387},[381,525,526],{"class":407},".",[381,528,530],{"class":529},"s2Zo4","auto",[381,532,391],{"class":390},[381,534,535,537,539,542,544],{"class":383,"line":394},[381,536,404],{"class":390},[381,538,408],{"class":407},[381,540,541],{"class":387}," QoraClient",[381,543,473],{"class":390},[381,545,414],{"class":407},[381,547,548,550,552,554,556,558],{"class":383,"line":401},[381,549,486],{"class":390},[381,551,408],{"class":407},[381,553,492],{"class":491},[381,555,495],{"class":387},[381,557,473],{"class":390},[381,559,414],{"class":407},[381,561,562],{"class":383,"line":417},[381,563,505],{"class":390},[381,565,566],{"class":383,"line":424},[381,567,568],{"class":397},"// Equivalent to passing FlutterLifecycleManager + FlutterConnectivityManager manually.\n",[381,570,571],{"class":383,"line":430},[381,572,421],{"emptyLinePlaceholder":420},[381,574,575],{"class":383,"line":451},[381,576,577],{"class":397},"// Disable specific listeners:\n",[381,579,580,582,584,586],{"class":383,"line":456},[381,581,103],{"class":387},[381,583,526],{"class":407},[381,585,530],{"class":529},[381,587,391],{"class":390},[381,589,590,592,594,596,598],{"class":383,"line":462},[381,591,404],{"class":390},[381,593,408],{"class":407},[381,595,541],{"class":387},[381,597,473],{"class":390},[381,599,414],{"class":407},[381,601,602,605,607],{"class":383,"line":478},[381,603,604],{"class":390},"  enableLifecycle",[381,606,408],{"class":407},[381,608,609],{"class":407}," false,\n",[381,611,612,615,617],{"class":383,"line":483},[381,613,614],{"class":390},"  enableConnectivity",[381,616,408],{"class":407},[381,618,609],{"class":407},[381,620,621,623,625,627,629,631],{"class":383,"line":502},[381,622,486],{"class":390},[381,624,408],{"class":407},[381,626,492],{"class":491},[381,628,495],{"class":387},[381,630,473],{"class":390},[381,632,414],{"class":407},[381,634,636],{"class":383,"line":635},13,[381,637,505],{"class":390},[348,639,640,642,643,646,647,650,651,654,655,658,659,663,664,667],{},[351,641,103],{}," is a ",[351,644,645],{},"StatefulWidget",". It calls ",[351,648,649],{},"start()"," on each manager in ",[351,652,653],{},"initState"," and calls ",[351,656,657],{},"dispose()"," on both managers ",[660,661,662],"strong",{},"and"," on the client itself in ",[351,665,666],{},"dispose",". You never manage their lifetime manually.",[358,669],{},[361,671,673],{"id":672},"accessing-the-client","Accessing the Client",[366,675,677,680],{"id":676},"contextqora-recommended",[351,678,679],{},"context.qora"," (recommended)",[348,682,683],{},"The shortest path to the client from any widget:",[371,685,688],{"className":373,"code":686,"filename":687,"language":376,"meta":377,"style":377},"// Invalidate a specific query after a mutation\ncontext.qora.invalidate(['posts', postId]);\n\n// Invalidate by predicate\ncontext.qora.invalidateWhere((key) => key.firstOrNull == 'posts');\n\n// Optimistic update\nfinal snapshot = context.qora.getQueryData\u003CUser>(['users', userId]);\ncontext.qora.setQueryData(['users', userId], updatedUser);\n","user_list_screen.dart",[351,689,690,695,726,730,735,773,777,782,824],{"__ignoreMap":377},[381,691,692],{"class":383,"line":384},[381,693,694],{"class":397},"// Invalidate a specific query after a mutation\n",[381,696,697,700,702,705,707,710,713,717,720,723],{"class":383,"line":394},[381,698,699],{"class":390},"context",[381,701,526],{"class":407},[381,703,704],{"class":390},"qora",[381,706,526],{"class":407},[381,708,709],{"class":529},"invalidate",[381,711,712],{"class":390},"([",[381,714,716],{"class":715},"sfazB","'posts'",[381,718,719],{"class":407},",",[381,721,722],{"class":390}," postId])",[381,724,725],{"class":407},";\n",[381,727,728],{"class":383,"line":401},[381,729,421],{"emptyLinePlaceholder":420},[381,731,732],{"class":383,"line":417},[381,733,734],{"class":397},"// Invalidate by predicate\n",[381,736,737,739,741,743,745,748,751,754,757,759,762,765,768,771],{"class":383,"line":424},[381,738,699],{"class":390},[381,740,526],{"class":407},[381,742,704],{"class":390},[381,744,526],{"class":407},[381,746,747],{"class":529},"invalidateWhere",[381,749,750],{"class":390},"((key) ",[381,752,753],{"class":407},"=>",[381,755,756],{"class":390}," key",[381,758,526],{"class":407},[381,760,761],{"class":390},"firstOrNull ",[381,763,764],{"class":407},"==",[381,766,767],{"class":715}," 'posts'",[381,769,770],{"class":390},")",[381,772,725],{"class":407},[381,774,775],{"class":383,"line":430},[381,776,421],{"emptyLinePlaceholder":420},[381,778,779],{"class":383,"line":451},[381,780,781],{"class":397},"// Optimistic update\n",[381,783,784,787,790,793,796,798,800,802,805,808,811,814,817,819,822],{"class":383,"line":456},[381,785,786],{"class":491},"final",[381,788,789],{"class":390}," snapshot ",[381,791,792],{"class":407},"=",[381,794,795],{"class":390}," context",[381,797,526],{"class":407},[381,799,704],{"class":390},[381,801,526],{"class":407},[381,803,804],{"class":529},"getQueryData",[381,806,807],{"class":390},"\u003C",[381,809,810],{"class":387},"User",[381,812,813],{"class":390},">([",[381,815,816],{"class":715},"'users'",[381,818,719],{"class":407},[381,820,821],{"class":390}," userId])",[381,823,725],{"class":407},[381,825,826,828,830,832,834,837,839,841,843,846,848,851],{"class":383,"line":462},[381,827,699],{"class":390},[381,829,526],{"class":407},[381,831,704],{"class":390},[381,833,526],{"class":407},[381,835,836],{"class":529},"setQueryData",[381,838,712],{"class":390},[381,840,816],{"class":715},[381,842,719],{"class":407},[381,844,845],{"class":390}," userId]",[381,847,719],{"class":407},[381,849,850],{"class":390}," updatedUser)",[381,852,725],{"class":407},[366,854,856],{"id":855},"qorascopeofcontext",[351,857,858],{},"QoraScope.of(context)",[348,860,861,862,864,865,868,869,871],{},"Equivalent to ",[351,863,679],{},". Throws a descriptive ",[351,866,867],{},"FlutterError"," if no ",[351,870,103],{}," ancestor is found in the tree:",[371,873,876],{"className":373,"code":874,"filename":875,"language":376,"meta":377,"style":377},"final client = QoraScope.of(context);\nawait client.fetchQuery\u003CList\u003CPost>>(\n  key: ['posts'],\n  fetcher: api.getPosts,\n);\n","user_repository.dart",[351,877,878,900,926,943,960],{"__ignoreMap":377},[381,879,880,882,885,887,890,892,895,898],{"class":383,"line":384},[381,881,786],{"class":491},[381,883,884],{"class":390}," client ",[381,886,792],{"class":407},[381,888,889],{"class":387}," QoraScope",[381,891,526],{"class":407},[381,893,894],{"class":529},"of",[381,896,897],{"class":390},"(context)",[381,899,725],{"class":407},[381,901,902,906,908,910,913,915,918,920,923],{"class":383,"line":394},[381,903,905],{"class":904},"s7zQu","await",[381,907,411],{"class":390},[381,909,526],{"class":407},[381,911,912],{"class":529},"fetchQuery",[381,914,807],{"class":390},[381,916,917],{"class":387},"List",[381,919,807],{"class":390},[381,921,922],{"class":387},"Post",[381,924,925],{"class":390},">>(\n",[381,927,928,931,933,936,938,941],{"class":383,"line":401},[381,929,930],{"class":390},"  key",[381,932,408],{"class":407},[381,934,935],{"class":390}," [",[381,937,716],{"class":715},[381,939,940],{"class":390},"]",[381,942,414],{"class":407},[381,944,945,948,950,953,955,958],{"class":383,"line":417},[381,946,947],{"class":390},"  fetcher",[381,949,408],{"class":407},[381,951,952],{"class":390}," api",[381,954,526],{"class":407},[381,956,957],{"class":390},"getPosts",[381,959,414],{"class":407},[381,961,962,964],{"class":383,"line":424},[381,963,770],{"class":390},[381,965,725],{"class":407},[366,967,969],{"id":968},"qorascopemaybeofcontext",[351,970,971],{},"QoraScope.maybeOf(context)",[348,973,974,975,978,979,981],{},"Returns ",[351,976,977],{},"null"," instead of throwing when ",[351,980,103],{}," is absent. Useful when the scope is optional in part of the tree:",[371,983,986],{"className":373,"code":984,"filename":985,"language":376,"meta":377,"style":377},"final client = QoraScope.maybeOf(context);\nif (client == null) return const SizedBox.shrink();\n","optional_widget.dart",[351,987,988,1007],{"__ignoreMap":377},[381,989,990,992,994,996,998,1000,1003,1005],{"class":383,"line":384},[381,991,786],{"class":491},[381,993,884],{"class":390},[381,995,792],{"class":407},[381,997,889],{"class":387},[381,999,526],{"class":407},[381,1001,1002],{"class":529},"maybeOf",[381,1004,897],{"class":390},[381,1006,725],{"class":407},[381,1008,1009,1012,1015,1017,1020,1023,1026,1028,1031,1033,1036,1038],{"class":383,"line":394},[381,1010,1011],{"class":904},"if",[381,1013,1014],{"class":390}," (client ",[381,1016,764],{"class":407},[381,1018,1019],{"class":407}," null",[381,1021,1022],{"class":390},") ",[381,1024,1025],{"class":904},"return",[381,1027,492],{"class":491},[381,1029,1030],{"class":387}," SizedBox",[381,1032,526],{"class":407},[381,1034,1035],{"class":529},"shrink",[381,1037,473],{"class":390},[381,1039,725],{"class":407},[366,1041,1043],{"id":1042},"contextqoraornull",[351,1044,1045],{},"context.qoraOrNull",[348,1047,1048,1049,408],{},"Shorthand for ",[351,1050,971],{},[371,1052,1055],{"className":373,"code":1053,"filename":1054,"language":376,"meta":377,"style":377},"context.qoraOrNull?.invalidate(['notifications']);\n","nav_bar.dart",[351,1056,1057],{"__ignoreMap":377},[381,1058,1059,1061,1063,1066,1069,1071,1073,1076,1079],{"class":383,"line":384},[381,1060,699],{"class":390},[381,1062,526],{"class":407},[381,1064,1065],{"class":390},"qoraOrNull",[381,1067,1068],{"class":407},"?.",[381,1070,709],{"class":529},[381,1072,712],{"class":390},[381,1074,1075],{"class":715},"'notifications'",[381,1077,1078],{"class":390},"])",[381,1080,725],{"class":407},[358,1082],{},[361,1084,1086],{"id":1085},"nested-scopes","Nested Scopes",[348,1088,1089,1090,1092],{},"You can nest multiple ",[351,1091,103],{}," widgets to isolate caches for different parts of the app: for example, separate caches for public and authenticated routes:",[371,1094,1097],{"className":373,"code":1095,"filename":1096,"language":376,"meta":377,"style":377},"QoraScope(\n  client: publicClient,\n  child: Navigator(\n    pages: [\n      MaterialPage(child: const HomeScreen()),\n      MaterialPage(\n        child: QoraScope(\n          // Separate cache for authenticated routes\n          client: authClient,\n          child: const DashboardScreen(),\n        ),\n      ),\n    ],\n  ),\n)\n","app.dart",[351,1098,1099,1105,1116,1127,1137,1157,1163,1174,1179,1191,1207,1214,1221,1228,1236],{"__ignoreMap":377},[381,1100,1101,1103],{"class":383,"line":384},[381,1102,103],{"class":387},[381,1104,391],{"class":390},[381,1106,1107,1109,1111,1114],{"class":383,"line":394},[381,1108,404],{"class":390},[381,1110,408],{"class":407},[381,1112,1113],{"class":390}," publicClient",[381,1115,414],{"class":407},[381,1117,1118,1120,1122,1125],{"class":383,"line":401},[381,1119,486],{"class":390},[381,1121,408],{"class":407},[381,1123,1124],{"class":387}," Navigator",[381,1126,391],{"class":390},[381,1128,1129,1132,1134],{"class":383,"line":417},[381,1130,1131],{"class":390},"    pages",[381,1133,408],{"class":407},[381,1135,1136],{"class":390}," [\n",[381,1138,1139,1142,1145,1147,1149,1152,1155],{"class":383,"line":424},[381,1140,1141],{"class":387},"      MaterialPage",[381,1143,1144],{"class":390},"(child",[381,1146,408],{"class":407},[381,1148,492],{"class":491},[381,1150,1151],{"class":387}," HomeScreen",[381,1153,1154],{"class":390},"())",[381,1156,414],{"class":407},[381,1158,1159,1161],{"class":383,"line":430},[381,1160,1141],{"class":387},[381,1162,391],{"class":390},[381,1164,1165,1168,1170,1172],{"class":383,"line":451},[381,1166,1167],{"class":390},"        child",[381,1169,408],{"class":407},[381,1171,889],{"class":387},[381,1173,391],{"class":390},[381,1175,1176],{"class":383,"line":456},[381,1177,1178],{"class":397},"          // Separate cache for authenticated routes\n",[381,1180,1181,1184,1186,1189],{"class":383,"line":462},[381,1182,1183],{"class":390},"          client",[381,1185,408],{"class":407},[381,1187,1188],{"class":390}," authClient",[381,1190,414],{"class":407},[381,1192,1193,1196,1198,1200,1203,1205],{"class":383,"line":478},[381,1194,1195],{"class":390},"          child",[381,1197,408],{"class":407},[381,1199,492],{"class":491},[381,1201,1202],{"class":387}," DashboardScreen",[381,1204,473],{"class":390},[381,1206,414],{"class":407},[381,1208,1209,1212],{"class":383,"line":483},[381,1210,1211],{"class":390},"        )",[381,1213,414],{"class":407},[381,1215,1216,1219],{"class":383,"line":502},[381,1217,1218],{"class":390},"      )",[381,1220,414],{"class":407},[381,1222,1223,1226],{"class":383,"line":635},[381,1224,1225],{"class":390},"    ]",[381,1227,414],{"class":407},[381,1229,1231,1234],{"class":383,"line":1230},14,[381,1232,1233],{"class":390},"  )",[381,1235,414],{"class":407},[381,1237,1239],{"class":383,"line":1238},15,[381,1240,505],{"class":390},[348,1242,1243,1244,1246],{},"Each ",[351,1245,103],{}," manages its own client: queries are fully independent between scopes.",[358,1248],{},[361,1250,1252],{"id":1251},"lifecycle-and-connectivity-managers","Lifecycle and Connectivity Managers",[366,1254,1256],{"id":1255},"flutterlifecyclemanager",[351,1257,1258],{},"FlutterLifecycleManager",[348,1260,1261,1262,1265,1266,1269,1270,1273,1274,408],{},"Observes ",[351,1263,1264],{},"AppLifecycleState"," changes via ",[351,1267,1268],{},"WidgetsBindingObserver",". When the app resumes after a pause longer than ",[351,1271,1272],{},"minBackgroundDuration",", it calls ",[351,1275,1276],{},"client.invalidateWhere((_) => true)",[371,1278,1280],{"className":373,"code":1279,"filename":375,"language":376,"meta":377,"style":377},"FlutterLifecycleManager(\n  qoraClient: client,\n  minBackgroundDuration: const Duration(minutes: 1), // default: 5 s\n)\n",[351,1281,1282,1288,1299,1327],{"__ignoreMap":377},[381,1283,1284,1286],{"class":383,"line":384},[381,1285,1258],{"class":387},[381,1287,391],{"class":390},[381,1289,1290,1293,1295,1297],{"class":383,"line":394},[381,1291,1292],{"class":390},"  qoraClient",[381,1294,408],{"class":407},[381,1296,411],{"class":390},[381,1298,414],{"class":407},[381,1300,1301,1304,1306,1308,1311,1314,1316,1320,1322,1324],{"class":383,"line":401},[381,1302,1303],{"class":390},"  minBackgroundDuration",[381,1305,408],{"class":407},[381,1307,492],{"class":491},[381,1309,1310],{"class":387}," Duration",[381,1312,1313],{"class":390},"(minutes",[381,1315,408],{"class":407},[381,1317,1319],{"class":1318},"sbssI"," 1",[381,1321,770],{"class":390},[381,1323,719],{"class":407},[381,1325,1326],{"class":397}," // default: 5 s\n",[381,1328,1329],{"class":383,"line":417},[381,1330,505],{"class":390},[348,1332,1333,1334,1336,1337,1340],{},"Active ",[351,1335,108],{}," widgets receive the resulting ",[351,1338,1339],{},"Loading(previousData: data)"," state and immediately dispatch re-fetch requests. Users see the stale data instantly while fresh data loads in the background.",[366,1342,1344],{"id":1343},"flutterconnectivitymanager",[351,1345,1346],{},"FlutterConnectivityManager",[348,1348,1349,1350,1353,1354,1357,1358,1361,1362,1364,1365,1368,1369,526],{},"A ",[660,1351,1352],{},"pure signal provider",": it converts ",[351,1355,1356],{},"connectivity_plus"," events into ",[351,1359,1360],{},"NetworkStatus"," values and nothing else. ",[351,1363,103],{}," wires it to the client automatically via ",[351,1366,1367],{},"attachConnectivityManager()"," after calling ",[351,1370,649],{},[348,1372,1373,1374,1376],{},"All reconnect logic (query replay, offline mutation queue replay, thundering-herd batching) runs inside ",[351,1375,202],{},", not inside the manager:",[371,1378,1380],{"className":373,"code":1379,"filename":375,"language":376,"meta":377,"style":377},"// No QoraClient reference required: pure signal provider\nFlutterConnectivityManager()\n",[351,1381,1382,1387],{"__ignoreMap":377},[381,1383,1384],{"class":383,"line":384},[381,1385,1386],{"class":397},"// No QoraClient reference required: pure signal provider\n",[381,1388,1389,1391],{"class":383,"line":394},[381,1390,1346],{"class":387},[381,1392,1393],{"class":390},"()\n",[348,1395,1396,1397,1399,1400,408],{},"Requires ",[351,1398,1356],{}," in your ",[351,1401,1402],{},"pubspec.yaml",[371,1404,1408],{"className":1405,"code":1406,"filename":1402,"language":1407,"meta":377,"style":377},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependencies:\n  connectivity_plus: ^6.0.0\n","yaml",[351,1409,1410,1419],{"__ignoreMap":377},[381,1411,1412,1416],{"class":383,"line":384},[381,1413,1415],{"class":1414},"swJcz","dependencies",[381,1417,1418],{"class":407},":\n",[381,1420,1421,1424,1426],{"class":383,"line":394},[381,1422,1423],{"class":1414},"  connectivity_plus",[381,1425,408],{"class":407},[381,1427,1428],{"class":715}," ^6.0.0\n",[1430,1431,1432,1433,1435,1436,1439,1440,1443,1444,1447],"tip",{},"The ",[351,1434,1346],{}," no longer invalidates queries directly. Reconnect behaviour is controlled by ",[351,1437,1438],{},"QoraClientConfig.reconnectStrategy"," and per-query ",[351,1441,1442],{},"QoraOptions.networkMode",". Implement a custom ",[351,1445,1446],{},"ConnectivityManager"," if you need to source connectivity events from a different package.",[366,1449,1451,1452,1454],{"id":1450},"accessing-the-connectivitymanager-from-descendants","Accessing the ",[351,1453,1446],{}," from descendants",[348,1456,1457,1460,1461,1464],{},[351,1458,1459],{},"QoraScope.connectivityManagerOf(context)"," exposes the manager to widgets deeper in the tree (used internally by ",[351,1462,1463],{},"NetworkStatusBuilder","):",[371,1466,1469],{"className":373,"code":1467,"filename":1468,"language":376,"meta":377,"style":377},"final manager = QoraScope.connectivityManagerOf(context);\nfinal status = manager?.currentStatus ?? NetworkStatus.unknown;\n","lib/ui/offline_badge.dart",[351,1470,1471,1491],{"__ignoreMap":377},[381,1472,1473,1475,1478,1480,1482,1484,1487,1489],{"class":383,"line":384},[381,1474,786],{"class":491},[381,1476,1477],{"class":390}," manager ",[381,1479,792],{"class":407},[381,1481,889],{"class":387},[381,1483,526],{"class":407},[381,1485,1486],{"class":529},"connectivityManagerOf",[381,1488,897],{"class":390},[381,1490,725],{"class":407},[381,1492,1493,1495,1498,1500,1503,1505,1508,1511,1514,1516,1519],{"class":383,"line":394},[381,1494,786],{"class":491},[381,1496,1497],{"class":390}," status ",[381,1499,792],{"class":407},[381,1501,1502],{"class":390}," manager",[381,1504,1068],{"class":407},[381,1506,1507],{"class":390},"currentStatus ",[381,1509,1510],{"class":407},"??",[381,1512,1513],{"class":387}," NetworkStatus",[381,1515,526],{"class":407},[381,1517,1518],{"class":390},"unknown",[381,1520,725],{"class":407},[358,1522],{},[361,1524,196],{"id":1525},"api-reference",[1527,1528,1529,1545],"table",{},[1530,1531,1532],"thead",{},[1533,1534,1535,1539,1542],"tr",{},[1536,1537,1538],"th",{},"Property / Method",[1536,1540,1541],{},"Type",[1536,1543,1544],{},"Description",[1546,1547,1548,1566,1581,1599,1616,1643,1656,1673,1688,1702],"tbody",{},[1533,1549,1550,1556,1560],{},[1551,1552,1553],"td",{},[351,1554,1555],{},"client",[1551,1557,1558],{},[351,1559,202],{},[1551,1561,1562,1565],{},[660,1563,1564],{},"Required."," The shared client for this scope.",[1533,1567,1568,1573,1578],{},[1551,1569,1570],{},[351,1571,1572],{},"lifecycleManager",[1551,1574,1575],{},[351,1576,1577],{},"LifecycleManager?",[1551,1579,1580],{},"Optional. Refetch on app resume.",[1533,1582,1583,1588,1593],{},[1551,1584,1585],{},[351,1586,1587],{},"connectivityManager",[1551,1589,1590],{},[351,1591,1592],{},"ConnectivityManager?",[1551,1594,1595,1596,1598],{},"Optional. Pure signal provider: no ",[351,1597,202],{}," ref needed.",[1533,1600,1601,1606,1611],{},[1551,1602,1603],{},[351,1604,1605],{},"child",[1551,1607,1608],{},[351,1609,1610],{},"Widget",[1551,1612,1613,1615],{},[660,1614,1564],{}," The widget subtree.",[1533,1617,1618,1622,1625],{},[1551,1619,1620],{},[351,1621,511],{},[1551,1623,1624],{},"Constructor",[1551,1626,1627,1628,1630,1631,1633,1634,1637,1638,1637,1641,526],{},"Shorthand that wires ",[351,1629,1258],{}," + ",[351,1632,1346],{},". Accepts ",[351,1635,1636],{},"enableLifecycle",", ",[351,1639,1640],{},"enableConnectivity",[351,1642,1272],{},[1533,1644,1645,1649,1653],{},[1551,1646,1647],{},[351,1648,858],{},[1551,1650,1651],{},[351,1652,202],{},[1551,1654,1655],{},"Returns the client; throws if none found.",[1533,1657,1658,1662,1667],{},[1551,1659,1660],{},[351,1661,971],{},[1551,1663,1664],{},[351,1665,1666],{},"QoraClient?",[1551,1668,1669,1670,1672],{},"Returns the client, or ",[351,1671,977],{}," if none found.",[1533,1674,1675,1679,1683],{},[1551,1676,1677],{},[351,1678,1459],{},[1551,1680,1681],{},[351,1682,1592],{},[1551,1684,1685,1686,526],{},"Returns the active manager; used by ",[351,1687,1463],{},[1533,1689,1690,1694,1698],{},[1551,1691,1692],{},[351,1693,679],{},[1551,1695,1696],{},[351,1697,202],{},[1551,1699,1048,1700,526],{},[351,1701,858],{},[1533,1703,1704,1708,1712],{},[1551,1705,1706],{},[351,1707,1045],{},[1551,1709,1710],{},[351,1711,1666],{},[1551,1713,1048,1714,526],{},[351,1715,971],{},[358,1717],{},[361,1719,1721],{"id":1720},"next-steps","Next Steps",[1723,1724,1725,1733,1747,1754],"ul",{},[1726,1727,1728,1732],"li",{},[1729,1730,108],"a",{"href":1731},"./qora-builder",": Fetch data and bind state to Flutter widgets",[1726,1734,1735,1739,1740,1742,1743,1746],{},[1729,1736,1738],{"href":1737},"./network-status","Network Status",": ",[351,1741,1463],{}," and ",[351,1744,1745],{},"NetworkStatusIndicator"," widgets",[1726,1748,1749,1753],{},[1729,1750,1752],{"href":1751},"../recipes/network-aware","Network Aware Guide",": Full offline-first setup walkthrough",[1726,1755,1756,1759],{},[1729,1757,21],{"href":1758},"../getting-started/quick-start",": End-to-end Flutter integration walkthrough",[1761,1762,1763],"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":377,"searchDepth":394,"depth":394,"links":1765},[1766,1770,1777,1778,1784,1785],{"id":363,"depth":394,"text":364,"children":1767},[1768,1769],{"id":368,"depth":401,"text":369},{"id":508,"depth":401,"text":511},{"id":672,"depth":394,"text":673,"children":1771},[1772,1774,1775,1776],{"id":676,"depth":401,"text":1773},"context.qora (recommended)",{"id":855,"depth":401,"text":858},{"id":968,"depth":401,"text":971},{"id":1042,"depth":401,"text":1045},{"id":1085,"depth":394,"text":1086},{"id":1251,"depth":394,"text":1252,"children":1779},[1780,1781,1782],{"id":1255,"depth":401,"text":1258},{"id":1343,"depth":401,"text":1346},{"id":1450,"depth":401,"text":1783},"Accessing the ConnectivityManager from descendants",{"id":1525,"depth":394,"text":196},{"id":1720,"depth":394,"text":1721},"The StatefulWidget that provides a QoraClient to your widget tree and manages the lifecycle of optional platform managers.","md",null,{},{"icon":106},{"title":103,"description":1786},"43wTuqPkW2jR7qsesKIGShckTMfKtKgv5fLeAVTFNV4",[1794,1796],{"title":98,"path":99,"stem":100,"description":1795,"icon":101,"children":-1},"Install qora_flutter, create a QoraClient instance, and provide it to the widget tree with QoraScope.",{"title":108,"path":109,"stem":110,"description":1797,"icon":111,"children":-1},"The widget that fetches data, subscribes to state changes, and rebuilds your UI on every state transition.",1794040399018]