[{"data":1,"prerenderedAt":3792},["ShallowReactive",2],{"navigation_docs_en":3,"-en-flutter-integration-infinite-query-builder":342,"-en-flutter-integration-infinite-query-builder-surround":3787},[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":118,"body":344,"description":3778,"extension":3779,"links":3780,"meta":3781,"navigation":3782,"path":119,"seo":3783,"stem":120,"__hash__":3786},"docs_en/en/03.flutter-integration/5.infinite-query-builder.md",{"type":345,"value":346,"toc":3760},"minimark",[347,363,366,371,963,966,1015,1017,1021,1182,1184,1188,1193,1230,1245,1252,1254,1258,1263,1276,1608,1614,1616,1620,1630,2236,2238,2242,2254,2786,2788,2794,2797,2980,2994,2996,3000,3007,3598,3600,3605,3617,3621,3688,3690,3694,3705,3723,3726,3728,3732,3756],[348,349,350,354,355,358,359,362],"p",{},[351,352,353],"code",{},"InfiniteQueryBuilder\u003CTData, TPageParam>"," is the Flutter binding for infinite (paginated) queries. It manages the full pagination lifecycle in a single widget: fetching the first page on mount, subscribing to all state transitions, and exposing an ",[351,356,357],{},"InfiniteQueryController"," to trigger additional page loads from scroll listeners, buttons, or ",[351,360,361],{},"RefreshIndicator",".",[364,365],"hr",{},[367,368,370],"h2",{"id":369},"basic-usage-forward-scroll","Basic Usage: Forward Scroll",[372,373,379],"pre",{"className":374,"code":375,"filename":376,"language":377,"meta":378,"style":378},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","InfiniteQueryBuilder\u003CList\u003CPost>, int>(\n  queryKey: ['posts'],\n  fetcher: (page) => api.getPosts(page: page),\n  options: InfiniteQueryOptions(\n    initialPageParam: 1,\n    getNextPageParam: (last, all) => last.hasMore ? all.length + 1 : null,\n  ),\n  builder: (context, state, controller) => switch (state) {\n    InfiniteInitial() || InfiniteLoading() =>\n      const Center(child: CircularProgressIndicator()),\n    InfiniteFailure(:final error) => ErrorWidget('$error'),\n    InfiniteSuccess(:final data, :final hasNextPage, :final isFetchingNextPage) =>\n      ListView.builder(\n        itemCount: data.flatten((p) => p).length + (hasNextPage ? 1 : 0),\n        itemBuilder: (ctx, i) {\n          final items = data.flatten((p) => p);\n          if (i == items.length) {\n            if (!isFetchingNextPage) controller.fetchNextPage();\n            return const Padding(\n              padding: EdgeInsets.all(16),\n              child: Center(child: CircularProgressIndicator()),\n            );\n          }\n          return PostCard(items[i]);\n        },\n      ),\n  },\n)\n","posts_screen.dart","dart","",[351,380,381,410,433,466,480,494,543,551,581,601,624,665,700,713,758,774,801,821,846,860,885,905,913,919,933,941,949,957],{"__ignoreMap":378},[382,383,386,389,393,396,398,401,404,407],"span",{"class":384,"line":385},"line",1,[382,387,118],{"class":388},"sBMFI",[382,390,392],{"class":391},"sTEyZ","\u003C",[382,394,395],{"class":388},"List",[382,397,392],{"class":391},[382,399,400],{"class":388},"Post",[382,402,403],{"class":391},">, ",[382,405,406],{"class":388},"int",[382,408,409],{"class":391},">(\n",[382,411,413,416,420,423,427,430],{"class":384,"line":412},2,[382,414,415],{"class":391},"  queryKey",[382,417,419],{"class":418},"sMK4o",":",[382,421,422],{"class":391}," [",[382,424,426],{"class":425},"sfazB","'posts'",[382,428,429],{"class":391},"]",[382,431,432],{"class":418},",\n",[382,434,436,439,441,444,447,450,452,456,459,461,464],{"class":384,"line":435},3,[382,437,438],{"class":391},"  fetcher",[382,440,419],{"class":418},[382,442,443],{"class":391}," (page) ",[382,445,446],{"class":418},"=>",[382,448,449],{"class":391}," api",[382,451,362],{"class":418},[382,453,455],{"class":454},"s2Zo4","getPosts",[382,457,458],{"class":391},"(page",[382,460,419],{"class":418},[382,462,463],{"class":391}," page)",[382,465,432],{"class":418},[382,467,469,472,474,477],{"class":384,"line":468},4,[382,470,471],{"class":391},"  options",[382,473,419],{"class":418},[382,475,476],{"class":388}," InfiniteQueryOptions",[382,478,479],{"class":391},"(\n",[382,481,483,486,488,492],{"class":384,"line":482},5,[382,484,485],{"class":391},"    initialPageParam",[382,487,419],{"class":418},[382,489,491],{"class":490},"sbssI"," 1",[382,493,432],{"class":418},[382,495,497,500,502,505,508,511,513,516,518,521,524,527,529,532,535,537,540],{"class":384,"line":496},6,[382,498,499],{"class":391},"    getNextPageParam",[382,501,419],{"class":418},[382,503,504],{"class":391}," (last",[382,506,507],{"class":418},",",[382,509,510],{"class":391}," all) ",[382,512,446],{"class":418},[382,514,515],{"class":391}," last",[382,517,362],{"class":418},[382,519,520],{"class":391},"hasMore ",[382,522,523],{"class":418},"?",[382,525,526],{"class":391}," all",[382,528,362],{"class":418},[382,530,531],{"class":391},"length ",[382,533,534],{"class":418},"+",[382,536,491],{"class":490},[382,538,539],{"class":418}," :",[382,541,542],{"class":418}," null,\n",[382,544,546,549],{"class":384,"line":545},7,[382,547,548],{"class":391},"  )",[382,550,432],{"class":418},[382,552,554,557,559,562,564,567,569,572,574,578],{"class":384,"line":553},8,[382,555,556],{"class":391},"  builder",[382,558,419],{"class":418},[382,560,561],{"class":391}," (context",[382,563,507],{"class":418},[382,565,566],{"class":391}," state",[382,568,507],{"class":418},[382,570,571],{"class":391}," controller) ",[382,573,446],{"class":418},[382,575,577],{"class":576},"s7zQu"," switch",[382,579,580],{"class":391}," (state) {\n",[382,582,584,587,590,593,596,598],{"class":384,"line":583},9,[382,585,586],{"class":388},"    InfiniteInitial",[382,588,589],{"class":391},"() ",[382,591,592],{"class":418},"||",[382,594,595],{"class":388}," InfiniteLoading",[382,597,589],{"class":391},[382,599,600],{"class":418},"=>\n",[382,602,604,608,611,614,616,619,622],{"class":384,"line":603},10,[382,605,607],{"class":606},"spNyl","      const",[382,609,610],{"class":388}," Center",[382,612,613],{"class":391},"(child",[382,615,419],{"class":418},[382,617,618],{"class":388}," CircularProgressIndicator",[382,620,621],{"class":391},"())",[382,623,432],{"class":418},[382,625,627,630,633,635,638,641,643,646,648,651,654,658,660,663],{"class":384,"line":626},11,[382,628,629],{"class":388},"    InfiniteFailure",[382,631,632],{"class":391},"(",[382,634,419],{"class":418},[382,636,637],{"class":606},"final",[382,639,640],{"class":391}," error) ",[382,642,446],{"class":418},[382,644,645],{"class":388}," ErrorWidget",[382,647,632],{"class":391},[382,649,650],{"class":425},"'",[382,652,653],{"class":391},"$",[382,655,657],{"class":656},"sHdIc","error",[382,659,650],{"class":425},[382,661,662],{"class":391},")",[382,664,432],{"class":418},[382,666,668,671,673,675,677,680,682,684,686,689,691,693,695,698],{"class":384,"line":667},12,[382,669,670],{"class":388},"    InfiniteSuccess",[382,672,632],{"class":391},[382,674,419],{"class":418},[382,676,637],{"class":606},[382,678,679],{"class":391}," data",[382,681,507],{"class":418},[382,683,539],{"class":418},[382,685,637],{"class":606},[382,687,688],{"class":391}," hasNextPage",[382,690,507],{"class":418},[382,692,539],{"class":418},[382,694,637],{"class":606},[382,696,697],{"class":391}," isFetchingNextPage) ",[382,699,600],{"class":418},[382,701,703,706,708,711],{"class":384,"line":702},13,[382,704,705],{"class":388},"      ListView",[382,707,362],{"class":418},[382,709,710],{"class":454},"builder",[382,712,479],{"class":391},[382,714,716,719,721,723,725,728,731,733,736,738,740,742,745,747,749,751,754,756],{"class":384,"line":715},14,[382,717,718],{"class":391},"        itemCount",[382,720,419],{"class":418},[382,722,679],{"class":391},[382,724,362],{"class":418},[382,726,727],{"class":454},"flatten",[382,729,730],{"class":391},"((p) ",[382,732,446],{"class":418},[382,734,735],{"class":391}," p)",[382,737,362],{"class":418},[382,739,531],{"class":391},[382,741,534],{"class":418},[382,743,744],{"class":391}," (hasNextPage ",[382,746,523],{"class":418},[382,748,491],{"class":490},[382,750,539],{"class":418},[382,752,753],{"class":490}," 0",[382,755,662],{"class":391},[382,757,432],{"class":418},[382,759,761,764,766,769,771],{"class":384,"line":760},15,[382,762,763],{"class":391},"        itemBuilder",[382,765,419],{"class":418},[382,767,768],{"class":391}," (ctx",[382,770,507],{"class":418},[382,772,773],{"class":391}," i) {\n",[382,775,777,780,783,786,788,790,792,794,796,798],{"class":384,"line":776},16,[382,778,779],{"class":606},"          final",[382,781,782],{"class":391}," items ",[382,784,785],{"class":418},"=",[382,787,679],{"class":391},[382,789,362],{"class":418},[382,791,727],{"class":454},[382,793,730],{"class":391},[382,795,446],{"class":418},[382,797,735],{"class":391},[382,799,800],{"class":418},";\n",[382,802,804,807,810,813,816,818],{"class":384,"line":803},17,[382,805,806],{"class":576},"          if",[382,808,809],{"class":391}," (i ",[382,811,812],{"class":418},"==",[382,814,815],{"class":391}," items",[382,817,362],{"class":418},[382,819,820],{"class":391},"length) {\n",[382,822,824,827,830,833,836,838,841,844],{"class":384,"line":823},18,[382,825,826],{"class":576},"            if",[382,828,829],{"class":391}," (",[382,831,832],{"class":418},"!",[382,834,835],{"class":391},"isFetchingNextPage) controller",[382,837,362],{"class":418},[382,839,840],{"class":454},"fetchNextPage",[382,842,843],{"class":391},"()",[382,845,800],{"class":418},[382,847,849,852,855,858],{"class":384,"line":848},19,[382,850,851],{"class":576},"            return",[382,853,854],{"class":606}," const",[382,856,857],{"class":388}," Padding",[382,859,479],{"class":391},[382,861,863,866,868,871,873,876,878,881,883],{"class":384,"line":862},20,[382,864,865],{"class":391},"              padding",[382,867,419],{"class":418},[382,869,870],{"class":388}," EdgeInsets",[382,872,362],{"class":418},[382,874,875],{"class":454},"all",[382,877,632],{"class":391},[382,879,880],{"class":490},"16",[382,882,662],{"class":391},[382,884,432],{"class":418},[382,886,888,891,893,895,897,899,901,903],{"class":384,"line":887},21,[382,889,890],{"class":391},"              child",[382,892,419],{"class":418},[382,894,610],{"class":388},[382,896,613],{"class":391},[382,898,419],{"class":418},[382,900,618],{"class":388},[382,902,621],{"class":391},[382,904,432],{"class":418},[382,906,908,911],{"class":384,"line":907},22,[382,909,910],{"class":391},"            )",[382,912,800],{"class":418},[382,914,916],{"class":384,"line":915},23,[382,917,918],{"class":391},"          }\n",[382,920,922,925,928,931],{"class":384,"line":921},24,[382,923,924],{"class":576},"          return",[382,926,927],{"class":388}," PostCard",[382,929,930],{"class":391},"(items[i])",[382,932,800],{"class":418},[382,934,936,939],{"class":384,"line":935},25,[382,937,938],{"class":391},"        }",[382,940,432],{"class":418},[382,942,944,947],{"class":384,"line":943},26,[382,945,946],{"class":391},"      )",[382,948,432],{"class":418},[382,950,952,955],{"class":384,"line":951},27,[382,953,954],{"class":391},"  }",[382,956,432],{"class":418},[382,958,960],{"class":384,"line":959},28,[382,961,962],{"class":391},")\n",[348,964,965],{},"The builder receives three arguments:",[967,968,969,982,994],"ol",{},[970,971,972,978,979],"li",{},[973,974,975],"strong",{},[351,976,977],{},"context",": the ",[351,980,981],{},"BuildContext",[970,983,984,989,990,993],{},[973,985,986],{},[351,987,988],{},"state",": the current ",[351,991,992],{},"InfiniteQueryState\u003CTData, TPageParam>"," (what you have)",[970,995,996,1001,1002,1004,1005,1007,1008,1011,1012],{},[973,997,998],{},[351,999,1000],{},"controller",": an ",[351,1003,357],{}," exposing ",[351,1006,840],{},", ",[351,1009,1010],{},"fetchPreviousPage",", and ",[351,1013,1014],{},"refetch",[364,1016],{},[367,1018,1020],{"id":1019},"props","Props",[1022,1023,1024,1043],"table",{},[1025,1026,1027],"thead",{},[1028,1029,1030,1034,1037,1040],"tr",{},[1031,1032,1033],"th",{},"Prop",[1031,1035,1036],{},"Type",[1031,1038,1039],{},"Default",[1031,1041,1042],{},"Description",[1044,1045,1046,1070,1087,1119,1135,1158],"tbody",{},[1028,1047,1048,1054,1064,1067],{},[1049,1050,1051],"td",{},[351,1052,1053],{},"queryKey",[1049,1055,1056,829,1059,1061,1062,662],{},[351,1057,1058],{},"Object",[351,1060,395],{}," or ",[351,1063,207],{},[1049,1065,1066],{},"required",[1049,1068,1069],{},"Cache key. Changing it disposes the current observer and starts fresh from page 1.",[1028,1071,1072,1077,1082,1084],{},[1049,1073,1074],{},[351,1075,1076],{},"fetcher",[1049,1078,1079],{},[351,1080,1081],{},"Future\u003CTData> Function(TPageParam pageParam)",[1049,1083,1066],{},[1049,1085,1086],{},"Async function that fetches a single page for the given param. Must throw on failure.",[1028,1088,1089,1094,1099,1101],{},[1049,1090,1091],{},[351,1092,1093],{},"options",[1049,1095,1096],{},[351,1097,1098],{},"InfiniteQueryOptions\u003CTData, TPageParam>",[1049,1100,1066],{},[1049,1102,1103,1104,1007,1107,1007,1110,1007,1113,1007,1116,362],{},"Pagination config: ",[351,1105,1106],{},"initialPageParam",[351,1108,1109],{},"getNextPageParam",[351,1111,1112],{},"getPreviousPageParam",[351,1114,1115],{},"maxPages",[351,1117,1118],{},"baseOptions",[1028,1120,1121,1125,1130,1132],{},[1049,1122,1123],{},[351,1124,710],{},[1049,1126,1127],{},[351,1128,1129],{},"Widget Function(BuildContext, InfiniteQueryState\u003CTData, TPageParam>, InfiniteQueryController\u003CTData, TPageParam>)",[1049,1131,1066],{},[1049,1133,1134],{},"Builds the widget tree from the current state and pagination controller.",[1028,1136,1137,1142,1147,1152],{},[1049,1138,1139],{},[351,1140,1141],{},"client",[1049,1143,1144],{},[351,1145,1146],{},"QoraClient?",[1049,1148,1149],{},[351,1150,1151],{},"null",[1049,1153,1154,1155,1157],{},"Override the client from ",[351,1156,103],{},". Useful for testing or nested scopes.",[1028,1159,1160,1165,1170,1175],{},[1049,1161,1162],{},[351,1163,1164],{},"enabled",[1049,1166,1167],{},[351,1168,1169],{},"bool",[1049,1171,1172],{},[351,1173,1174],{},"true",[1049,1176,1177,1178,1181],{},"When ",[351,1179,1180],{},"false",", the first-page fetch is not triggered on mount. The widget still observes the cached state.",[364,1183],{},[367,1185,1187],{"id":1186},"how-it-works","How It Works",[348,1189,1190,1191,419],{},"On mount, ",[351,1192,118],{},[967,1194,1195,1211,1218],{},[970,1196,1197,1198,1201,1202,1204,1205,1207,1208,1210],{},"Creates an ",[351,1199,1200],{},"InfiniteQueryObserver"," backed by the ",[351,1203,202],{}," from the nearest ",[351,1206,103],{}," (or the overridden ",[351,1209,1141],{},").",[970,1212,1213,1214,1217],{},"Subscribes to the observer's stream: emitting every ",[351,1215,1216],{},"InfiniteQueryState"," transition.",[970,1219,1220,1221,1224,1225,1227,1228,1210],{},"Calls ",[351,1222,1223],{},"observer.fetch()"," to load the first page (unless ",[351,1226,1164],{}," is ",[351,1229,1180],{},[348,1231,1232,1233,1236,1237,1240,1241,1244],{},"When the query is ",[973,1234,1235],{},"externally invalidated"," (via ",[351,1238,1239],{},"client.invalidateInfiniteQuery(key)","), the state resets to ",[351,1242,1243],{},"InfiniteInitial",". The builder detects this and automatically re-fetches the first page, so the UI never stays blank waiting for a manual action.",[348,1246,1177,1247,1249,1250,362],{},[351,1248,1053],{}," changes, the current observer is disposed and a new one is created, starting fresh from ",[351,1251,1106],{},[364,1253],{},[367,1255,1257],{"id":1256},"patterns","Patterns",[1259,1260,1262],"h3",{"id":1261},"pull-to-refresh","Pull-to-Refresh",[348,1264,1265,1266,1268,1269,1272,1273,419],{},"Wrap the scroll view in a ",[351,1267,361],{}," and pass ",[351,1270,1271],{},"controller.refetch"," directly to ",[351,1274,1275],{},"onRefresh",[372,1277,1279],{"className":374,"code":1278,"filename":376,"language":377,"meta":378,"style":378},"InfiniteQueryBuilder\u003CList\u003CPost>, int>(\n  queryKey: ['posts'],\n  fetcher: (page) => api.getPosts(page: page),\n  options: InfiniteQueryOptions(\n    initialPageParam: 1,\n    getNextPageParam: (last, all) => last.hasMore ? all.length + 1 : null,\n  ),\n  builder: (context, state, controller) {\n    final items = state is InfiniteSuccess\u003CList\u003CPost>, int>\n        ? state.data.flatten((p) => p)\n        : \u003CPost>[];\n    return RefreshIndicator(\n      onRefresh: controller.refetch,\n      child: ListView(\n        // Always scrollable so RefreshIndicator can always be triggered.\n        physics: const AlwaysScrollableScrollPhysics(),\n        children: items.map(PostCard.new).toList(),\n      ),\n    );\n  },\n)\n",[351,1280,1281,1299,1313,1337,1347,1357,1393,1399,1416,1449,1472,1490,1500,1516,1528,1534,1550,1585,1591,1598,1604],{"__ignoreMap":378},[382,1282,1283,1285,1287,1289,1291,1293,1295,1297],{"class":384,"line":385},[382,1284,118],{"class":388},[382,1286,392],{"class":391},[382,1288,395],{"class":388},[382,1290,392],{"class":391},[382,1292,400],{"class":388},[382,1294,403],{"class":391},[382,1296,406],{"class":388},[382,1298,409],{"class":391},[382,1300,1301,1303,1305,1307,1309,1311],{"class":384,"line":412},[382,1302,415],{"class":391},[382,1304,419],{"class":418},[382,1306,422],{"class":391},[382,1308,426],{"class":425},[382,1310,429],{"class":391},[382,1312,432],{"class":418},[382,1314,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335],{"class":384,"line":435},[382,1316,438],{"class":391},[382,1318,419],{"class":418},[382,1320,443],{"class":391},[382,1322,446],{"class":418},[382,1324,449],{"class":391},[382,1326,362],{"class":418},[382,1328,455],{"class":454},[382,1330,458],{"class":391},[382,1332,419],{"class":418},[382,1334,463],{"class":391},[382,1336,432],{"class":418},[382,1338,1339,1341,1343,1345],{"class":384,"line":468},[382,1340,471],{"class":391},[382,1342,419],{"class":418},[382,1344,476],{"class":388},[382,1346,479],{"class":391},[382,1348,1349,1351,1353,1355],{"class":384,"line":482},[382,1350,485],{"class":391},[382,1352,419],{"class":418},[382,1354,491],{"class":490},[382,1356,432],{"class":418},[382,1358,1359,1361,1363,1365,1367,1369,1371,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391],{"class":384,"line":496},[382,1360,499],{"class":391},[382,1362,419],{"class":418},[382,1364,504],{"class":391},[382,1366,507],{"class":418},[382,1368,510],{"class":391},[382,1370,446],{"class":418},[382,1372,515],{"class":391},[382,1374,362],{"class":418},[382,1376,520],{"class":391},[382,1378,523],{"class":418},[382,1380,526],{"class":391},[382,1382,362],{"class":418},[382,1384,531],{"class":391},[382,1386,534],{"class":418},[382,1388,491],{"class":490},[382,1390,539],{"class":418},[382,1392,542],{"class":418},[382,1394,1395,1397],{"class":384,"line":545},[382,1396,548],{"class":391},[382,1398,432],{"class":418},[382,1400,1401,1403,1405,1407,1409,1411,1413],{"class":384,"line":553},[382,1402,556],{"class":391},[382,1404,419],{"class":418},[382,1406,561],{"class":391},[382,1408,507],{"class":418},[382,1410,566],{"class":391},[382,1412,507],{"class":418},[382,1414,1415],{"class":391}," controller) {\n",[382,1417,1418,1421,1423,1425,1428,1431,1434,1436,1438,1440,1442,1444,1446],{"class":384,"line":583},[382,1419,1420],{"class":606},"    final",[382,1422,782],{"class":391},[382,1424,785],{"class":418},[382,1426,1427],{"class":391}," state ",[382,1429,1430],{"class":418},"is",[382,1432,1433],{"class":388}," InfiniteSuccess",[382,1435,392],{"class":391},[382,1437,395],{"class":388},[382,1439,392],{"class":391},[382,1441,400],{"class":388},[382,1443,403],{"class":391},[382,1445,406],{"class":388},[382,1447,1448],{"class":391},">\n",[382,1450,1451,1454,1456,1458,1461,1463,1465,1467,1469],{"class":384,"line":603},[382,1452,1453],{"class":418},"        ?",[382,1455,566],{"class":391},[382,1457,362],{"class":418},[382,1459,1460],{"class":391},"data",[382,1462,362],{"class":418},[382,1464,727],{"class":454},[382,1466,730],{"class":391},[382,1468,446],{"class":418},[382,1470,1471],{"class":391}," p)\n",[382,1473,1474,1477,1480,1482,1485,1488],{"class":384,"line":626},[382,1475,1476],{"class":418},"        :",[382,1478,1479],{"class":418}," \u003C",[382,1481,400],{"class":388},[382,1483,1484],{"class":418},">",[382,1486,1487],{"class":391},"[]",[382,1489,800],{"class":418},[382,1491,1492,1495,1498],{"class":384,"line":667},[382,1493,1494],{"class":576},"    return",[382,1496,1497],{"class":388}," RefreshIndicator",[382,1499,479],{"class":391},[382,1501,1502,1505,1507,1510,1512,1514],{"class":384,"line":702},[382,1503,1504],{"class":391},"      onRefresh",[382,1506,419],{"class":418},[382,1508,1509],{"class":391}," controller",[382,1511,362],{"class":418},[382,1513,1014],{"class":391},[382,1515,432],{"class":418},[382,1517,1518,1521,1523,1526],{"class":384,"line":715},[382,1519,1520],{"class":391},"      child",[382,1522,419],{"class":418},[382,1524,1525],{"class":388}," ListView",[382,1527,479],{"class":391},[382,1529,1530],{"class":384,"line":760},[382,1531,1533],{"class":1532},"sHwdD","        // Always scrollable so RefreshIndicator can always be triggered.\n",[382,1535,1536,1539,1541,1543,1546,1548],{"class":384,"line":776},[382,1537,1538],{"class":391},"        physics",[382,1540,419],{"class":418},[382,1542,854],{"class":606},[382,1544,1545],{"class":388}," AlwaysScrollableScrollPhysics",[382,1547,843],{"class":391},[382,1549,432],{"class":418},[382,1551,1552,1555,1557,1559,1561,1564,1566,1569,1571,1574,1576,1578,1581,1583],{"class":384,"line":803},[382,1553,1554],{"class":391},"        children",[382,1556,419],{"class":418},[382,1558,815],{"class":391},[382,1560,362],{"class":418},[382,1562,1563],{"class":454},"map",[382,1565,632],{"class":391},[382,1567,1568],{"class":388},"PostCard",[382,1570,362],{"class":418},[382,1572,1573],{"class":576},"new",[382,1575,662],{"class":391},[382,1577,362],{"class":418},[382,1579,1580],{"class":454},"toList",[382,1582,843],{"class":391},[382,1584,432],{"class":418},[382,1586,1587,1589],{"class":384,"line":823},[382,1588,946],{"class":391},[382,1590,432],{"class":418},[382,1592,1593,1596],{"class":384,"line":848},[382,1594,1595],{"class":391},"    )",[382,1597,800],{"class":418},[382,1599,1600,1602],{"class":384,"line":862},[382,1601,954],{"class":391},[382,1603,432],{"class":418},[382,1605,1606],{"class":384,"line":887},[382,1607,962],{"class":391},[348,1609,1610,1613],{},[351,1611,1612],{},"refetch()"," re-fetches all currently loaded pages in sequence, preserving the page count. Existing data stays visible while pages reload.",[364,1615],{},[1259,1617,1619],{"id":1618},"bi-directional-scroll","Bi-directional Scroll",[348,1621,1622,1623,1625,1626,1629],{},"Chat feeds and timelines often load in both directions. Provide ",[351,1624,1112],{}," and call ",[351,1627,1628],{},"controller.fetchPreviousPage()"," when the user scrolls to the top:",[372,1631,1634],{"className":374,"code":1632,"filename":1633,"language":377,"meta":378,"style":378},"InfiniteQueryBuilder\u003CList\u003CMessage>, String?>(\n  queryKey: ['chat', roomId],\n  fetcher: (cursor) => api.getMessages(roomId, cursor: cursor),\n  options: InfiniteQueryOptions(\n    initialPageParam: null,         // Start from the latest message\n    getNextPageParam: (last, all) => last.olderCursor,\n    getPreviousPageParam: (first, all) => first.newerCursor,\n  ),\n  builder: (context, state, controller) => switch (state) {\n    InfiniteInitial() || InfiniteLoading() =>\n      const Center(child: CircularProgressIndicator()),\n    InfiniteFailure(:final error) => ErrorWidget('$error'),\n    InfiniteSuccess(\n      :final data,\n      :final hasPreviousPage,\n      :final hasNextPage,\n      :final isFetchingPreviousPage,\n      :final isFetchingNextPage,\n    ) =>\n      NotificationListener\u003CScrollNotification>(\n        onNotification: (n) {\n          if (n is ScrollStartNotification) {\n            if (n.metrics.pixels \u003C= 0 && hasPreviousPage && !isFetchingPreviousPage) {\n              controller.fetchPreviousPage(); // Newer messages\n            } else if (n.metrics.atEdge && n.metrics.pixels > 0 &&\n                hasNextPage && !isFetchingNextPage) {\n              controller.fetchNextPage(); // Older messages\n            }\n          }\n          return false;\n        },\n        child: ListView.builder(\n          reverse: true,\n          itemCount: data.flatten((p) => p).length,\n          itemBuilder: (ctx, i) => MessageBubble(data.flatten((p) => p)[i]),\n        ),\n      ),\n  },\n)\n","chat_screen.dart",[351,1635,1636,1657,1675,1708,1718,1730,1753,1779,1785,1807,1821,1837,1867,1873,1884,1895,1905,1916,1927,1934,1946,1956,1971,2008,2025,2067,2079,2094,2099,2104,2112,2119,2135,2146,2173,2209,2217,2224,2231],{"__ignoreMap":378},[382,1637,1638,1640,1642,1644,1646,1649,1651,1654],{"class":384,"line":385},[382,1639,118],{"class":388},[382,1641,392],{"class":391},[382,1643,395],{"class":388},[382,1645,392],{"class":391},[382,1647,1648],{"class":388},"Message",[382,1650,403],{"class":391},[382,1652,1653],{"class":388},"String",[382,1655,1656],{"class":391},"?>(\n",[382,1658,1659,1661,1663,1665,1668,1670,1673],{"class":384,"line":412},[382,1660,415],{"class":391},[382,1662,419],{"class":418},[382,1664,422],{"class":391},[382,1666,1667],{"class":425},"'chat'",[382,1669,507],{"class":418},[382,1671,1672],{"class":391}," roomId]",[382,1674,432],{"class":418},[382,1676,1677,1679,1681,1684,1686,1688,1690,1693,1696,1698,1701,1703,1706],{"class":384,"line":435},[382,1678,438],{"class":391},[382,1680,419],{"class":418},[382,1682,1683],{"class":391}," (cursor) ",[382,1685,446],{"class":418},[382,1687,449],{"class":391},[382,1689,362],{"class":418},[382,1691,1692],{"class":454},"getMessages",[382,1694,1695],{"class":391},"(roomId",[382,1697,507],{"class":418},[382,1699,1700],{"class":391}," cursor",[382,1702,419],{"class":418},[382,1704,1705],{"class":391}," cursor)",[382,1707,432],{"class":418},[382,1709,1710,1712,1714,1716],{"class":384,"line":468},[382,1711,471],{"class":391},[382,1713,419],{"class":418},[382,1715,476],{"class":388},[382,1717,479],{"class":391},[382,1719,1720,1722,1724,1727],{"class":384,"line":482},[382,1721,485],{"class":391},[382,1723,419],{"class":418},[382,1725,1726],{"class":418}," null,",[382,1728,1729],{"class":1532},"         // Start from the latest message\n",[382,1731,1732,1734,1736,1738,1740,1742,1744,1746,1748,1751],{"class":384,"line":496},[382,1733,499],{"class":391},[382,1735,419],{"class":418},[382,1737,504],{"class":391},[382,1739,507],{"class":418},[382,1741,510],{"class":391},[382,1743,446],{"class":418},[382,1745,515],{"class":391},[382,1747,362],{"class":418},[382,1749,1750],{"class":391},"olderCursor",[382,1752,432],{"class":418},[382,1754,1755,1758,1760,1763,1765,1767,1769,1772,1774,1777],{"class":384,"line":545},[382,1756,1757],{"class":391},"    getPreviousPageParam",[382,1759,419],{"class":418},[382,1761,1762],{"class":391}," (first",[382,1764,507],{"class":418},[382,1766,510],{"class":391},[382,1768,446],{"class":418},[382,1770,1771],{"class":391}," first",[382,1773,362],{"class":418},[382,1775,1776],{"class":391},"newerCursor",[382,1778,432],{"class":418},[382,1780,1781,1783],{"class":384,"line":553},[382,1782,548],{"class":391},[382,1784,432],{"class":418},[382,1786,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805],{"class":384,"line":583},[382,1788,556],{"class":391},[382,1790,419],{"class":418},[382,1792,561],{"class":391},[382,1794,507],{"class":418},[382,1796,566],{"class":391},[382,1798,507],{"class":418},[382,1800,571],{"class":391},[382,1802,446],{"class":418},[382,1804,577],{"class":576},[382,1806,580],{"class":391},[382,1808,1809,1811,1813,1815,1817,1819],{"class":384,"line":603},[382,1810,586],{"class":388},[382,1812,589],{"class":391},[382,1814,592],{"class":418},[382,1816,595],{"class":388},[382,1818,589],{"class":391},[382,1820,600],{"class":418},[382,1822,1823,1825,1827,1829,1831,1833,1835],{"class":384,"line":626},[382,1824,607],{"class":606},[382,1826,610],{"class":388},[382,1828,613],{"class":391},[382,1830,419],{"class":418},[382,1832,618],{"class":388},[382,1834,621],{"class":391},[382,1836,432],{"class":418},[382,1838,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865],{"class":384,"line":667},[382,1840,629],{"class":388},[382,1842,632],{"class":391},[382,1844,419],{"class":418},[382,1846,637],{"class":606},[382,1848,640],{"class":391},[382,1850,446],{"class":418},[382,1852,645],{"class":388},[382,1854,632],{"class":391},[382,1856,650],{"class":425},[382,1858,653],{"class":391},[382,1860,657],{"class":656},[382,1862,650],{"class":425},[382,1864,662],{"class":391},[382,1866,432],{"class":418},[382,1868,1869,1871],{"class":384,"line":702},[382,1870,670],{"class":388},[382,1872,479],{"class":391},[382,1874,1875,1878,1880,1882],{"class":384,"line":715},[382,1876,1877],{"class":418},"      :",[382,1879,637],{"class":606},[382,1881,679],{"class":391},[382,1883,432],{"class":418},[382,1885,1886,1888,1890,1893],{"class":384,"line":760},[382,1887,1877],{"class":418},[382,1889,637],{"class":606},[382,1891,1892],{"class":391}," hasPreviousPage",[382,1894,432],{"class":418},[382,1896,1897,1899,1901,1903],{"class":384,"line":776},[382,1898,1877],{"class":418},[382,1900,637],{"class":606},[382,1902,688],{"class":391},[382,1904,432],{"class":418},[382,1906,1907,1909,1911,1914],{"class":384,"line":803},[382,1908,1877],{"class":418},[382,1910,637],{"class":606},[382,1912,1913],{"class":391}," isFetchingPreviousPage",[382,1915,432],{"class":418},[382,1917,1918,1920,1922,1925],{"class":384,"line":823},[382,1919,1877],{"class":418},[382,1921,637],{"class":606},[382,1923,1924],{"class":391}," isFetchingNextPage",[382,1926,432],{"class":418},[382,1928,1929,1932],{"class":384,"line":848},[382,1930,1931],{"class":391},"    ) ",[382,1933,600],{"class":418},[382,1935,1936,1939,1941,1944],{"class":384,"line":862},[382,1937,1938],{"class":388},"      NotificationListener",[382,1940,392],{"class":391},[382,1942,1943],{"class":388},"ScrollNotification",[382,1945,409],{"class":391},[382,1947,1948,1951,1953],{"class":384,"line":887},[382,1949,1950],{"class":391},"        onNotification",[382,1952,419],{"class":418},[382,1954,1955],{"class":391}," (n) {\n",[382,1957,1958,1960,1963,1965,1968],{"class":384,"line":907},[382,1959,806],{"class":576},[382,1961,1962],{"class":391}," (n ",[382,1964,1430],{"class":418},[382,1966,1967],{"class":388}," ScrollStartNotification",[382,1969,1970],{"class":391},") {\n",[382,1972,1973,1975,1978,1980,1983,1985,1988,1991,1993,1996,1999,2002,2005],{"class":384,"line":915},[382,1974,826],{"class":576},[382,1976,1977],{"class":391}," (n",[382,1979,362],{"class":418},[382,1981,1982],{"class":391},"metrics",[382,1984,362],{"class":418},[382,1986,1987],{"class":391},"pixels ",[382,1989,1990],{"class":418},"\u003C=",[382,1992,753],{"class":490},[382,1994,1995],{"class":418}," &&",[382,1997,1998],{"class":391}," hasPreviousPage ",[382,2000,2001],{"class":418},"&&",[382,2003,2004],{"class":418}," !",[382,2006,2007],{"class":391},"isFetchingPreviousPage) {\n",[382,2009,2010,2013,2015,2017,2019,2022],{"class":384,"line":921},[382,2011,2012],{"class":391},"              controller",[382,2014,362],{"class":418},[382,2016,1010],{"class":454},[382,2018,843],{"class":391},[382,2020,2021],{"class":418},";",[382,2023,2024],{"class":1532}," // Newer messages\n",[382,2026,2027,2030,2033,2036,2038,2040,2042,2044,2047,2049,2052,2054,2056,2058,2060,2062,2064],{"class":384,"line":935},[382,2028,2029],{"class":391},"            } ",[382,2031,2032],{"class":576},"else",[382,2034,2035],{"class":576}," if",[382,2037,1977],{"class":391},[382,2039,362],{"class":418},[382,2041,1982],{"class":391},[382,2043,362],{"class":418},[382,2045,2046],{"class":391},"atEdge ",[382,2048,2001],{"class":418},[382,2050,2051],{"class":391}," n",[382,2053,362],{"class":418},[382,2055,1982],{"class":391},[382,2057,362],{"class":418},[382,2059,1987],{"class":391},[382,2061,1484],{"class":418},[382,2063,753],{"class":490},[382,2065,2066],{"class":418}," &&\n",[382,2068,2069,2072,2074,2076],{"class":384,"line":943},[382,2070,2071],{"class":391},"                hasNextPage ",[382,2073,2001],{"class":418},[382,2075,2004],{"class":418},[382,2077,2078],{"class":391},"isFetchingNextPage) {\n",[382,2080,2081,2083,2085,2087,2089,2091],{"class":384,"line":951},[382,2082,2012],{"class":391},[382,2084,362],{"class":418},[382,2086,840],{"class":454},[382,2088,843],{"class":391},[382,2090,2021],{"class":418},[382,2092,2093],{"class":1532}," // Older messages\n",[382,2095,2096],{"class":384,"line":959},[382,2097,2098],{"class":391},"            }\n",[382,2100,2102],{"class":384,"line":2101},29,[382,2103,918],{"class":391},[382,2105,2107,2109],{"class":384,"line":2106},30,[382,2108,924],{"class":576},[382,2110,2111],{"class":418}," false;\n",[382,2113,2115,2117],{"class":384,"line":2114},31,[382,2116,938],{"class":391},[382,2118,432],{"class":418},[382,2120,2122,2125,2127,2129,2131,2133],{"class":384,"line":2121},32,[382,2123,2124],{"class":391},"        child",[382,2126,419],{"class":418},[382,2128,1525],{"class":388},[382,2130,362],{"class":418},[382,2132,710],{"class":454},[382,2134,479],{"class":391},[382,2136,2138,2141,2143],{"class":384,"line":2137},33,[382,2139,2140],{"class":391},"          reverse",[382,2142,419],{"class":418},[382,2144,2145],{"class":418}," true,\n",[382,2147,2149,2152,2154,2156,2158,2160,2162,2164,2166,2168,2171],{"class":384,"line":2148},34,[382,2150,2151],{"class":391},"          itemCount",[382,2153,419],{"class":418},[382,2155,679],{"class":391},[382,2157,362],{"class":418},[382,2159,727],{"class":454},[382,2161,730],{"class":391},[382,2163,446],{"class":418},[382,2165,735],{"class":391},[382,2167,362],{"class":418},[382,2169,2170],{"class":391},"length",[382,2172,432],{"class":418},[382,2174,2176,2179,2181,2183,2185,2188,2190,2193,2196,2198,2200,2202,2204,2207],{"class":384,"line":2175},35,[382,2177,2178],{"class":391},"          itemBuilder",[382,2180,419],{"class":418},[382,2182,768],{"class":391},[382,2184,507],{"class":418},[382,2186,2187],{"class":391}," i) ",[382,2189,446],{"class":418},[382,2191,2192],{"class":388}," MessageBubble",[382,2194,2195],{"class":391},"(data",[382,2197,362],{"class":418},[382,2199,727],{"class":454},[382,2201,730],{"class":391},[382,2203,446],{"class":418},[382,2205,2206],{"class":391}," p)[i])",[382,2208,432],{"class":418},[382,2210,2212,2215],{"class":384,"line":2211},36,[382,2213,2214],{"class":391},"        )",[382,2216,432],{"class":418},[382,2218,2220,2222],{"class":384,"line":2219},37,[382,2221,946],{"class":391},[382,2223,432],{"class":418},[382,2225,2227,2229],{"class":384,"line":2226},38,[382,2228,954],{"class":391},[382,2230,432],{"class":418},[382,2232,2234],{"class":384,"line":2233},39,[382,2235,962],{"class":391},[364,2237],{},[1259,2239,2241],{"id":2240},"windowed-paging-display","Windowed Paging Display",[348,2243,1177,2244,2246,2247,2250,2251,2253],{},[351,2245,1115],{}," is set, ",[351,2248,2249],{},"InfiniteSuccess.hasPreviousPage"," becomes ",[351,2252,1174],{}," once the window has slid past the first page. Show a \"scroll up to load earlier\" indicator:",[372,2255,2258],{"className":374,"code":2256,"filename":2257,"language":377,"meta":378,"style":378},"InfiniteQueryBuilder\u003CList\u003CPost>, int>(\n  queryKey: ['feed'],\n  fetcher: (page) => api.getFeed(page: page),\n  options: InfiniteQueryOptions(\n    initialPageParam: 1,\n    getNextPageParam: (last, all) => last.hasMore ? all.length + 1 : null,\n    maxPages: 10,\n  ),\n  builder: (context, state, controller) {\n    if (state is! InfiniteSuccess\u003CList\u003CPost>, int>) {\n      return const Center(child: CircularProgressIndicator());\n    }\n    final items = state.data.flatten((p) => p);\n    return CustomScrollView(\n      slivers: [\n        if (state.hasPreviousPage)\n          SliverToBoxAdapter(\n            child: TextButton(\n              onPressed: state.isFetchingPreviousPage\n                  ? null\n                  : controller.fetchPreviousPage,\n              child: const Text('Load earlier posts'),\n            ),\n          ),\n        SliverList.builder(\n          itemCount: items.length,\n          itemBuilder: (ctx, i) => PostCard(items[i]),\n        ),\n        if (state.hasNextPage)\n          SliverToBoxAdapter(\n            child: state.isFetchingNextPage\n                ? const Center(child: CircularProgressIndicator())\n                : TextButton(\n                    onPressed: controller.fetchNextPage,\n                    child: const Text('Load more'),\n                  ),\n          ),\n      ],\n    );\n  },\n)\n","feed_screen.dart",[351,2259,2260,2278,2293,2318,2328,2338,2374,2386,2392,2408,2436,2455,2460,2486,2495,2505,2518,2525,2537,2551,2559,2572,2592,2598,2605,2616,2630,2650,2656,2667,2673,2686,2704,2713,2728,2748,2755,2761,2768,2774,2781],{"__ignoreMap":378},[382,2261,2262,2264,2266,2268,2270,2272,2274,2276],{"class":384,"line":385},[382,2263,118],{"class":388},[382,2265,392],{"class":391},[382,2267,395],{"class":388},[382,2269,392],{"class":391},[382,2271,400],{"class":388},[382,2273,403],{"class":391},[382,2275,406],{"class":388},[382,2277,409],{"class":391},[382,2279,2280,2282,2284,2286,2289,2291],{"class":384,"line":412},[382,2281,415],{"class":391},[382,2283,419],{"class":418},[382,2285,422],{"class":391},[382,2287,2288],{"class":425},"'feed'",[382,2290,429],{"class":391},[382,2292,432],{"class":418},[382,2294,2295,2297,2299,2301,2303,2305,2307,2310,2312,2314,2316],{"class":384,"line":435},[382,2296,438],{"class":391},[382,2298,419],{"class":418},[382,2300,443],{"class":391},[382,2302,446],{"class":418},[382,2304,449],{"class":391},[382,2306,362],{"class":418},[382,2308,2309],{"class":454},"getFeed",[382,2311,458],{"class":391},[382,2313,419],{"class":418},[382,2315,463],{"class":391},[382,2317,432],{"class":418},[382,2319,2320,2322,2324,2326],{"class":384,"line":468},[382,2321,471],{"class":391},[382,2323,419],{"class":418},[382,2325,476],{"class":388},[382,2327,479],{"class":391},[382,2329,2330,2332,2334,2336],{"class":384,"line":482},[382,2331,485],{"class":391},[382,2333,419],{"class":418},[382,2335,491],{"class":490},[382,2337,432],{"class":418},[382,2339,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372],{"class":384,"line":496},[382,2341,499],{"class":391},[382,2343,419],{"class":418},[382,2345,504],{"class":391},[382,2347,507],{"class":418},[382,2349,510],{"class":391},[382,2351,446],{"class":418},[382,2353,515],{"class":391},[382,2355,362],{"class":418},[382,2357,520],{"class":391},[382,2359,523],{"class":418},[382,2361,526],{"class":391},[382,2363,362],{"class":418},[382,2365,531],{"class":391},[382,2367,534],{"class":418},[382,2369,491],{"class":490},[382,2371,539],{"class":418},[382,2373,542],{"class":418},[382,2375,2376,2379,2381,2384],{"class":384,"line":545},[382,2377,2378],{"class":391},"    maxPages",[382,2380,419],{"class":418},[382,2382,2383],{"class":490}," 10",[382,2385,432],{"class":418},[382,2387,2388,2390],{"class":384,"line":553},[382,2389,548],{"class":391},[382,2391,432],{"class":418},[382,2393,2394,2396,2398,2400,2402,2404,2406],{"class":384,"line":583},[382,2395,556],{"class":391},[382,2397,419],{"class":418},[382,2399,561],{"class":391},[382,2401,507],{"class":418},[382,2403,566],{"class":391},[382,2405,507],{"class":418},[382,2407,1415],{"class":391},[382,2409,2410,2413,2416,2419,2421,2423,2425,2427,2429,2431,2433],{"class":384,"line":603},[382,2411,2412],{"class":576},"    if",[382,2414,2415],{"class":391}," (state ",[382,2417,2418],{"class":418},"is!",[382,2420,1433],{"class":388},[382,2422,392],{"class":391},[382,2424,395],{"class":388},[382,2426,392],{"class":391},[382,2428,400],{"class":388},[382,2430,403],{"class":391},[382,2432,406],{"class":388},[382,2434,2435],{"class":391},">) {\n",[382,2437,2438,2441,2443,2445,2447,2449,2451,2453],{"class":384,"line":626},[382,2439,2440],{"class":576},"      return",[382,2442,854],{"class":606},[382,2444,610],{"class":388},[382,2446,613],{"class":391},[382,2448,419],{"class":418},[382,2450,618],{"class":388},[382,2452,621],{"class":391},[382,2454,800],{"class":418},[382,2456,2457],{"class":384,"line":667},[382,2458,2459],{"class":391},"    }\n",[382,2461,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484],{"class":384,"line":702},[382,2463,1420],{"class":606},[382,2465,782],{"class":391},[382,2467,785],{"class":418},[382,2469,566],{"class":391},[382,2471,362],{"class":418},[382,2473,1460],{"class":391},[382,2475,362],{"class":418},[382,2477,727],{"class":454},[382,2479,730],{"class":391},[382,2481,446],{"class":418},[382,2483,735],{"class":391},[382,2485,800],{"class":418},[382,2487,2488,2490,2493],{"class":384,"line":715},[382,2489,1494],{"class":576},[382,2491,2492],{"class":388}," CustomScrollView",[382,2494,479],{"class":391},[382,2496,2497,2500,2502],{"class":384,"line":760},[382,2498,2499],{"class":391},"      slivers",[382,2501,419],{"class":418},[382,2503,2504],{"class":391}," [\n",[382,2506,2507,2510,2513,2515],{"class":384,"line":776},[382,2508,2509],{"class":576},"        if",[382,2511,2512],{"class":391}," (state",[382,2514,362],{"class":418},[382,2516,2517],{"class":391},"hasPreviousPage)\n",[382,2519,2520,2523],{"class":384,"line":803},[382,2521,2522],{"class":388},"          SliverToBoxAdapter",[382,2524,479],{"class":391},[382,2526,2527,2530,2532,2535],{"class":384,"line":823},[382,2528,2529],{"class":391},"            child",[382,2531,419],{"class":418},[382,2533,2534],{"class":388}," TextButton",[382,2536,479],{"class":391},[382,2538,2539,2542,2544,2546,2548],{"class":384,"line":848},[382,2540,2541],{"class":391},"              onPressed",[382,2543,419],{"class":418},[382,2545,566],{"class":391},[382,2547,362],{"class":418},[382,2549,2550],{"class":391},"isFetchingPreviousPage\n",[382,2552,2553,2556],{"class":384,"line":862},[382,2554,2555],{"class":418},"                  ?",[382,2557,2558],{"class":418}," null\n",[382,2560,2561,2564,2566,2568,2570],{"class":384,"line":887},[382,2562,2563],{"class":418},"                  :",[382,2565,1509],{"class":391},[382,2567,362],{"class":418},[382,2569,1010],{"class":391},[382,2571,432],{"class":418},[382,2573,2574,2576,2578,2580,2583,2585,2588,2590],{"class":384,"line":907},[382,2575,890],{"class":391},[382,2577,419],{"class":418},[382,2579,854],{"class":606},[382,2581,2582],{"class":388}," Text",[382,2584,632],{"class":391},[382,2586,2587],{"class":425},"'Load earlier posts'",[382,2589,662],{"class":391},[382,2591,432],{"class":418},[382,2593,2594,2596],{"class":384,"line":915},[382,2595,910],{"class":391},[382,2597,432],{"class":418},[382,2599,2600,2603],{"class":384,"line":921},[382,2601,2602],{"class":391},"          )",[382,2604,432],{"class":418},[382,2606,2607,2610,2612,2614],{"class":384,"line":935},[382,2608,2609],{"class":388},"        SliverList",[382,2611,362],{"class":418},[382,2613,710],{"class":454},[382,2615,479],{"class":391},[382,2617,2618,2620,2622,2624,2626,2628],{"class":384,"line":943},[382,2619,2151],{"class":391},[382,2621,419],{"class":418},[382,2623,815],{"class":391},[382,2625,362],{"class":418},[382,2627,2170],{"class":391},[382,2629,432],{"class":418},[382,2631,2632,2634,2636,2638,2640,2642,2644,2646,2648],{"class":384,"line":951},[382,2633,2178],{"class":391},[382,2635,419],{"class":418},[382,2637,768],{"class":391},[382,2639,507],{"class":418},[382,2641,2187],{"class":391},[382,2643,446],{"class":418},[382,2645,927],{"class":388},[382,2647,930],{"class":391},[382,2649,432],{"class":418},[382,2651,2652,2654],{"class":384,"line":959},[382,2653,2214],{"class":391},[382,2655,432],{"class":418},[382,2657,2658,2660,2662,2664],{"class":384,"line":2101},[382,2659,2509],{"class":576},[382,2661,2512],{"class":391},[382,2663,362],{"class":418},[382,2665,2666],{"class":391},"hasNextPage)\n",[382,2668,2669,2671],{"class":384,"line":2106},[382,2670,2522],{"class":388},[382,2672,479],{"class":391},[382,2674,2675,2677,2679,2681,2683],{"class":384,"line":2114},[382,2676,2529],{"class":391},[382,2678,419],{"class":418},[382,2680,566],{"class":391},[382,2682,362],{"class":418},[382,2684,2685],{"class":391},"isFetchingNextPage\n",[382,2687,2688,2691,2693,2695,2697,2699,2701],{"class":384,"line":2121},[382,2689,2690],{"class":418},"                ?",[382,2692,854],{"class":606},[382,2694,610],{"class":388},[382,2696,613],{"class":391},[382,2698,419],{"class":418},[382,2700,618],{"class":388},[382,2702,2703],{"class":391},"())\n",[382,2705,2706,2709,2711],{"class":384,"line":2137},[382,2707,2708],{"class":418},"                :",[382,2710,2534],{"class":388},[382,2712,479],{"class":391},[382,2714,2715,2718,2720,2722,2724,2726],{"class":384,"line":2148},[382,2716,2717],{"class":391},"                    onPressed",[382,2719,419],{"class":418},[382,2721,1509],{"class":391},[382,2723,362],{"class":418},[382,2725,840],{"class":391},[382,2727,432],{"class":418},[382,2729,2730,2733,2735,2737,2739,2741,2744,2746],{"class":384,"line":2175},[382,2731,2732],{"class":391},"                    child",[382,2734,419],{"class":418},[382,2736,854],{"class":606},[382,2738,2582],{"class":388},[382,2740,632],{"class":391},[382,2742,2743],{"class":425},"'Load more'",[382,2745,662],{"class":391},[382,2747,432],{"class":418},[382,2749,2750,2753],{"class":384,"line":2211},[382,2751,2752],{"class":391},"                  )",[382,2754,432],{"class":418},[382,2756,2757,2759],{"class":384,"line":2219},[382,2758,2602],{"class":391},[382,2760,432],{"class":418},[382,2762,2763,2766],{"class":384,"line":2226},[382,2764,2765],{"class":391},"      ]",[382,2767,432],{"class":418},[382,2769,2770,2772],{"class":384,"line":2233},[382,2771,1595],{"class":391},[382,2773,800],{"class":418},[382,2775,2777,2779],{"class":384,"line":2776},40,[382,2778,954],{"class":391},[382,2780,432],{"class":418},[382,2782,2784],{"class":384,"line":2783},41,[382,2785,962],{"class":391},[364,2787],{},[1259,2789,2791,2792,662],{"id":2790},"conditional-queries-enabled","Conditional Queries (",[351,2793,1164],{},[348,2795,2796],{},"Delay fetching until a dependency is ready: for example, until a user session is available:",[372,2798,2801],{"className":374,"code":2799,"filename":2800,"language":377,"meta":378,"style":378},"InfiniteQueryBuilder\u003CList\u003CPost>, int>(\n  queryKey: ['feed', userId],\n  fetcher: (page) => api.getFeed(userId: userId!, page: page),\n  options: InfiniteQueryOptions(\n    initialPageParam: 1,\n    getNextPageParam: (last, all) => last.hasMore ? all.length + 1 : null,\n  ),\n  enabled: userId != null,\n  builder: (context, state, controller) { ... },\n)\n","user_feed_screen.dart",[351,2802,2803,2821,2838,2874,2884,2894,2930,2936,2951,2976],{"__ignoreMap":378},[382,2804,2805,2807,2809,2811,2813,2815,2817,2819],{"class":384,"line":385},[382,2806,118],{"class":388},[382,2808,392],{"class":391},[382,2810,395],{"class":388},[382,2812,392],{"class":391},[382,2814,400],{"class":388},[382,2816,403],{"class":391},[382,2818,406],{"class":388},[382,2820,409],{"class":391},[382,2822,2823,2825,2827,2829,2831,2833,2836],{"class":384,"line":412},[382,2824,415],{"class":391},[382,2826,419],{"class":418},[382,2828,422],{"class":391},[382,2830,2288],{"class":425},[382,2832,507],{"class":418},[382,2834,2835],{"class":391}," userId]",[382,2837,432],{"class":418},[382,2839,2840,2842,2844,2846,2848,2850,2852,2854,2857,2859,2862,2865,2868,2870,2872],{"class":384,"line":435},[382,2841,438],{"class":391},[382,2843,419],{"class":418},[382,2845,443],{"class":391},[382,2847,446],{"class":418},[382,2849,449],{"class":391},[382,2851,362],{"class":418},[382,2853,2309],{"class":454},[382,2855,2856],{"class":391},"(userId",[382,2858,419],{"class":418},[382,2860,2861],{"class":391}," userId",[382,2863,2864],{"class":418},"!,",[382,2866,2867],{"class":391}," page",[382,2869,419],{"class":418},[382,2871,463],{"class":391},[382,2873,432],{"class":418},[382,2875,2876,2878,2880,2882],{"class":384,"line":468},[382,2877,471],{"class":391},[382,2879,419],{"class":418},[382,2881,476],{"class":388},[382,2883,479],{"class":391},[382,2885,2886,2888,2890,2892],{"class":384,"line":482},[382,2887,485],{"class":391},[382,2889,419],{"class":418},[382,2891,491],{"class":490},[382,2893,432],{"class":418},[382,2895,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928],{"class":384,"line":496},[382,2897,499],{"class":391},[382,2899,419],{"class":418},[382,2901,504],{"class":391},[382,2903,507],{"class":418},[382,2905,510],{"class":391},[382,2907,446],{"class":418},[382,2909,515],{"class":391},[382,2911,362],{"class":418},[382,2913,520],{"class":391},[382,2915,523],{"class":418},[382,2917,526],{"class":391},[382,2919,362],{"class":418},[382,2921,531],{"class":391},[382,2923,534],{"class":418},[382,2925,491],{"class":490},[382,2927,539],{"class":418},[382,2929,542],{"class":418},[382,2931,2932,2934],{"class":384,"line":545},[382,2933,548],{"class":391},[382,2935,432],{"class":418},[382,2937,2938,2941,2943,2946,2949],{"class":384,"line":553},[382,2939,2940],{"class":391},"  enabled",[382,2942,419],{"class":418},[382,2944,2945],{"class":391}," userId ",[382,2947,2948],{"class":418},"!=",[382,2950,542],{"class":418},[382,2952,2953,2955,2957,2959,2961,2963,2965,2968,2971,2974],{"class":384,"line":583},[382,2954,556],{"class":391},[382,2956,419],{"class":418},[382,2958,561],{"class":391},[382,2960,507],{"class":418},[382,2962,566],{"class":391},[382,2964,507],{"class":418},[382,2966,2967],{"class":391}," controller) { ",[382,2969,2970],{"class":418},"...",[382,2972,2973],{"class":391}," }",[382,2975,432],{"class":418},[382,2977,2978],{"class":384,"line":603},[382,2979,962],{"class":391},[348,2981,1177,2982,2984,2985,2987,2988,1236,2990,2993],{},[351,2983,1164],{}," flips from ",[351,2986,1180],{}," to ",[351,2989,1174],{},[351,2991,2992],{},"setState","), the first-page fetch is triggered automatically.",[364,2995],{},[1259,2997,2999],{"id":2998},"scroll-triggered-loading","Scroll-triggered Loading",[348,3001,3002,3003,3006],{},"Use a ",[351,3004,3005],{},"ScrollController"," listener to trigger the next page as the user approaches the bottom:",[372,3008,3010],{"className":374,"code":3009,"filename":376,"language":377,"meta":378,"style":378},"class _PostsScreenState extends State\u003CPostsScreen> {\n  final _scrollController = ScrollController();\n\n  @override\n  void initState() {\n    super.initState();\n    _scrollController.addListener(_onScroll);\n  }\n\n  @override\n  void dispose() {\n    _scrollController.dispose();\n    super.dispose();\n  }\n\n  // Populated via a StateSetter or passed down through the widget tree\n  InfiniteQueryController\u003CList\u003CPost>, int>? _queryController;\n\n  void _onScroll() {\n    final position = _scrollController.position;\n    if (position.pixels >= position.maxScrollExtent - 200) {\n      _queryController?.fetchNextPage();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) => InfiniteQueryBuilder\u003CList\u003CPost>, int>(\n        queryKey: ['posts'],\n        fetcher: (page) => api.getPosts(page: page),\n        options: InfiniteQueryOptions(\n          initialPageParam: 1,\n          getNextPageParam: (last, all) => last.hasMore ? all.length + 1 : null,\n        ),\n        builder: (context, state, controller) {\n          _queryController = controller;\n          final items = state is InfiniteSuccess\u003CList\u003CPost>, int>\n              ? state.data.flatten((p) => p)\n              : \u003CPost>[];\n          return ListView.builder(\n            controller: _scrollController,\n            itemCount: items.length,\n            itemBuilder: (ctx, i) => PostCard(items[i]),\n          );\n        },\n      );\n}\n",[351,3011,3012,3034,3051,3057,3062,3073,3087,3102,3107,3111,3115,3124,3137,3149,3153,3157,3162,3188,3192,3201,3220,3250,3264,3268,3272,3276,3280,3314,3329,3354,3365,3376,3413,3419,3436,3447,3475,3496,3511,3523,3534,3549,3571,3578,3585,3592],{"__ignoreMap":378},[382,3013,3014,3017,3020,3023,3026,3028,3031],{"class":384,"line":385},[382,3015,3016],{"class":418},"class",[382,3018,3019],{"class":388}," _PostsScreenState",[382,3021,3022],{"class":418}," extends",[382,3024,3025],{"class":388}," State",[382,3027,392],{"class":391},[382,3029,3030],{"class":388},"PostsScreen",[382,3032,3033],{"class":391},"> {\n",[382,3035,3036,3039,3042,3044,3047,3049],{"class":384,"line":412},[382,3037,3038],{"class":606},"  final",[382,3040,3041],{"class":391}," _scrollController ",[382,3043,785],{"class":418},[382,3045,3046],{"class":388}," ScrollController",[382,3048,843],{"class":391},[382,3050,800],{"class":418},[382,3052,3053],{"class":384,"line":435},[382,3054,3056],{"emptyLinePlaceholder":3055},true,"\n",[382,3058,3059],{"class":384,"line":468},[382,3060,3061],{"class":606},"  @override\n",[382,3063,3064,3067,3070],{"class":384,"line":482},[382,3065,3066],{"class":606},"  void",[382,3068,3069],{"class":454}," initState",[382,3071,3072],{"class":391},"() {\n",[382,3074,3075,3078,3080,3083,3085],{"class":384,"line":496},[382,3076,3077],{"class":391},"    super",[382,3079,362],{"class":418},[382,3081,3082],{"class":454},"initState",[382,3084,843],{"class":391},[382,3086,800],{"class":418},[382,3088,3089,3092,3094,3097,3100],{"class":384,"line":545},[382,3090,3091],{"class":391},"    _scrollController",[382,3093,362],{"class":418},[382,3095,3096],{"class":454},"addListener",[382,3098,3099],{"class":391},"(_onScroll)",[382,3101,800],{"class":418},[382,3103,3104],{"class":384,"line":553},[382,3105,3106],{"class":391},"  }\n",[382,3108,3109],{"class":384,"line":583},[382,3110,3056],{"emptyLinePlaceholder":3055},[382,3112,3113],{"class":384,"line":603},[382,3114,3061],{"class":606},[382,3116,3117,3119,3122],{"class":384,"line":626},[382,3118,3066],{"class":606},[382,3120,3121],{"class":454}," dispose",[382,3123,3072],{"class":391},[382,3125,3126,3128,3130,3133,3135],{"class":384,"line":667},[382,3127,3091],{"class":391},[382,3129,362],{"class":418},[382,3131,3132],{"class":454},"dispose",[382,3134,843],{"class":391},[382,3136,800],{"class":418},[382,3138,3139,3141,3143,3145,3147],{"class":384,"line":702},[382,3140,3077],{"class":391},[382,3142,362],{"class":418},[382,3144,3132],{"class":454},[382,3146,843],{"class":391},[382,3148,800],{"class":418},[382,3150,3151],{"class":384,"line":715},[382,3152,3106],{"class":391},[382,3154,3155],{"class":384,"line":760},[382,3156,3056],{"emptyLinePlaceholder":3055},[382,3158,3159],{"class":384,"line":776},[382,3160,3161],{"class":1532},"  // Populated via a StateSetter or passed down through the widget tree\n",[382,3163,3164,3167,3169,3171,3173,3175,3177,3179,3181,3183,3186],{"class":384,"line":803},[382,3165,3166],{"class":388},"  InfiniteQueryController",[382,3168,392],{"class":391},[382,3170,395],{"class":388},[382,3172,392],{"class":391},[382,3174,400],{"class":388},[382,3176,403],{"class":391},[382,3178,406],{"class":388},[382,3180,1484],{"class":391},[382,3182,523],{"class":418},[382,3184,3185],{"class":391}," _queryController",[382,3187,800],{"class":418},[382,3189,3190],{"class":384,"line":823},[382,3191,3056],{"emptyLinePlaceholder":3055},[382,3193,3194,3196,3199],{"class":384,"line":848},[382,3195,3066],{"class":606},[382,3197,3198],{"class":454}," _onScroll",[382,3200,3072],{"class":391},[382,3202,3203,3205,3208,3210,3213,3215,3218],{"class":384,"line":862},[382,3204,1420],{"class":606},[382,3206,3207],{"class":391}," position ",[382,3209,785],{"class":418},[382,3211,3212],{"class":391}," _scrollController",[382,3214,362],{"class":418},[382,3216,3217],{"class":391},"position",[382,3219,800],{"class":418},[382,3221,3222,3224,3227,3229,3231,3234,3237,3239,3242,3245,3248],{"class":384,"line":887},[382,3223,2412],{"class":576},[382,3225,3226],{"class":391}," (position",[382,3228,362],{"class":418},[382,3230,1987],{"class":391},[382,3232,3233],{"class":418},">=",[382,3235,3236],{"class":391}," position",[382,3238,362],{"class":418},[382,3240,3241],{"class":391},"maxScrollExtent ",[382,3243,3244],{"class":418},"-",[382,3246,3247],{"class":490}," 200",[382,3249,1970],{"class":391},[382,3251,3252,3255,3258,3260,3262],{"class":384,"line":907},[382,3253,3254],{"class":391},"      _queryController",[382,3256,3257],{"class":418},"?.",[382,3259,840],{"class":454},[382,3261,843],{"class":391},[382,3263,800],{"class":418},[382,3265,3266],{"class":384,"line":915},[382,3267,2459],{"class":391},[382,3269,3270],{"class":384,"line":921},[382,3271,3106],{"class":391},[382,3273,3274],{"class":384,"line":935},[382,3275,3056],{"emptyLinePlaceholder":3055},[382,3277,3278],{"class":384,"line":943},[382,3279,3061],{"class":606},[382,3281,3282,3285,3288,3290,3292,3295,3297,3300,3302,3304,3306,3308,3310,3312],{"class":384,"line":951},[382,3283,3284],{"class":388},"  Widget",[382,3286,3287],{"class":454}," build",[382,3289,632],{"class":391},[382,3291,981],{"class":388},[382,3293,3294],{"class":391}," context) ",[382,3296,446],{"class":418},[382,3298,3299],{"class":388}," InfiniteQueryBuilder",[382,3301,392],{"class":391},[382,3303,395],{"class":388},[382,3305,392],{"class":391},[382,3307,400],{"class":388},[382,3309,403],{"class":391},[382,3311,406],{"class":388},[382,3313,409],{"class":391},[382,3315,3316,3319,3321,3323,3325,3327],{"class":384,"line":959},[382,3317,3318],{"class":391},"        queryKey",[382,3320,419],{"class":418},[382,3322,422],{"class":391},[382,3324,426],{"class":425},[382,3326,429],{"class":391},[382,3328,432],{"class":418},[382,3330,3331,3334,3336,3338,3340,3342,3344,3346,3348,3350,3352],{"class":384,"line":2101},[382,3332,3333],{"class":391},"        fetcher",[382,3335,419],{"class":418},[382,3337,443],{"class":391},[382,3339,446],{"class":418},[382,3341,449],{"class":391},[382,3343,362],{"class":418},[382,3345,455],{"class":454},[382,3347,458],{"class":391},[382,3349,419],{"class":418},[382,3351,463],{"class":391},[382,3353,432],{"class":418},[382,3355,3356,3359,3361,3363],{"class":384,"line":2106},[382,3357,3358],{"class":391},"        options",[382,3360,419],{"class":418},[382,3362,476],{"class":388},[382,3364,479],{"class":391},[382,3366,3367,3370,3372,3374],{"class":384,"line":2114},[382,3368,3369],{"class":391},"          initialPageParam",[382,3371,419],{"class":418},[382,3373,491],{"class":490},[382,3375,432],{"class":418},[382,3377,3378,3381,3383,3385,3387,3389,3391,3393,3395,3397,3399,3401,3403,3405,3407,3409,3411],{"class":384,"line":2121},[382,3379,3380],{"class":391},"          getNextPageParam",[382,3382,419],{"class":418},[382,3384,504],{"class":391},[382,3386,507],{"class":418},[382,3388,510],{"class":391},[382,3390,446],{"class":418},[382,3392,515],{"class":391},[382,3394,362],{"class":418},[382,3396,520],{"class":391},[382,3398,523],{"class":418},[382,3400,526],{"class":391},[382,3402,362],{"class":418},[382,3404,531],{"class":391},[382,3406,534],{"class":418},[382,3408,491],{"class":490},[382,3410,539],{"class":418},[382,3412,542],{"class":418},[382,3414,3415,3417],{"class":384,"line":2137},[382,3416,2214],{"class":391},[382,3418,432],{"class":418},[382,3420,3421,3424,3426,3428,3430,3432,3434],{"class":384,"line":2148},[382,3422,3423],{"class":391},"        builder",[382,3425,419],{"class":418},[382,3427,561],{"class":391},[382,3429,507],{"class":418},[382,3431,566],{"class":391},[382,3433,507],{"class":418},[382,3435,1415],{"class":391},[382,3437,3438,3441,3443,3445],{"class":384,"line":2175},[382,3439,3440],{"class":391},"          _queryController ",[382,3442,785],{"class":418},[382,3444,1509],{"class":391},[382,3446,800],{"class":418},[382,3448,3449,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473],{"class":384,"line":2211},[382,3450,779],{"class":606},[382,3452,782],{"class":391},[382,3454,785],{"class":418},[382,3456,1427],{"class":391},[382,3458,1430],{"class":418},[382,3460,1433],{"class":388},[382,3462,392],{"class":391},[382,3464,395],{"class":388},[382,3466,392],{"class":391},[382,3468,400],{"class":388},[382,3470,403],{"class":391},[382,3472,406],{"class":388},[382,3474,1448],{"class":391},[382,3476,3477,3480,3482,3484,3486,3488,3490,3492,3494],{"class":384,"line":2219},[382,3478,3479],{"class":418},"              ?",[382,3481,566],{"class":391},[382,3483,362],{"class":418},[382,3485,1460],{"class":391},[382,3487,362],{"class":418},[382,3489,727],{"class":454},[382,3491,730],{"class":391},[382,3493,446],{"class":418},[382,3495,1471],{"class":391},[382,3497,3498,3501,3503,3505,3507,3509],{"class":384,"line":2226},[382,3499,3500],{"class":418},"              :",[382,3502,1479],{"class":418},[382,3504,400],{"class":388},[382,3506,1484],{"class":418},[382,3508,1487],{"class":391},[382,3510,800],{"class":418},[382,3512,3513,3515,3517,3519,3521],{"class":384,"line":2233},[382,3514,924],{"class":576},[382,3516,1525],{"class":388},[382,3518,362],{"class":418},[382,3520,710],{"class":454},[382,3522,479],{"class":391},[382,3524,3525,3528,3530,3532],{"class":384,"line":2776},[382,3526,3527],{"class":391},"            controller",[382,3529,419],{"class":418},[382,3531,3212],{"class":391},[382,3533,432],{"class":418},[382,3535,3536,3539,3541,3543,3545,3547],{"class":384,"line":2783},[382,3537,3538],{"class":391},"            itemCount",[382,3540,419],{"class":418},[382,3542,815],{"class":391},[382,3544,362],{"class":418},[382,3546,2170],{"class":391},[382,3548,432],{"class":418},[382,3550,3552,3555,3557,3559,3561,3563,3565,3567,3569],{"class":384,"line":3551},42,[382,3553,3554],{"class":391},"            itemBuilder",[382,3556,419],{"class":418},[382,3558,768],{"class":391},[382,3560,507],{"class":418},[382,3562,2187],{"class":391},[382,3564,446],{"class":418},[382,3566,927],{"class":388},[382,3568,930],{"class":391},[382,3570,432],{"class":418},[382,3572,3574,3576],{"class":384,"line":3573},43,[382,3575,2602],{"class":391},[382,3577,800],{"class":418},[382,3579,3581,3583],{"class":384,"line":3580},44,[382,3582,938],{"class":391},[382,3584,432],{"class":418},[382,3586,3588,3590],{"class":384,"line":3587},45,[382,3589,946],{"class":391},[382,3591,800],{"class":418},[382,3593,3595],{"class":384,"line":3594},46,[382,3596,3597],{"class":391},"}\n",[364,3599],{},[367,3601,3603],{"id":3602},"infinitequerycontroller",[351,3604,357],{},[348,3606,3607,3608,3610,3611,3613,3614,3616],{},"A stable handle to the underlying ",[351,3609,1200],{},". The controller reference never changes as long as ",[351,3612,1053],{}," and ",[351,3615,1141],{}," stay the same, so it is safe to capture in scroll listeners or button callbacks.",[1259,3618,3620],{"id":3619},"methods","Methods",[1022,3622,3623,3635],{},[1025,3624,3625],{},[1028,3626,3627,3630,3633],{},[1031,3628,3629],{},"Method",[1031,3631,3632],{},"Signature",[1031,3634,1042],{},[1044,3636,3637,3658,3675],{},[1028,3638,3639,3644,3649],{},[1049,3640,3641],{},[351,3642,3643],{},"fetchNextPage()",[1049,3645,3646],{},[351,3647,3648],{},"Future\u003Cvoid>",[1049,3650,3651,3652,1227,3655,3657],{},"Fetch and append the next page. No-op if ",[351,3653,3654],{},"hasNextPage",[351,3656,1180],{}," or a fetch is already in progress.",[1028,3659,3660,3665,3669],{},[1049,3661,3662],{},[351,3663,3664],{},"fetchPreviousPage()",[1049,3666,3667],{},[351,3668,3648],{},[1049,3670,3671,3672,3674],{},"Fetch and prepend the previous page. Requires ",[351,3673,1112],{}," to be configured.",[1028,3676,3677,3681,3685],{},[1049,3678,3679],{},[351,3680,1612],{},[1049,3682,3683],{},[351,3684,3648],{},[1049,3686,3687],{},"Re-fetch all currently loaded pages in sequence. Useful for pull-to-refresh.",[364,3689],{},[367,3691,3693],{"id":3692},"key-changing-behaviour","Key Changing Behaviour",[348,3695,1177,3696,3698,3699,3702,3703,419],{},[351,3697,1053],{}," changes (",[351,3700,3701],{},"didUpdateWidget","), ",[351,3704,118],{},[967,3706,3707,3710,3715,3718],{},[970,3708,3709],{},"Cancels the stream subscription.",[970,3711,3712,3713,362],{},"Disposes the current ",[351,3714,1200],{},[970,3716,3717],{},"Creates a new observer for the new key.",[970,3719,3720,3721,362],{},"Subscribes and fetches from ",[351,3722,1106],{},[348,3724,3725],{},"This is how feed-switching (e.g. Home / Following tabs) is handled automatically without any extra state management.",[364,3727],{},[367,3729,3731],{"id":3730},"next-steps","Next Steps",[3733,3734,3735,3743,3750],"ul",{},[970,3736,3737,3742],{},[3738,3739,3741],"a",{"href":3740},"../recipes/infinite-queries","Infinite Queries Guide",": Core concepts, state machine, and pagination strategies",[970,3744,3745,3749],{},[3738,3746,3748],{"href":3747},"../api-reference/infinite-query","Infinite Query API Reference",": Full reference for all infinite query types and client methods",[970,3751,3752,3755],{},[3738,3753,108],{"href":3754},"./qora-builder",": Single-page (non-paginated) query widget",[3757,3758,3759],"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}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}",{"title":378,"searchDepth":412,"depth":412,"links":3761},[3762,3763,3764,3765,3773,3776,3777],{"id":369,"depth":412,"text":370},{"id":1019,"depth":412,"text":1020},{"id":1186,"depth":412,"text":1187},{"id":1256,"depth":412,"text":1257,"children":3766},[3767,3768,3769,3770,3772],{"id":1261,"depth":435,"text":1262},{"id":1618,"depth":435,"text":1619},{"id":2240,"depth":435,"text":2241},{"id":2790,"depth":435,"text":3771},"Conditional Queries (enabled)",{"id":2998,"depth":435,"text":2999},{"id":3602,"depth":412,"text":357,"children":3774},[3775],{"id":3619,"depth":435,"text":3620},{"id":3692,"depth":412,"text":3693},{"id":3730,"depth":412,"text":3731},"The widget that manages paginated queries and exposes fetchNextPage, fetchPreviousPage, and refetch through a stable controller interface.","md",null,{},{"icon":121},{"title":3784,"description":3785},"InfiniteQueryBuilder - Qora Flutter","Bind infinite scroll queries to Flutter UI with InfiniteQueryBuilder. Supports forward scroll, bi-directional paging, pull-to-refresh, and windowed paging.","YCbdot8BoE2RybZYot-16-u4m7z7jKv0iFHQ9CjUoRw",[3788,3790],{"title":113,"path":114,"stem":115,"description":3789,"icon":116,"children":-1},"The widget that manages a MutationController lifecycle and rebuilds your UI on every mutation state transition.",{"title":123,"path":124,"stem":125,"description":3791,"icon":126,"children":-1},"Use useQuery, useMutation, useInfiniteQuery, useIsFetching and useIsMutating with flutter_hooks for a concise, composable API.\n",1794040399059]