[{"data":1,"prerenderedAt":3093},["ShallowReactive",2],{"navigation_docs_en":3,"-en-getting-started-quick-start":342,"-en-getting-started-quick-start-surround":3088},[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":21,"body":344,"description":3081,"extension":3082,"links":3083,"meta":3084,"navigation":3085,"path":22,"seo":3086,"stem":23,"__hash__":3087},"docs_en/en/01.getting-started/4.quick-start.md",{"type":345,"value":346,"toc":3072},"minimark",[347,351,362,367,400,704,710,714,1398,1410,1414,1423,2160,2164,2171,2570,2573,2577,2595,2931,2934,2938,3035,3039,3068],[348,349,350],"p",{},"In ten minutes you will have two screens that load users from a real API, open instantly on the second visit, refresh in the background, and keep showing data when the network drops.",[348,352,353,354,361],{},"The code below runs as is against ",[355,356,360],"a",{"href":357,"rel":358},"https://jsonplaceholder.typicode.com",[359],"nofollow","JSONPlaceholder",", a free fake REST API.",[363,364,366],"h2",{"id":365},"_1-install-and-wrap-your-app","1. Install and wrap your app",[368,369,375],"pre",{"className":370,"code":371,"filename":372,"language":373,"meta":374,"style":374},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flutter pub add qora_flutter http\n","Terminal","bash","",[376,377,378],"code",{"__ignoreMap":374},[379,380,383,387,391,394,397],"span",{"class":381,"line":382},"line",1,[379,384,386],{"class":385},"sBMFI","flutter",[379,388,390],{"class":389},"sfazB"," pub",[379,392,393],{"class":389}," add",[379,395,396],{"class":389}," qora_flutter",[379,398,399],{"class":389}," http\n",[368,401,406],{"className":402,"code":403,"filename":404,"language":405,"meta":374,"style":374},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:flutter/material.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nimport 'user_list_screen.dart';\n\nvoid main() {\n  final client = QoraClient(\n    config: const QoraClientConfig(\n      defaultOptions: QoraOptions(staleTime: Duration(minutes: 5)),\n    ),\n  );\n\n  runApp(QoraScope.auto(client: client, child: const MyApp()));\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({super.key});\n\n  @override\n  Widget build(BuildContext context) =>\n      const MaterialApp(home: UserListScreen());\n}\n","lib/main.dart","dart",[376,407,408,421,431,438,448,453,468,486,503,536,544,552,557,600,606,611,628,646,651,657,677,699],{"__ignoreMap":374},[379,409,410,414,417],{"class":381,"line":382},[379,411,413],{"class":412},"sbssI","import",[379,415,416],{"class":389}," 'package:flutter/material.dart'",[379,418,420],{"class":419},"sMK4o",";\n",[379,422,424,426,429],{"class":381,"line":423},2,[379,425,413],{"class":412},[379,427,428],{"class":389}," 'package:qora_flutter/qora_flutter.dart'",[379,430,420],{"class":419},[379,432,434],{"class":381,"line":433},3,[379,435,437],{"emptyLinePlaceholder":436},true,"\n",[379,439,441,443,446],{"class":381,"line":440},4,[379,442,413],{"class":412},[379,444,445],{"class":389}," 'user_list_screen.dart'",[379,447,420],{"class":419},[379,449,451],{"class":381,"line":450},5,[379,452,437],{"emptyLinePlaceholder":436},[379,454,456,460,464],{"class":381,"line":455},6,[379,457,459],{"class":458},"spNyl","void",[379,461,463],{"class":462},"s2Zo4"," main",[379,465,467],{"class":466},"sTEyZ","() {\n",[379,469,471,474,477,480,483],{"class":381,"line":470},7,[379,472,473],{"class":458},"  final",[379,475,476],{"class":466}," client ",[379,478,479],{"class":419},"=",[379,481,482],{"class":385}," QoraClient",[379,484,485],{"class":466},"(\n",[379,487,489,492,495,498,501],{"class":381,"line":488},8,[379,490,491],{"class":466},"    config",[379,493,494],{"class":419},":",[379,496,497],{"class":458}," const",[379,499,500],{"class":385}," QoraClientConfig",[379,502,485],{"class":466},[379,504,506,509,511,514,517,519,522,525,527,530,533],{"class":381,"line":505},9,[379,507,508],{"class":466},"      defaultOptions",[379,510,494],{"class":419},[379,512,513],{"class":385}," QoraOptions",[379,515,516],{"class":466},"(staleTime",[379,518,494],{"class":419},[379,520,521],{"class":385}," Duration",[379,523,524],{"class":466},"(minutes",[379,526,494],{"class":419},[379,528,529],{"class":412}," 5",[379,531,532],{"class":466},"))",[379,534,535],{"class":419},",\n",[379,537,539,542],{"class":381,"line":538},10,[379,540,541],{"class":466},"    )",[379,543,535],{"class":419},[379,545,547,550],{"class":381,"line":546},11,[379,548,549],{"class":466},"  )",[379,551,420],{"class":419},[379,553,555],{"class":381,"line":554},12,[379,556,437],{"emptyLinePlaceholder":436},[379,558,560,563,566,568,571,574,577,579,582,585,588,590,592,595,598],{"class":381,"line":559},13,[379,561,562],{"class":462},"  runApp",[379,564,565],{"class":466},"(",[379,567,103],{"class":385},[379,569,570],{"class":419},".",[379,572,573],{"class":462},"auto",[379,575,576],{"class":466},"(client",[379,578,494],{"class":419},[379,580,581],{"class":466}," client",[379,583,584],{"class":419},",",[379,586,587],{"class":466}," child",[379,589,494],{"class":419},[379,591,497],{"class":458},[379,593,594],{"class":385}," MyApp",[379,596,597],{"class":466},"()))",[379,599,420],{"class":419},[379,601,603],{"class":381,"line":602},14,[379,604,605],{"class":466},"}\n",[379,607,609],{"class":381,"line":608},15,[379,610,437],{"emptyLinePlaceholder":436},[379,612,614,617,619,622,625],{"class":381,"line":613},16,[379,615,616],{"class":419},"class",[379,618,594],{"class":385},[379,620,621],{"class":419}," extends",[379,623,624],{"class":385}," StatelessWidget",[379,626,627],{"class":466}," {\n",[379,629,631,634,636,639,641,644],{"class":381,"line":630},17,[379,632,633],{"class":458},"  const",[379,635,594],{"class":385},[379,637,638],{"class":466},"({super",[379,640,570],{"class":419},[379,642,643],{"class":466},"key})",[379,645,420],{"class":419},[379,647,649],{"class":381,"line":648},18,[379,650,437],{"emptyLinePlaceholder":436},[379,652,654],{"class":381,"line":653},19,[379,655,656],{"class":458},"  @override\n",[379,658,660,663,666,668,671,674],{"class":381,"line":659},20,[379,661,662],{"class":385},"  Widget",[379,664,665],{"class":462}," build",[379,667,565],{"class":466},[379,669,670],{"class":385},"BuildContext",[379,672,673],{"class":466}," context) ",[379,675,676],{"class":419},"=>\n",[379,678,680,683,686,689,691,694,697],{"class":381,"line":679},21,[379,681,682],{"class":458},"      const",[379,684,685],{"class":385}," MaterialApp",[379,687,688],{"class":466},"(home",[379,690,494],{"class":419},[379,692,693],{"class":385}," UserListScreen",[379,695,696],{"class":466},"())",[379,698,420],{"class":419},[379,700,702],{"class":381,"line":701},22,[379,703,605],{"class":466},[348,705,706,709],{},[376,707,708],{},"staleTime: 5 minutes"," means fetched data counts as fresh for five minutes: within that window, opening a screen again costs no network call.",[363,711,713],{"id":712},"_2-describe-the-data-and-how-to-fetch-it","2. Describe the data and how to fetch it",[368,715,718],{"className":402,"code":716,"filename":717,"language":405,"meta":374,"style":374},"import 'dart:convert';\n\nimport 'package:http/http.dart' as http;\n\nclass User {\n  final int id;\n  final String name;\n  final String email;\n\n  const User({required this.id, required this.name, required this.email});\n\n  factory User.fromJson(Map\u003CString, dynamic> json) => User(\n        id: json['id'] as int,\n        name: json['name'] as String,\n        email: json['email'] as String,\n      );\n}\n\nclass UserApi {\n  static const _base = 'https://jsonplaceholder.typicode.com';\n\n  static Future\u003CList\u003CUser>> getUsers() async {\n    final res = await http.get(Uri.parse('$_base/users'));\n    if (res.statusCode != 200) throw Exception('HTTP ${res.statusCode}');\n    final list = jsonDecode(res.body) as List\u003Cdynamic>;\n    return list.map((j) => User.fromJson(j as Map\u003CString, dynamic>)).toList();\n  }\n\n  static Future\u003CUser> getUser(int id) async {\n    final res = await http.get(Uri.parse('$_base/users/$id'));\n    if (res.statusCode != 200) throw Exception('HTTP ${res.statusCode}');\n    return User.fromJson(jsonDecode(res.body) as Map\u003CString, dynamic>);\n  }\n}\n","lib/user_api.dart",[376,719,720,729,733,748,752,761,773,785,796,800,845,849,888,911,931,951,958,962,966,975,992,996,1028,1078,1133,1168,1222,1228,1233,1262,1308,1349,1388,1393],{"__ignoreMap":374},[379,721,722,724,727],{"class":381,"line":382},[379,723,413],{"class":412},[379,725,726],{"class":389}," 'dart:convert'",[379,728,420],{"class":419},[379,730,731],{"class":381,"line":423},[379,732,437],{"emptyLinePlaceholder":436},[379,734,735,737,740,743,746],{"class":381,"line":433},[379,736,413],{"class":412},[379,738,739],{"class":389}," 'package:http/http.dart'",[379,741,742],{"class":412}," as",[379,744,745],{"class":466}," http",[379,747,420],{"class":419},[379,749,750],{"class":381,"line":440},[379,751,437],{"emptyLinePlaceholder":436},[379,753,754,756,759],{"class":381,"line":450},[379,755,616],{"class":419},[379,757,758],{"class":385}," User",[379,760,627],{"class":466},[379,762,763,765,768,771],{"class":381,"line":455},[379,764,473],{"class":458},[379,766,767],{"class":385}," int",[379,769,770],{"class":466}," id",[379,772,420],{"class":419},[379,774,775,777,780,783],{"class":381,"line":470},[379,776,473],{"class":458},[379,778,779],{"class":385}," String",[379,781,782],{"class":466}," name",[379,784,420],{"class":419},[379,786,787,789,791,794],{"class":381,"line":488},[379,788,473],{"class":458},[379,790,779],{"class":385},[379,792,793],{"class":466}," email",[379,795,420],{"class":419},[379,797,798],{"class":381,"line":505},[379,799,437],{"emptyLinePlaceholder":436},[379,801,802,804,806,809,812,815,817,820,822,825,827,829,832,834,836,838,840,843],{"class":381,"line":538},[379,803,633],{"class":458},[379,805,758],{"class":385},[379,807,808],{"class":466},"({",[379,810,811],{"class":458},"required",[379,813,814],{"class":466}," this",[379,816,570],{"class":419},[379,818,819],{"class":466},"id",[379,821,584],{"class":419},[379,823,824],{"class":458}," required",[379,826,814],{"class":466},[379,828,570],{"class":419},[379,830,831],{"class":466},"name",[379,833,584],{"class":419},[379,835,824],{"class":458},[379,837,814],{"class":466},[379,839,570],{"class":419},[379,841,842],{"class":466},"email})",[379,844,420],{"class":419},[379,846,847],{"class":381,"line":546},[379,848,437],{"emptyLinePlaceholder":436},[379,850,851,854,856,858,861,863,866,869,872,875,878,881,884,886],{"class":381,"line":554},[379,852,853],{"class":419},"  factory",[379,855,758],{"class":385},[379,857,570],{"class":419},[379,859,860],{"class":462},"fromJson",[379,862,565],{"class":466},[379,864,865],{"class":385},"Map",[379,867,868],{"class":466},"\u003C",[379,870,871],{"class":385},"String",[379,873,874],{"class":466},", ",[379,876,877],{"class":385},"dynamic",[379,879,880],{"class":466},"> json) ",[379,882,883],{"class":419},"=>",[379,885,758],{"class":385},[379,887,485],{"class":466},[379,889,890,893,895,898,901,904,907,909],{"class":381,"line":559},[379,891,892],{"class":466},"        id",[379,894,494],{"class":419},[379,896,897],{"class":466}," json[",[379,899,900],{"class":389},"'id'",[379,902,903],{"class":466},"] ",[379,905,906],{"class":419},"as",[379,908,767],{"class":385},[379,910,535],{"class":419},[379,912,913,916,918,920,923,925,927,929],{"class":381,"line":602},[379,914,915],{"class":466},"        name",[379,917,494],{"class":419},[379,919,897],{"class":466},[379,921,922],{"class":389},"'name'",[379,924,903],{"class":466},[379,926,906],{"class":419},[379,928,779],{"class":385},[379,930,535],{"class":419},[379,932,933,936,938,940,943,945,947,949],{"class":381,"line":608},[379,934,935],{"class":466},"        email",[379,937,494],{"class":419},[379,939,897],{"class":466},[379,941,942],{"class":389},"'email'",[379,944,903],{"class":466},[379,946,906],{"class":419},[379,948,779],{"class":385},[379,950,535],{"class":419},[379,952,953,956],{"class":381,"line":613},[379,954,955],{"class":466},"      )",[379,957,420],{"class":419},[379,959,960],{"class":381,"line":630},[379,961,605],{"class":466},[379,963,964],{"class":381,"line":648},[379,965,437],{"emptyLinePlaceholder":436},[379,967,968,970,973],{"class":381,"line":653},[379,969,616],{"class":419},[379,971,972],{"class":385}," UserApi",[379,974,627],{"class":466},[379,976,977,980,982,985,987,990],{"class":381,"line":659},[379,978,979],{"class":458},"  static",[379,981,497],{"class":458},[379,983,984],{"class":466}," _base ",[379,986,479],{"class":419},[379,988,989],{"class":389}," 'https://jsonplaceholder.typicode.com'",[379,991,420],{"class":419},[379,993,994],{"class":381,"line":679},[379,995,437],{"emptyLinePlaceholder":436},[379,997,998,1000,1003,1005,1008,1010,1013,1016,1019,1022,1026],{"class":381,"line":701},[379,999,979],{"class":458},[379,1001,1002],{"class":385}," Future",[379,1004,868],{"class":466},[379,1006,1007],{"class":385},"List",[379,1009,868],{"class":466},[379,1011,1012],{"class":385},"User",[379,1014,1015],{"class":466},">> ",[379,1017,1018],{"class":462},"getUsers",[379,1020,1021],{"class":466},"() ",[379,1023,1025],{"class":1024},"s7zQu","async",[379,1027,627],{"class":466},[379,1029,1031,1034,1037,1039,1042,1044,1046,1049,1051,1054,1056,1059,1061,1064,1067,1071,1074,1076],{"class":381,"line":1030},23,[379,1032,1033],{"class":458},"    final",[379,1035,1036],{"class":466}," res ",[379,1038,479],{"class":419},[379,1040,1041],{"class":1024}," await",[379,1043,745],{"class":466},[379,1045,570],{"class":419},[379,1047,1048],{"class":462},"get",[379,1050,565],{"class":466},[379,1052,1053],{"class":385},"Uri",[379,1055,570],{"class":419},[379,1057,1058],{"class":462},"parse",[379,1060,565],{"class":466},[379,1062,1063],{"class":389},"'",[379,1065,1066],{"class":466},"$",[379,1068,1070],{"class":1069},"sHdIc","_base",[379,1072,1073],{"class":389},"/users'",[379,1075,532],{"class":466},[379,1077,420],{"class":419},[379,1079,1081,1084,1087,1089,1092,1095,1098,1101,1104,1107,1109,1112,1115,1118,1120,1123,1126,1128,1131],{"class":381,"line":1080},24,[379,1082,1083],{"class":1024},"    if",[379,1085,1086],{"class":466}," (res",[379,1088,570],{"class":419},[379,1090,1091],{"class":466},"statusCode ",[379,1093,1094],{"class":419},"!=",[379,1096,1097],{"class":412}," 200",[379,1099,1100],{"class":466},") ",[379,1102,1103],{"class":1024},"throw",[379,1105,1106],{"class":385}," Exception",[379,1108,565],{"class":466},[379,1110,1111],{"class":389},"'HTTP ",[379,1113,1114],{"class":466},"${",[379,1116,1117],{"class":1069},"res",[379,1119,570],{"class":466},[379,1121,1122],{"class":1069},"statusCode",[379,1124,1125],{"class":466},"}",[379,1127,1063],{"class":389},[379,1129,1130],{"class":466},")",[379,1132,420],{"class":419},[379,1134,1136,1138,1141,1143,1146,1149,1151,1154,1156,1159,1161,1163,1166],{"class":381,"line":1135},25,[379,1137,1033],{"class":458},[379,1139,1140],{"class":466}," list ",[379,1142,479],{"class":419},[379,1144,1145],{"class":462}," jsonDecode",[379,1147,1148],{"class":466},"(res",[379,1150,570],{"class":419},[379,1152,1153],{"class":466},"body) ",[379,1155,906],{"class":419},[379,1157,1158],{"class":385}," List",[379,1160,868],{"class":466},[379,1162,877],{"class":385},[379,1164,1165],{"class":466},">",[379,1167,420],{"class":419},[379,1169,1171,1174,1177,1179,1182,1185,1187,1189,1191,1193,1196,1198,1201,1203,1205,1207,1209,1212,1214,1217,1220],{"class":381,"line":1170},26,[379,1172,1173],{"class":1024},"    return",[379,1175,1176],{"class":466}," list",[379,1178,570],{"class":419},[379,1180,1181],{"class":462},"map",[379,1183,1184],{"class":466},"((j) ",[379,1186,883],{"class":419},[379,1188,758],{"class":385},[379,1190,570],{"class":419},[379,1192,860],{"class":462},[379,1194,1195],{"class":466},"(j ",[379,1197,906],{"class":419},[379,1199,1200],{"class":385}," Map",[379,1202,868],{"class":466},[379,1204,871],{"class":385},[379,1206,874],{"class":466},[379,1208,877],{"class":385},[379,1210,1211],{"class":466},">))",[379,1213,570],{"class":419},[379,1215,1216],{"class":462},"toList",[379,1218,1219],{"class":466},"()",[379,1221,420],{"class":419},[379,1223,1225],{"class":381,"line":1224},27,[379,1226,1227],{"class":466},"  }\n",[379,1229,1231],{"class":381,"line":1230},28,[379,1232,437],{"emptyLinePlaceholder":436},[379,1234,1236,1238,1240,1242,1244,1247,1250,1252,1255,1258,1260],{"class":381,"line":1235},29,[379,1237,979],{"class":458},[379,1239,1002],{"class":385},[379,1241,868],{"class":466},[379,1243,1012],{"class":385},[379,1245,1246],{"class":466},"> ",[379,1248,1249],{"class":462},"getUser",[379,1251,565],{"class":466},[379,1253,1254],{"class":385},"int",[379,1256,1257],{"class":466}," id) ",[379,1259,1025],{"class":1024},[379,1261,627],{"class":466},[379,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1298,1300,1302,1304,1306],{"class":381,"line":1264},30,[379,1266,1033],{"class":458},[379,1268,1036],{"class":466},[379,1270,479],{"class":419},[379,1272,1041],{"class":1024},[379,1274,745],{"class":466},[379,1276,570],{"class":419},[379,1278,1048],{"class":462},[379,1280,565],{"class":466},[379,1282,1053],{"class":385},[379,1284,570],{"class":419},[379,1286,1058],{"class":462},[379,1288,565],{"class":466},[379,1290,1063],{"class":389},[379,1292,1066],{"class":466},[379,1294,1070],{"class":1069},[379,1296,1297],{"class":389},"/users/",[379,1299,1066],{"class":466},[379,1301,819],{"class":1069},[379,1303,1063],{"class":389},[379,1305,532],{"class":466},[379,1307,420],{"class":419},[379,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1341,1343,1345,1347],{"class":381,"line":1310},31,[379,1312,1083],{"class":1024},[379,1314,1086],{"class":466},[379,1316,570],{"class":419},[379,1318,1091],{"class":466},[379,1320,1094],{"class":419},[379,1322,1097],{"class":412},[379,1324,1100],{"class":466},[379,1326,1103],{"class":1024},[379,1328,1106],{"class":385},[379,1330,565],{"class":466},[379,1332,1111],{"class":389},[379,1334,1114],{"class":466},[379,1336,1117],{"class":1069},[379,1338,570],{"class":466},[379,1340,1122],{"class":1069},[379,1342,1125],{"class":466},[379,1344,1063],{"class":389},[379,1346,1130],{"class":466},[379,1348,420],{"class":419},[379,1350,1352,1354,1356,1358,1360,1362,1365,1367,1369,1371,1373,1375,1377,1379,1381,1383,1386],{"class":381,"line":1351},32,[379,1353,1173],{"class":1024},[379,1355,758],{"class":385},[379,1357,570],{"class":419},[379,1359,860],{"class":462},[379,1361,565],{"class":466},[379,1363,1364],{"class":462},"jsonDecode",[379,1366,1148],{"class":466},[379,1368,570],{"class":419},[379,1370,1153],{"class":466},[379,1372,906],{"class":419},[379,1374,1200],{"class":385},[379,1376,868],{"class":466},[379,1378,871],{"class":385},[379,1380,874],{"class":466},[379,1382,877],{"class":385},[379,1384,1385],{"class":466},">)",[379,1387,420],{"class":419},[379,1389,1391],{"class":381,"line":1390},33,[379,1392,1227],{"class":466},[379,1394,1396],{"class":381,"line":1395},34,[379,1397,605],{"class":466},[1399,1400,1401,1402,1405,1406,1409],"warning",{},"A fetcher must ",[1403,1404,1103],"strong",{}," on failure. If it returns ",[376,1407,1408],{},"null"," or swallows the error, Qora sees a success and never retries or shows the error.",[363,1411,1413],{"id":1412},"_3-the-list-screen","3. The list screen",[348,1415,1416,1418,1419,1422],{},[376,1417,108],{}," fetches on mount, caches the result under its key, and rebuilds on every change. The builder receives the state, which you match exhaustively, and a ",[376,1420,1421],{},"FetchStatus"," that says whether a request is running.",[368,1424,1427],{"className":402,"code":1425,"filename":1426,"language":405,"meta":374,"style":374},"import 'package:flutter/material.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nimport 'user_api.dart';\nimport 'user_detail_screen.dart';\n\nclass UserListScreen extends StatelessWidget {\n  const UserListScreen({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: const Text('Users')),\n      body: QoraBuilder\u003CList\u003CUser>>(\n        queryKey: const ['users'],\n        fetcher: UserApi.getUsers,\n        builder: (context, state, fetchStatus) => switch (state) {\n          Success(:final data) => _UserList(users: data),\n          // A refetch or an error keeps the previous data: show it.\n          Loading(:final previousData?) => _UserList(users: previousData),\n          Failure(:final previousData?) => _UserList(users: previousData),\n          Failure(:final error) => Center(child: Text('Could not load users: $error')),\n          _ => const Center(child: CircularProgressIndicator()),\n        },\n      ),\n    );\n  }\n}\n\nclass _UserList extends StatelessWidget {\n  const _UserList({required this.users});\n  final List\u003CUser> users;\n\n  @override\n  Widget build(BuildContext context) {\n    return RefreshIndicator(\n      // Mark the list stale: the mounted QoraBuilder refetches it.\n      onRefresh: () async => context.qora.invalidate(const ['users']),\n      child: ListView.builder(\n        itemCount: users.length,\n        itemBuilder: (context, i) => ListTile(\n          title: Text(users[i].name),\n          subtitle: Text(users[i].email),\n          onTap: () => Navigator.of(context).push(MaterialPageRoute(\n            builder: (_) => UserDetailScreen(userId: users[i].id),\n          )),\n        ),\n      ),\n    );\n  }\n}\n","lib/user_list_screen.dart",[376,1428,1429,1437,1445,1449,1458,1467,1471,1483,1497,1501,1505,1518,1527,1556,1577,1597,1612,1640,1670,1676,1708,1737,1778,1800,1807,1813,1819,1823,1827,1831,1843,1862,1877,1881,1885,1898,1908,1914,1957,1975,1993,2015,2035,2054,2089,2120,2128,2136,2143,2150,2155],{"__ignoreMap":374},[379,1430,1431,1433,1435],{"class":381,"line":382},[379,1432,413],{"class":412},[379,1434,416],{"class":389},[379,1436,420],{"class":419},[379,1438,1439,1441,1443],{"class":381,"line":423},[379,1440,413],{"class":412},[379,1442,428],{"class":389},[379,1444,420],{"class":419},[379,1446,1447],{"class":381,"line":433},[379,1448,437],{"emptyLinePlaceholder":436},[379,1450,1451,1453,1456],{"class":381,"line":440},[379,1452,413],{"class":412},[379,1454,1455],{"class":389}," 'user_api.dart'",[379,1457,420],{"class":419},[379,1459,1460,1462,1465],{"class":381,"line":450},[379,1461,413],{"class":412},[379,1463,1464],{"class":389}," 'user_detail_screen.dart'",[379,1466,420],{"class":419},[379,1468,1469],{"class":381,"line":455},[379,1470,437],{"emptyLinePlaceholder":436},[379,1472,1473,1475,1477,1479,1481],{"class":381,"line":470},[379,1474,616],{"class":419},[379,1476,693],{"class":385},[379,1478,621],{"class":419},[379,1480,624],{"class":385},[379,1482,627],{"class":466},[379,1484,1485,1487,1489,1491,1493,1495],{"class":381,"line":488},[379,1486,633],{"class":458},[379,1488,693],{"class":385},[379,1490,638],{"class":466},[379,1492,570],{"class":419},[379,1494,643],{"class":466},[379,1496,420],{"class":419},[379,1498,1499],{"class":381,"line":505},[379,1500,437],{"emptyLinePlaceholder":436},[379,1502,1503],{"class":381,"line":538},[379,1504,656],{"class":458},[379,1506,1507,1509,1511,1513,1515],{"class":381,"line":546},[379,1508,662],{"class":385},[379,1510,665],{"class":462},[379,1512,565],{"class":466},[379,1514,670],{"class":385},[379,1516,1517],{"class":466}," context) {\n",[379,1519,1520,1522,1525],{"class":381,"line":554},[379,1521,1173],{"class":1024},[379,1523,1524],{"class":385}," Scaffold",[379,1526,485],{"class":466},[379,1528,1529,1532,1534,1537,1540,1542,1544,1547,1549,1552,1554],{"class":381,"line":559},[379,1530,1531],{"class":466},"      appBar",[379,1533,494],{"class":419},[379,1535,1536],{"class":385}," AppBar",[379,1538,1539],{"class":466},"(title",[379,1541,494],{"class":419},[379,1543,497],{"class":458},[379,1545,1546],{"class":385}," Text",[379,1548,565],{"class":466},[379,1550,1551],{"class":389},"'Users'",[379,1553,532],{"class":466},[379,1555,535],{"class":419},[379,1557,1558,1561,1563,1566,1568,1570,1572,1574],{"class":381,"line":602},[379,1559,1560],{"class":466},"      body",[379,1562,494],{"class":419},[379,1564,1565],{"class":385}," QoraBuilder",[379,1567,868],{"class":466},[379,1569,1007],{"class":385},[379,1571,868],{"class":466},[379,1573,1012],{"class":385},[379,1575,1576],{"class":466},">>(\n",[379,1578,1579,1582,1584,1586,1589,1592,1595],{"class":381,"line":608},[379,1580,1581],{"class":466},"        queryKey",[379,1583,494],{"class":419},[379,1585,497],{"class":458},[379,1587,1588],{"class":466}," [",[379,1590,1591],{"class":389},"'users'",[379,1593,1594],{"class":466},"]",[379,1596,535],{"class":419},[379,1598,1599,1602,1604,1606,1608,1610],{"class":381,"line":613},[379,1600,1601],{"class":466},"        fetcher",[379,1603,494],{"class":419},[379,1605,972],{"class":385},[379,1607,570],{"class":419},[379,1609,1018],{"class":466},[379,1611,535],{"class":419},[379,1613,1614,1617,1619,1622,1624,1627,1629,1632,1634,1637],{"class":381,"line":630},[379,1615,1616],{"class":466},"        builder",[379,1618,494],{"class":419},[379,1620,1621],{"class":466}," (context",[379,1623,584],{"class":419},[379,1625,1626],{"class":466}," state",[379,1628,584],{"class":419},[379,1630,1631],{"class":466}," fetchStatus) ",[379,1633,883],{"class":419},[379,1635,1636],{"class":1024}," switch",[379,1638,1639],{"class":466}," (state) {\n",[379,1641,1642,1645,1647,1649,1652,1655,1657,1660,1663,1665,1668],{"class":381,"line":648},[379,1643,1644],{"class":385},"          Success",[379,1646,565],{"class":466},[379,1648,494],{"class":419},[379,1650,1651],{"class":458},"final",[379,1653,1654],{"class":466}," data) ",[379,1656,883],{"class":419},[379,1658,1659],{"class":385}," _UserList",[379,1661,1662],{"class":466},"(users",[379,1664,494],{"class":419},[379,1666,1667],{"class":466}," data)",[379,1669,535],{"class":419},[379,1671,1672],{"class":381,"line":653},[379,1673,1675],{"class":1674},"sHwdD","          // A refetch or an error keeps the previous data: show it.\n",[379,1677,1678,1681,1683,1685,1687,1690,1693,1695,1697,1699,1701,1703,1706],{"class":381,"line":659},[379,1679,1680],{"class":385},"          Loading",[379,1682,565],{"class":466},[379,1684,494],{"class":419},[379,1686,1651],{"class":458},[379,1688,1689],{"class":466}," previousData",[379,1691,1692],{"class":419},"?",[379,1694,1100],{"class":466},[379,1696,883],{"class":419},[379,1698,1659],{"class":385},[379,1700,1662],{"class":466},[379,1702,494],{"class":419},[379,1704,1705],{"class":466}," previousData)",[379,1707,535],{"class":419},[379,1709,1710,1713,1715,1717,1719,1721,1723,1725,1727,1729,1731,1733,1735],{"class":381,"line":679},[379,1711,1712],{"class":385},"          Failure",[379,1714,565],{"class":466},[379,1716,494],{"class":419},[379,1718,1651],{"class":458},[379,1720,1689],{"class":466},[379,1722,1692],{"class":419},[379,1724,1100],{"class":466},[379,1726,883],{"class":419},[379,1728,1659],{"class":385},[379,1730,1662],{"class":466},[379,1732,494],{"class":419},[379,1734,1705],{"class":466},[379,1736,535],{"class":419},[379,1738,1739,1741,1743,1745,1747,1750,1752,1755,1758,1760,1762,1764,1767,1769,1772,1774,1776],{"class":381,"line":701},[379,1740,1712],{"class":385},[379,1742,565],{"class":466},[379,1744,494],{"class":419},[379,1746,1651],{"class":458},[379,1748,1749],{"class":466}," error) ",[379,1751,883],{"class":419},[379,1753,1754],{"class":385}," Center",[379,1756,1757],{"class":466},"(child",[379,1759,494],{"class":419},[379,1761,1546],{"class":385},[379,1763,565],{"class":466},[379,1765,1766],{"class":389},"'Could not load users: ",[379,1768,1066],{"class":466},[379,1770,1771],{"class":1069},"error",[379,1773,1063],{"class":389},[379,1775,532],{"class":466},[379,1777,535],{"class":419},[379,1779,1780,1783,1785,1787,1789,1791,1793,1796,1798],{"class":381,"line":1030},[379,1781,1782],{"class":466},"          _ ",[379,1784,883],{"class":419},[379,1786,497],{"class":458},[379,1788,1754],{"class":385},[379,1790,1757],{"class":466},[379,1792,494],{"class":419},[379,1794,1795],{"class":385}," CircularProgressIndicator",[379,1797,696],{"class":466},[379,1799,535],{"class":419},[379,1801,1802,1805],{"class":381,"line":1080},[379,1803,1804],{"class":466},"        }",[379,1806,535],{"class":419},[379,1808,1809,1811],{"class":381,"line":1135},[379,1810,955],{"class":466},[379,1812,535],{"class":419},[379,1814,1815,1817],{"class":381,"line":1170},[379,1816,541],{"class":466},[379,1818,420],{"class":419},[379,1820,1821],{"class":381,"line":1224},[379,1822,1227],{"class":466},[379,1824,1825],{"class":381,"line":1230},[379,1826,605],{"class":466},[379,1828,1829],{"class":381,"line":1235},[379,1830,437],{"emptyLinePlaceholder":436},[379,1832,1833,1835,1837,1839,1841],{"class":381,"line":1264},[379,1834,616],{"class":419},[379,1836,1659],{"class":385},[379,1838,621],{"class":419},[379,1840,624],{"class":385},[379,1842,627],{"class":466},[379,1844,1845,1847,1849,1851,1853,1855,1857,1860],{"class":381,"line":1310},[379,1846,633],{"class":458},[379,1848,1659],{"class":385},[379,1850,808],{"class":466},[379,1852,811],{"class":458},[379,1854,814],{"class":466},[379,1856,570],{"class":419},[379,1858,1859],{"class":466},"users})",[379,1861,420],{"class":419},[379,1863,1864,1866,1868,1870,1872,1875],{"class":381,"line":1351},[379,1865,473],{"class":458},[379,1867,1158],{"class":385},[379,1869,868],{"class":466},[379,1871,1012],{"class":385},[379,1873,1874],{"class":466},"> users",[379,1876,420],{"class":419},[379,1878,1879],{"class":381,"line":1390},[379,1880,437],{"emptyLinePlaceholder":436},[379,1882,1883],{"class":381,"line":1395},[379,1884,656],{"class":458},[379,1886,1888,1890,1892,1894,1896],{"class":381,"line":1887},35,[379,1889,662],{"class":385},[379,1891,665],{"class":462},[379,1893,565],{"class":466},[379,1895,670],{"class":385},[379,1897,1517],{"class":466},[379,1899,1901,1903,1906],{"class":381,"line":1900},36,[379,1902,1173],{"class":1024},[379,1904,1905],{"class":385}," RefreshIndicator",[379,1907,485],{"class":466},[379,1909,1911],{"class":381,"line":1910},37,[379,1912,1913],{"class":1674},"      // Mark the list stale: the mounted QoraBuilder refetches it.\n",[379,1915,1917,1920,1922,1925,1927,1930,1933,1935,1938,1940,1943,1945,1948,1950,1952,1955],{"class":381,"line":1916},38,[379,1918,1919],{"class":466},"      onRefresh",[379,1921,494],{"class":419},[379,1923,1924],{"class":466}," () ",[379,1926,1025],{"class":1024},[379,1928,1929],{"class":419}," =>",[379,1931,1932],{"class":466}," context",[379,1934,570],{"class":419},[379,1936,1937],{"class":466},"qora",[379,1939,570],{"class":419},[379,1941,1942],{"class":462},"invalidate",[379,1944,565],{"class":466},[379,1946,1947],{"class":458},"const",[379,1949,1588],{"class":466},[379,1951,1591],{"class":389},[379,1953,1954],{"class":466},"])",[379,1956,535],{"class":419},[379,1958,1960,1963,1965,1968,1970,1973],{"class":381,"line":1959},39,[379,1961,1962],{"class":466},"      child",[379,1964,494],{"class":419},[379,1966,1967],{"class":385}," ListView",[379,1969,570],{"class":419},[379,1971,1972],{"class":462},"builder",[379,1974,485],{"class":466},[379,1976,1978,1981,1983,1986,1988,1991],{"class":381,"line":1977},40,[379,1979,1980],{"class":466},"        itemCount",[379,1982,494],{"class":419},[379,1984,1985],{"class":466}," users",[379,1987,570],{"class":419},[379,1989,1990],{"class":466},"length",[379,1992,535],{"class":419},[379,1994,1996,1999,2001,2003,2005,2008,2010,2013],{"class":381,"line":1995},41,[379,1997,1998],{"class":466},"        itemBuilder",[379,2000,494],{"class":419},[379,2002,1621],{"class":466},[379,2004,584],{"class":419},[379,2006,2007],{"class":466}," i) ",[379,2009,883],{"class":419},[379,2011,2012],{"class":385}," ListTile",[379,2014,485],{"class":466},[379,2016,2018,2021,2023,2025,2028,2030,2033],{"class":381,"line":2017},42,[379,2019,2020],{"class":466},"          title",[379,2022,494],{"class":419},[379,2024,1546],{"class":385},[379,2026,2027],{"class":466},"(users[i]",[379,2029,570],{"class":419},[379,2031,2032],{"class":466},"name)",[379,2034,535],{"class":419},[379,2036,2038,2041,2043,2045,2047,2049,2052],{"class":381,"line":2037},43,[379,2039,2040],{"class":466},"          subtitle",[379,2042,494],{"class":419},[379,2044,1546],{"class":385},[379,2046,2027],{"class":466},[379,2048,570],{"class":419},[379,2050,2051],{"class":466},"email)",[379,2053,535],{"class":419},[379,2055,2057,2060,2062,2064,2066,2069,2071,2074,2077,2079,2082,2084,2087],{"class":381,"line":2056},44,[379,2058,2059],{"class":466},"          onTap",[379,2061,494],{"class":419},[379,2063,1924],{"class":466},[379,2065,883],{"class":419},[379,2067,2068],{"class":385}," Navigator",[379,2070,570],{"class":419},[379,2072,2073],{"class":462},"of",[379,2075,2076],{"class":466},"(context)",[379,2078,570],{"class":419},[379,2080,2081],{"class":462},"push",[379,2083,565],{"class":466},[379,2085,2086],{"class":385},"MaterialPageRoute",[379,2088,485],{"class":466},[379,2090,2092,2095,2097,2100,2102,2105,2108,2110,2113,2115,2118],{"class":381,"line":2091},45,[379,2093,2094],{"class":466},"            builder",[379,2096,494],{"class":419},[379,2098,2099],{"class":466}," (_) ",[379,2101,883],{"class":419},[379,2103,2104],{"class":385}," UserDetailScreen",[379,2106,2107],{"class":466},"(userId",[379,2109,494],{"class":419},[379,2111,2112],{"class":466}," users[i]",[379,2114,570],{"class":419},[379,2116,2117],{"class":466},"id)",[379,2119,535],{"class":419},[379,2121,2123,2126],{"class":381,"line":2122},46,[379,2124,2125],{"class":466},"          ))",[379,2127,535],{"class":419},[379,2129,2131,2134],{"class":381,"line":2130},47,[379,2132,2133],{"class":466},"        )",[379,2135,535],{"class":419},[379,2137,2139,2141],{"class":381,"line":2138},48,[379,2140,955],{"class":466},[379,2142,535],{"class":419},[379,2144,2146,2148],{"class":381,"line":2145},49,[379,2147,541],{"class":466},[379,2149,420],{"class":419},[379,2151,2153],{"class":381,"line":2152},50,[379,2154,1227],{"class":466},[379,2156,2158],{"class":381,"line":2157},51,[379,2159,605],{"class":466},[363,2161,2163],{"id":2162},"_4-the-detail-screen","4. The detail screen",[348,2165,2166,2167,2170],{},"Each user gets its own key, ",[376,2168,2169],{},"['users', id]",". The key is the cache address: same key, same data, wherever it is used.",[368,2172,2175],{"className":402,"code":2173,"filename":2174,"language":405,"meta":374,"style":374},"import 'package:flutter/material.dart';\nimport 'package:qora_flutter/qora_flutter.dart';\n\nimport 'user_api.dart';\n\nclass UserDetailScreen extends StatelessWidget {\n  const UserDetailScreen({super.key, required this.userId});\n  final int userId;\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: Text('User #$userId')),\n      body: QoraBuilder\u003CUser>(\n        queryKey: ['users', userId],\n        fetcher: () => UserApi.getUser(userId),\n        builder: (context, state, fetchStatus) {\n          final user = state.dataOrNull; // kept during refetches and errors\n          if (user == null) {\n            return switch (state) {\n              Failure(:final error) => Center(child: Text('Error: $error')),\n              _ => const Center(child: CircularProgressIndicator()),\n            };\n          }\n          return ListTile(title: Text(user.name), subtitle: Text(user.email));\n        },\n      ),\n    );\n  }\n}\n","lib/user_detail_screen.dart",[376,2176,2177,2185,2193,2197,2205,2209,2221,2247,2258,2262,2266,2278,2286,2316,2331,2348,2369,2386,2409,2426,2435,2473,2494,2501,2506,2544,2550,2556,2562,2566],{"__ignoreMap":374},[379,2178,2179,2181,2183],{"class":381,"line":382},[379,2180,413],{"class":412},[379,2182,416],{"class":389},[379,2184,420],{"class":419},[379,2186,2187,2189,2191],{"class":381,"line":423},[379,2188,413],{"class":412},[379,2190,428],{"class":389},[379,2192,420],{"class":419},[379,2194,2195],{"class":381,"line":433},[379,2196,437],{"emptyLinePlaceholder":436},[379,2198,2199,2201,2203],{"class":381,"line":440},[379,2200,413],{"class":412},[379,2202,1455],{"class":389},[379,2204,420],{"class":419},[379,2206,2207],{"class":381,"line":450},[379,2208,437],{"emptyLinePlaceholder":436},[379,2210,2211,2213,2215,2217,2219],{"class":381,"line":455},[379,2212,616],{"class":419},[379,2214,2104],{"class":385},[379,2216,621],{"class":419},[379,2218,624],{"class":385},[379,2220,627],{"class":466},[379,2222,2223,2225,2227,2229,2231,2234,2236,2238,2240,2242,2245],{"class":381,"line":470},[379,2224,633],{"class":458},[379,2226,2104],{"class":385},[379,2228,638],{"class":466},[379,2230,570],{"class":419},[379,2232,2233],{"class":466},"key",[379,2235,584],{"class":419},[379,2237,824],{"class":458},[379,2239,814],{"class":466},[379,2241,570],{"class":419},[379,2243,2244],{"class":466},"userId})",[379,2246,420],{"class":419},[379,2248,2249,2251,2253,2256],{"class":381,"line":488},[379,2250,473],{"class":458},[379,2252,767],{"class":385},[379,2254,2255],{"class":466}," userId",[379,2257,420],{"class":419},[379,2259,2260],{"class":381,"line":505},[379,2261,437],{"emptyLinePlaceholder":436},[379,2263,2264],{"class":381,"line":538},[379,2265,656],{"class":458},[379,2267,2268,2270,2272,2274,2276],{"class":381,"line":546},[379,2269,662],{"class":385},[379,2271,665],{"class":462},[379,2273,565],{"class":466},[379,2275,670],{"class":385},[379,2277,1517],{"class":466},[379,2279,2280,2282,2284],{"class":381,"line":554},[379,2281,1173],{"class":1024},[379,2283,1524],{"class":385},[379,2285,485],{"class":466},[379,2287,2288,2290,2292,2294,2296,2298,2300,2302,2305,2307,2310,2312,2314],{"class":381,"line":559},[379,2289,1531],{"class":466},[379,2291,494],{"class":419},[379,2293,1536],{"class":385},[379,2295,1539],{"class":466},[379,2297,494],{"class":419},[379,2299,1546],{"class":385},[379,2301,565],{"class":466},[379,2303,2304],{"class":389},"'User #",[379,2306,1066],{"class":466},[379,2308,2309],{"class":1069},"userId",[379,2311,1063],{"class":389},[379,2313,532],{"class":466},[379,2315,535],{"class":419},[379,2317,2318,2320,2322,2324,2326,2328],{"class":381,"line":602},[379,2319,1560],{"class":466},[379,2321,494],{"class":419},[379,2323,1565],{"class":385},[379,2325,868],{"class":466},[379,2327,1012],{"class":385},[379,2329,2330],{"class":466},">(\n",[379,2332,2333,2335,2337,2339,2341,2343,2346],{"class":381,"line":608},[379,2334,1581],{"class":466},[379,2336,494],{"class":419},[379,2338,1588],{"class":466},[379,2340,1591],{"class":389},[379,2342,584],{"class":419},[379,2344,2345],{"class":466}," userId]",[379,2347,535],{"class":419},[379,2349,2350,2352,2354,2356,2358,2360,2362,2364,2367],{"class":381,"line":613},[379,2351,1601],{"class":466},[379,2353,494],{"class":419},[379,2355,1924],{"class":466},[379,2357,883],{"class":419},[379,2359,972],{"class":385},[379,2361,570],{"class":419},[379,2363,1249],{"class":462},[379,2365,2366],{"class":466},"(userId)",[379,2368,535],{"class":419},[379,2370,2371,2373,2375,2377,2379,2381,2383],{"class":381,"line":630},[379,2372,1616],{"class":466},[379,2374,494],{"class":419},[379,2376,1621],{"class":466},[379,2378,584],{"class":419},[379,2380,1626],{"class":466},[379,2382,584],{"class":419},[379,2384,2385],{"class":466}," fetchStatus) {\n",[379,2387,2388,2391,2394,2396,2398,2400,2403,2406],{"class":381,"line":648},[379,2389,2390],{"class":458},"          final",[379,2392,2393],{"class":466}," user ",[379,2395,479],{"class":419},[379,2397,1626],{"class":466},[379,2399,570],{"class":419},[379,2401,2402],{"class":466},"dataOrNull",[379,2404,2405],{"class":419},";",[379,2407,2408],{"class":1674}," // kept during refetches and errors\n",[379,2410,2411,2414,2417,2420,2423],{"class":381,"line":653},[379,2412,2413],{"class":1024},"          if",[379,2415,2416],{"class":466}," (user ",[379,2418,2419],{"class":419},"==",[379,2421,2422],{"class":419}," null",[379,2424,2425],{"class":466},") {\n",[379,2427,2428,2431,2433],{"class":381,"line":659},[379,2429,2430],{"class":1024},"            return",[379,2432,1636],{"class":1024},[379,2434,1639],{"class":466},[379,2436,2437,2440,2442,2444,2446,2448,2450,2452,2454,2456,2458,2460,2463,2465,2467,2469,2471],{"class":381,"line":679},[379,2438,2439],{"class":385},"              Failure",[379,2441,565],{"class":466},[379,2443,494],{"class":419},[379,2445,1651],{"class":458},[379,2447,1749],{"class":466},[379,2449,883],{"class":419},[379,2451,1754],{"class":385},[379,2453,1757],{"class":466},[379,2455,494],{"class":419},[379,2457,1546],{"class":385},[379,2459,565],{"class":466},[379,2461,2462],{"class":389},"'Error: ",[379,2464,1066],{"class":466},[379,2466,1771],{"class":1069},[379,2468,1063],{"class":389},[379,2470,532],{"class":466},[379,2472,535],{"class":419},[379,2474,2475,2478,2480,2482,2484,2486,2488,2490,2492],{"class":381,"line":701},[379,2476,2477],{"class":466},"              _ ",[379,2479,883],{"class":419},[379,2481,497],{"class":458},[379,2483,1754],{"class":385},[379,2485,1757],{"class":466},[379,2487,494],{"class":419},[379,2489,1795],{"class":385},[379,2491,696],{"class":466},[379,2493,535],{"class":419},[379,2495,2496,2499],{"class":381,"line":1030},[379,2497,2498],{"class":466},"            }",[379,2500,420],{"class":419},[379,2502,2503],{"class":381,"line":1080},[379,2504,2505],{"class":466},"          }\n",[379,2507,2508,2511,2513,2515,2517,2519,2522,2524,2526,2528,2531,2533,2535,2537,2539,2542],{"class":381,"line":1135},[379,2509,2510],{"class":1024},"          return",[379,2512,2012],{"class":385},[379,2514,1539],{"class":466},[379,2516,494],{"class":419},[379,2518,1546],{"class":385},[379,2520,2521],{"class":466},"(user",[379,2523,570],{"class":419},[379,2525,2032],{"class":466},[379,2527,584],{"class":419},[379,2529,2530],{"class":466}," subtitle",[379,2532,494],{"class":419},[379,2534,1546],{"class":385},[379,2536,2521],{"class":466},[379,2538,570],{"class":419},[379,2540,2541],{"class":466},"email))",[379,2543,420],{"class":419},[379,2545,2546,2548],{"class":381,"line":1170},[379,2547,1804],{"class":466},[379,2549,535],{"class":419},[379,2551,2552,2554],{"class":381,"line":1224},[379,2553,955],{"class":466},[379,2555,535],{"class":419},[379,2557,2558,2560],{"class":381,"line":1230},[379,2559,541],{"class":466},[379,2561,420],{"class":419},[379,2563,2564],{"class":381,"line":1235},[379,2565,1227],{"class":466},[379,2567,2568],{"class":381,"line":1264},[379,2569,605],{"class":466},[348,2571,2572],{},"Run the app. Open a user, go back, open it again: the second time it appears instantly, with no spinner. It came from the cache.",[363,2574,2576],{"id":2575},"_5-take-it-offline","5. Take it offline",[348,2578,2579,2582,2583,2586,2587,2590,2591,2594],{},[376,2580,2581],{},"QoraScope.auto"," already tracks connectivity. While the device is offline, queries do not fail: they ",[1403,2584,2585],{},"pause",", and ",[376,2588,2589],{},"fetchStatus"," becomes ",[376,2592,2593],{},"FetchStatus.paused",". Show it in the list screen:",[368,2596,2598],{"className":402,"code":2597,"filename":1426,"language":405,"meta":374,"style":374},"builder: (context, state, fetchStatus) => Column(\n  children: [\n    if (fetchStatus == FetchStatus.paused)\n      Container(\n        width: double.infinity,\n        padding: const EdgeInsets.all(8),\n        color: Colors.amber.shade100,\n        child: const Text('You are offline. Showing saved data.'),\n      ),\n    Expanded(\n      child: switch (state) {\n        Success(:final data) => _UserList(users: data),\n        Loading(:final previousData?) => _UserList(users: previousData),\n        Failure(:final previousData?) => _UserList(users: previousData),\n        Failure(:final error) => Center(child: Text('Could not load users: $error')),\n        _ => const Center(child: CircularProgressIndicator()),\n      },\n    ),\n  ],\n),\n",[376,2599,2600,2623,2633,2650,2657,2674,2700,2722,2742,2748,2755,2765,2790,2819,2848,2884,2905,2912,2918,2925],{"__ignoreMap":374},[379,2601,2602,2604,2606,2608,2610,2612,2614,2616,2618,2621],{"class":381,"line":382},[379,2603,1972],{"class":466},[379,2605,494],{"class":419},[379,2607,1621],{"class":466},[379,2609,584],{"class":419},[379,2611,1626],{"class":466},[379,2613,584],{"class":419},[379,2615,1631],{"class":466},[379,2617,883],{"class":419},[379,2619,2620],{"class":385}," Column",[379,2622,485],{"class":466},[379,2624,2625,2628,2630],{"class":381,"line":423},[379,2626,2627],{"class":466},"  children",[379,2629,494],{"class":419},[379,2631,2632],{"class":466}," [\n",[379,2634,2635,2637,2640,2642,2645,2647],{"class":381,"line":433},[379,2636,1083],{"class":1024},[379,2638,2639],{"class":466}," (fetchStatus ",[379,2641,2419],{"class":419},[379,2643,2644],{"class":385}," FetchStatus",[379,2646,570],{"class":419},[379,2648,2649],{"class":466},"paused)\n",[379,2651,2652,2655],{"class":381,"line":440},[379,2653,2654],{"class":385},"      Container",[379,2656,485],{"class":466},[379,2658,2659,2662,2664,2667,2669,2672],{"class":381,"line":450},[379,2660,2661],{"class":466},"        width",[379,2663,494],{"class":419},[379,2665,2666],{"class":385}," double",[379,2668,570],{"class":419},[379,2670,2671],{"class":466},"infinity",[379,2673,535],{"class":419},[379,2675,2676,2679,2681,2683,2686,2688,2691,2693,2696,2698],{"class":381,"line":455},[379,2677,2678],{"class":466},"        padding",[379,2680,494],{"class":419},[379,2682,497],{"class":458},[379,2684,2685],{"class":385}," EdgeInsets",[379,2687,570],{"class":419},[379,2689,2690],{"class":462},"all",[379,2692,565],{"class":466},[379,2694,2695],{"class":412},"8",[379,2697,1130],{"class":466},[379,2699,535],{"class":419},[379,2701,2702,2705,2707,2710,2712,2715,2717,2720],{"class":381,"line":470},[379,2703,2704],{"class":466},"        color",[379,2706,494],{"class":419},[379,2708,2709],{"class":385}," Colors",[379,2711,570],{"class":419},[379,2713,2714],{"class":466},"amber",[379,2716,570],{"class":419},[379,2718,2719],{"class":466},"shade100",[379,2721,535],{"class":419},[379,2723,2724,2727,2729,2731,2733,2735,2738,2740],{"class":381,"line":488},[379,2725,2726],{"class":466},"        child",[379,2728,494],{"class":419},[379,2730,497],{"class":458},[379,2732,1546],{"class":385},[379,2734,565],{"class":466},[379,2736,2737],{"class":389},"'You are offline. Showing saved data.'",[379,2739,1130],{"class":466},[379,2741,535],{"class":419},[379,2743,2744,2746],{"class":381,"line":505},[379,2745,955],{"class":466},[379,2747,535],{"class":419},[379,2749,2750,2753],{"class":381,"line":538},[379,2751,2752],{"class":385},"    Expanded",[379,2754,485],{"class":466},[379,2756,2757,2759,2761,2763],{"class":381,"line":546},[379,2758,1962],{"class":466},[379,2760,494],{"class":419},[379,2762,1636],{"class":1024},[379,2764,1639],{"class":466},[379,2766,2767,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788],{"class":381,"line":554},[379,2768,2769],{"class":385},"        Success",[379,2771,565],{"class":466},[379,2773,494],{"class":419},[379,2775,1651],{"class":458},[379,2777,1654],{"class":466},[379,2779,883],{"class":419},[379,2781,1659],{"class":385},[379,2783,1662],{"class":466},[379,2785,494],{"class":419},[379,2787,1667],{"class":466},[379,2789,535],{"class":419},[379,2791,2792,2795,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815,2817],{"class":381,"line":559},[379,2793,2794],{"class":385},"        Loading",[379,2796,565],{"class":466},[379,2798,494],{"class":419},[379,2800,1651],{"class":458},[379,2802,1689],{"class":466},[379,2804,1692],{"class":419},[379,2806,1100],{"class":466},[379,2808,883],{"class":419},[379,2810,1659],{"class":385},[379,2812,1662],{"class":466},[379,2814,494],{"class":419},[379,2816,1705],{"class":466},[379,2818,535],{"class":419},[379,2820,2821,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2844,2846],{"class":381,"line":602},[379,2822,2823],{"class":385},"        Failure",[379,2825,565],{"class":466},[379,2827,494],{"class":419},[379,2829,1651],{"class":458},[379,2831,1689],{"class":466},[379,2833,1692],{"class":419},[379,2835,1100],{"class":466},[379,2837,883],{"class":419},[379,2839,1659],{"class":385},[379,2841,1662],{"class":466},[379,2843,494],{"class":419},[379,2845,1705],{"class":466},[379,2847,535],{"class":419},[379,2849,2850,2852,2854,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880,2882],{"class":381,"line":608},[379,2851,2823],{"class":385},[379,2853,565],{"class":466},[379,2855,494],{"class":419},[379,2857,1651],{"class":458},[379,2859,1749],{"class":466},[379,2861,883],{"class":419},[379,2863,1754],{"class":385},[379,2865,1757],{"class":466},[379,2867,494],{"class":419},[379,2869,1546],{"class":385},[379,2871,565],{"class":466},[379,2873,1766],{"class":389},[379,2875,1066],{"class":466},[379,2877,1771],{"class":1069},[379,2879,1063],{"class":389},[379,2881,532],{"class":466},[379,2883,535],{"class":419},[379,2885,2886,2889,2891,2893,2895,2897,2899,2901,2903],{"class":381,"line":613},[379,2887,2888],{"class":466},"        _ ",[379,2890,883],{"class":419},[379,2892,497],{"class":458},[379,2894,1754],{"class":385},[379,2896,1757],{"class":466},[379,2898,494],{"class":419},[379,2900,1795],{"class":385},[379,2902,696],{"class":466},[379,2904,535],{"class":419},[379,2906,2907,2910],{"class":381,"line":630},[379,2908,2909],{"class":466},"      }",[379,2911,535],{"class":419},[379,2913,2914,2916],{"class":381,"line":648},[379,2915,541],{"class":466},[379,2917,535],{"class":419},[379,2919,2920,2923],{"class":381,"line":653},[379,2921,2922],{"class":466},"  ]",[379,2924,535],{"class":419},[379,2926,2927,2929],{"class":381,"line":659},[379,2928,1130],{"class":466},[379,2930,535],{"class":419},[348,2932,2933],{},"Turn on airplane mode and pull to refresh: the list stays, the banner appears. Turn the network back on: the paused fetch runs by itself and the banner goes away.",[363,2935,2937],{"id":2936},"what-you-got-for-free","What you got for free",[2939,2940,2941,2954],"table",{},[2942,2943,2944],"thead",{},[2945,2946,2947,2951],"tr",{},[2948,2949,2950],"th",{},"Situation",[2948,2952,2953],{},"What Qora does",[2955,2956,2957,2973,2981,2989,2999,3007,3019,3027],"tbody",{},[2945,2958,2959,2963],{},[2960,2961,2962],"td",{},"First visit",[2960,2964,2965,2968,2969,2972],{},[376,2966,2967],{},"Loading",", then ",[376,2970,2971],{},"Success","; the result is cached under its key",[2945,2974,2975,2978],{},[2960,2976,2977],{},"Visit within 5 minutes",[2960,2979,2980],{},"Cached data on the first frame, no network call",[2945,2982,2983,2986],{},[2960,2984,2985],{},"Visit after 5 minutes",[2960,2987,2988],{},"Cached data on the first frame, refreshed in the background",[2945,2990,2991,2994],{},[2960,2992,2993],{},"Pull to refresh",[2960,2995,2996,2998],{},[376,2997,1942],{}," marks the key stale; the mounted builder refetches",[2945,3000,3001,3004],{},[2960,3002,3003],{},"Two widgets, same key",[2960,3005,3006],{},"One request, shared by both",[2945,3008,3009,3012],{},[2960,3010,3011],{},"Request fails",[2960,3013,3014,3015,3018],{},"Retried 3 times with backoff, then ",[376,3016,3017],{},"Failure"," with the previous data",[2945,3020,3021,3024],{},[2960,3022,3023],{},"Device offline",[2960,3025,3026],{},"Fetches pause and resume on reconnect; cached data stays on screen",[2945,3028,3029,3032],{},[2960,3030,3031],{},"App back from background",[2960,3033,3034],{},"Stale queries on screen refetch",[363,3036,3038],{"id":3037},"next-steps","Next steps",[3040,3041,3042,3049,3055,3061],"ul",{},[3043,3044,3045,3048],"li",{},[355,3046,144],{"href":3047},"../recipes/mutations",": write data and invalidate what changed",[3043,3050,3051,3054],{},[355,3052,153],{"href":3053},"../recipes/persistence",": keep the cache across app restarts",[3043,3056,3057,3060],{},[355,3058,57],{"href":3059},"../core-concepts/query-keys",": how to structure keys so invalidation stays easy",[3043,3062,3063,3067],{},[355,3064,3066],{"href":3065},"../examples/offline-first","Offline-First case study",": a full app that queues writes while offline",[3069,3070,3071],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .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":374,"searchDepth":423,"depth":423,"links":3073},[3074,3075,3076,3077,3078,3079,3080],{"id":365,"depth":423,"text":366},{"id":712,"depth":423,"text":713},{"id":1412,"depth":423,"text":1413},{"id":2162,"depth":423,"text":2163},{"id":2575,"depth":423,"text":2576},{"id":2936,"depth":423,"text":2937},{"id":3037,"depth":423,"text":3038},"Build a list and a detail screen backed by Qora, watch the cache work, then take the app offline.","md",null,{},{"icon":6},{"title":21,"description":3081},"5SvqPCZmJAt9EFxkLH4RCGYqzKBsxBhyBAAXOwI6EZo",[3089,3091],{"title":16,"path":17,"stem":18,"description":3090,"icon":19,"children":-1},"Add Qora to a Flutter app or a pure Dart project, and wire it in one widget.",{"title":25,"path":26,"stem":27,"description":3092,"icon":28,"children":-1},"How Qora compares to flutter_query and cached_query, the other server-state libraries for Flutter.",1794040396338]