From 384fbb057335ff8f4598aaff55684f42399b8401 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Thu, 22 Feb 2024 20:36:59 +0100 Subject: [PATCH] separate new item screen The edit item screen might be overwhelming at first, and if you only want to add simple items (by name) to the list, it is way easier to simply type the name and click create to create a simple item. After creating the item the user will be redirected (history replacement) to the edit screen, but clicking back will bring them back to the list. This screen also makes linking products easier and allows the user to create new products if they notice they are using the same item multiple times or can't be bothered to switch to the products tab --- lib/l10n/app_en.arb | 7 +- lib/main.dart | 3 +- lib/screens/room/items/edit.dart | 90 ++++------ lib/screens/room/items/new.dart | 285 +++++++++++++++++++++++++++++++ lib/screens/room/pages/list.dart | 2 +- pubspec.lock | 172 +++++++++---------- 6 files changed, 413 insertions(+), 146 deletions(-) create mode 100644 lib/screens/room/items/new.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a0977c8..047540a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -424,5 +424,10 @@ "moveItemToCartTitle": "Move to Cart", "moveItemToCartSubtitle": "Mark item as in-cart, so others know, you bought it", "removeItemFromCartTitle": "Remove from Cart", - "removeItemFromCartSubtitle": "Remove item from shopping cart, so others know, that you still need it" + "removeItemFromCartSubtitle": "Remove item from shopping cart, so others know, that you still need it", + + "newItemQueryEmpty": "Type to show quick access buttons", + "newItemQueryHint": "Type item or product name", + "newItemQuickAccessPrefix": "Create:", + "newItemQuickProduct": "product: {text}" } diff --git a/lib/main.dart b/lib/main.dart index a6f161c..c8f6444 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,7 @@ import 'package:outbag_app/backend/user.dart'; import 'package:outbag_app/backend/request.dart'; import 'package:outbag_app/screens/room/categories/edit.dart'; import 'package:outbag_app/screens/room/items/edit.dart'; +import 'package:outbag_app/screens/room/items/new.dart'; import 'package:outbag_app/screens/room/products/edit.dart'; import 'package:outbag_app/screens/room/products/view.dart'; @@ -306,7 +307,7 @@ class _OutbagAppState extends State { GoRoute( name: 'new-item', path: 'new-item', - builder: (context, state) => EditItemPage( + builder: (context, state) => NewItemPage( server: state.params['server'] ?? '', room: state.params['id'] ?? '', diff --git a/lib/screens/room/items/edit.dart b/lib/screens/room/items/edit.dart index d95c857..79717dd 100644 --- a/lib/screens/room/items/edit.dart +++ b/lib/screens/room/items/edit.dart @@ -14,10 +14,13 @@ class EditItemPage extends StatefulWidget { final String room; final String server; - final int? item; + final int item; const EditItemPage( - {super.key, required this.room, required this.server, this.item}); + {super.key, + required this.room, + required this.server, + required this.item}); @override State createState() => _EditItemPageState(); @@ -31,6 +34,7 @@ class _EditItemPageState extends State { int _ctrUnit = 0; String _ctrValue = ''; int? _ctrLink; + int _ctrState = 0; // data cache List categories = []; @@ -100,6 +104,13 @@ class _EditItemPageState extends State { final resp = RoomItem.fromJSON(body['data']); setState(() { item = resp; + _ctrName.text = resp.name; + _ctrDescription.text = resp.description; + _ctrValue = resp.value; + _ctrCategory = resp.category; + _ctrLink = resp.link; + _ctrUnit = resp.unit; + _ctrState = resp.state; }); }); } @@ -112,9 +123,7 @@ class _EditItemPageState extends State { fetchCategories(); fetchProducts(); - if (widget.item != null) { - fetchItem(); - } + fetchItem(); }); } @@ -122,9 +131,7 @@ class _EditItemPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text((widget.item == null) - ? AppLocalizations.of(context)!.createItem - : AppLocalizations.of(context)!.editItem), + title: Text(AppLocalizations.of(context)!.editItem), ), body: SingleChildScrollView( child: Center( @@ -227,52 +234,29 @@ class _EditItemPageState extends State { final user = context.read(); - if (widget.item == null) { - doNetworkRequest(scaffMgr, - req: () => postWithCreadentials( - credentials: user, - target: user.server, - path: 'addItem', - body: { - 'room': widget.room, - 'server': widget.server, - 'state': 0, - 'title': _ctrName.text, - 'description': _ctrDescription.text, - 'listCatID': _ctrCategory, - 'unit': _ctrUnit, - 'value': _ctrValue, - 'listProdID': _ctrLink - }), - onOK: (_) async { - nav.pop(); - }); - } else { - doNetworkRequest(scaffMgr, - req: () => postWithCreadentials( - credentials: user, - target: user.server, - path: 'changeItem', - body: { - 'listItemID': widget.item, - 'room': widget.room, - 'server': widget.server, - 'title': _ctrName.text, - 'description': _ctrDescription.text, - 'listCatID': _ctrCategory, - 'defUnit': _ctrUnit, - 'defValue': _ctrValue, - 'listProdID': _ctrLink - }), - onOK: (_) async { - nav.pop(); - }); - } + doNetworkRequest(scaffMgr, + req: () => postWithCreadentials( + credentials: user, + target: user.server, + path: 'changeItem', + body: { + 'listItemID': widget.item, + 'room': widget.room, + 'server': widget.server, + 'title': _ctrName.text, + 'state': _ctrState, + 'description': _ctrDescription.text, + 'listCatID': _ctrCategory, + 'unit': _ctrUnit, + 'value': _ctrValue, + 'listProdID': _ctrLink + }), + onOK: (_) async { + nav.pop(); + }); }, - label: Text(widget.item != null - ? AppLocalizations.of(context)!.editItemShort - : AppLocalizations.of(context)!.createItemShort), - icon: Icon(widget.item != null ? Icons.edit : Icons.add)), + label: Text(AppLocalizations.of(context)!.editItemShort), + icon: const Icon(Icons.edit)), ); } } diff --git a/lib/screens/room/items/new.dart b/lib/screens/room/items/new.dart new file mode 100644 index 0000000..47ee511 --- /dev/null +++ b/lib/screens/room/items/new.dart @@ -0,0 +1,285 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:go_router/go_router.dart'; +import 'package:outbag_app/backend/request.dart'; +import 'package:outbag_app/backend/room.dart'; +import 'package:outbag_app/backend/user.dart'; +import 'package:outbag_app/components/category_chip.dart'; +import 'package:outbag_app/tools/fetch_wrapper.dart'; +import 'package:provider/provider.dart'; + +class NewItemPage extends StatefulWidget { + final String room; + final String server; + + final int? item; + + const NewItemPage( + {super.key, required this.room, required this.server, this.item}); + + @override + State createState() => _NewItemPageState(); +} + +class _NewItemPageState extends State { + // input controllers + final _ctrInput = TextEditingController(); + + // data cache + List categories = []; + List products = []; + RoomItem? item; + + void fetchCategories() { + final user = context.read(); + + // TODO: load cached categories first + + doNetworkRequest(ScaffoldMessenger.of(context), + req: () => postWithCreadentials( + credentials: user, + target: user.server, + path: 'getCategories', + body: {'room': widget.room, 'server': widget.server}), + onOK: (body) async { + final resp = body['data'] + .map((raw) => RoomCategory.fromJSON(raw)) + .toList(); + + setState(() { + categories = resp; + }); + }); + } + + void fetchProducts() { + final user = context.read(); + + // TODO: load cached products first + + doNetworkRequest(ScaffoldMessenger.of(context), + req: () => postWithCreadentials( + credentials: user, + target: user.server, + path: 'getProducts', + body: {'room': widget.room, 'server': widget.server}), + onOK: (body) async { + final resp = body['data'] + .map((raw) => RoomProduct.fromJSON(raw)) + .toList(); + + setState(() { + products = resp; + }); + }); + } + + void fetchItem() { + final user = context.read(); + + // TODO: load cached item first + + doNetworkRequest(ScaffoldMessenger.of(context), + req: () => postWithCreadentials( + credentials: user, + target: user.server, + path: 'getItem', + body: { + 'room': widget.room, + 'server': widget.server, + 'listItemID': widget.item + }), + onOK: (body) async { + final resp = RoomItem.fromJSON(body['data']); + setState(() { + item = resp; + }); + }); + } + + @override + void initState() { + super.initState(); + + WidgetsBinding.instance.addPostFrameCallback((_) { + fetchCategories(); + fetchProducts(); + + if (widget.item != null) { + fetchItem(); + } + }); + } + + String _query = ""; + + void createItem(BuildContext ctx, String name, int? productID) { + final scaffMgr = ScaffoldMessenger.of(context); + final router = GoRouter.of(context); + final user = context.read(); + + doNetworkRequest(scaffMgr, + req: () => postWithCreadentials( + target: user.server, + credentials: user, + path: 'addItem', + body: { + 'room': widget.room, + 'server': widget.server, + 'state': 0, + 'title': name, + 'description': '', + 'listCatID': null, + 'unit': 0, + 'value': '', + 'listProdID': productID + }), + onOK: (body) async { + final id = body["data"]["listItemID"]; + // TODO cache item + // launch edit item screen + router.pushReplacementNamed('edit-item', params: { + 'server': widget.server, + 'id': widget.room, + 'item': id.toString() + }); + }); + } + + void createProduct(BuildContext ctx, String name, Function(int) cb) { + final scaffMgr = ScaffoldMessenger.of(context); + final user = context.read(); + + doNetworkRequest(scaffMgr, + req: () => postWithCreadentials( + target: user.server, + credentials: user, + path: 'addProduct', + body: { + 'room': widget.room, + 'server': widget.server, + 'title': name, + 'description': '', + 'listCatID': null, + 'defUnit': 0, + 'defValue': '', + 'ean': '', + 'parent': null + }), + onOK: (body) async { + final id = body["data"]["listProdID"]; + // TODO: cache product + cb(id); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text((widget.item == null) + ? AppLocalizations.of(context)!.createItem + : AppLocalizations.of(context)!.editItem), + ), + body: SingleChildScrollView( + child: Center( + child: Padding( + padding: const EdgeInsets.all(14), + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 400), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SearchBar( + controller: _ctrInput, + leading: const Icon(Icons.search), + hintText: + AppLocalizations.of(context)!.newItemQueryHint, + onChanged: (text) { + setState(() { + _query = text; + }); + }, + ), + const Divider(), + // button bar + ...((_query == "") + ? ([ + Text(AppLocalizations.of(context)! + .newItemQueryEmpty) + ]) + : ([ + Wrap( + spacing: 20, + runSpacing: 10, + alignment: WrapAlignment.center, + crossAxisAlignment: + WrapCrossAlignment.center, + children: [ + Text(AppLocalizations.of(context)! + .newItemQuickAccessPrefix), + // new item + FilledButton.icon( + onPressed: () { + // create new named item + // launch edit item screen once done + createItem(context, _query, null); + }, + icon: const Icon(Icons.add), + label: Text(_query)), + // new product + FilledButton.icon( + onPressed: () { + // create new product with name, + // create new item with name + // and link to the created product + // launch edit item screen once done + createProduct( + context, + _query, + (p0) => createItem( + context, _query, p0)); + }, + icon: const Icon(Icons.add), + label: Text(AppLocalizations.of( + context)! + .newItemQuickProduct(_query))), + ]) + ])), + const Divider(), + // link products search + ...((products + // show all products if query is empty + // when query isn't empty show products + // that contain the query in the title + // or description + .where((element) => + (_query == "") || + element.name.contains(_query) || + element.description.contains(_query)) + .map((e) => ListTile( + title: Text(e.name), + subtitle: Text(e.description), + trailing: CategoryChip( + category: categories + .where((element) => + element.id == e.category) + .firstOrNull ?? + RoomCategory.other(context), + ), + onTap: () { + // create new item and link it to the product + // launch edit item screen once done + createItem( + context, + // use productname as item name + e.name, + e.id); + }, + )))) + ], + ))))), + ); + } +} diff --git a/lib/screens/room/pages/list.dart b/lib/screens/room/pages/list.dart index 439e1ca..1acf73d 100644 --- a/lib/screens/room/pages/list.dart +++ b/lib/screens/room/pages/list.dart @@ -445,7 +445,7 @@ class ShoppingListItemInfo extends StatelessWidget { subtitle: Text(AppLocalizations.of(context)!.editItemLong), trailing: const Icon(Icons.chevron_right), onTap: () { - context.pushNamed('edit-product', params: { + context.pushNamed('edit-item', params: { 'server': server, 'id': room, 'item': item.id.toString() diff --git a/pubspec.lock b/pubspec.lock index f347139..56a2f16 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: archive - sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d + sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" url: "https://pub.dev" source: hosted - version: "3.3.6" + version: "3.4.9" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.2" async: dependency: transitive description: @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" cli_util: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: "direct main" description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" fake_async: dependency: transitive description: @@ -101,18 +101,18 @@ packages: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.0" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" flutter: dependency: "direct main" description: flutter @@ -130,10 +130,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" flutter_localizations: dependency: "direct main" description: flutter @@ -143,10 +143,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: "12006889e2987c549c4c1ec1a5ba4ec4b24d34d2469ee5f9476c926dcecff266" + sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.9" flutter_test: dependency: "direct dev" description: flutter @@ -161,18 +161,18 @@ packages: dependency: "direct main" description: name: go_router - sha256: "432409518740645ce7f28802171b78783197d01149fad44f9b8ae55f40277139" + sha256: bd7e671d26fd39c78cba82070fa34ef1f830b0e7ed1aeebccabc6561302a7ee5 url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "6.5.9" http: dependency: "direct main" description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "0.13.6" http_parser: dependency: transitive description: @@ -185,10 +185,10 @@ packages: dependency: transitive description: name: image - sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227" + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.0.15" + version: "4.1.3" intl: dependency: "direct main" description: @@ -209,18 +209,18 @@ packages: dependency: transitive description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.8.1" lints: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" localstore: dependency: "direct main" description: @@ -233,10 +233,10 @@ packages: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" matcher: dependency: transitive description: @@ -289,154 +289,146 @@ packages: dependency: transitive description: name: path_provider - sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9" + sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa url: "https://pub.dev" source: hosted - version: "2.0.13" + version: "2.1.1" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" + sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72 url: "https://pub.dev" source: hosted - version: "2.0.24" + version: "2.2.1" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "12eee51abdf4d34c590f043f45073adbb45514a108bd9db4491547a2fd891059" + sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 url: "https://pub.dev" source: hosted - version: "2.1.10" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.1.1" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.1" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "6.0.2" platform: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.7" pointycastle: dependency: transitive description: name: pointycastle - sha256: ae73e842cdd27a3467a71d70cefd9b198538aab4fc7dde1d0e8c78c96225abf0 + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" url: "https://pub.dev" source: hosted - version: "3.7.1" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" - source: hosted - version: "4.2.4" + version: "3.7.3" provider: dependency: "direct main" description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.1" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "78528fd87d0d08ffd3e69551173c026e8eacc7b7079c82eb6a77413957b7e394" + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" url: "https://pub.dev" source: hosted - version: "2.0.20" + version: "2.2.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: ad423a80fe7b4e48b50d6111b3ea1027af0e959e49d485712e134863d9c1c521 + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.2.1" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "1e755f8583229f185cfca61b1d80fb2344c9d660e1c69ede5450d8f478fa5310" + sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.3.4" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "3a59ed10890a8409ad0faad7bb2957dab4b92b8fbe553257b05d30ed8af2c707" + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.3.2" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "824bfd02713e37603b2bdade0842e47d56e7db32b1dcdd1cae533fb88e2913fc" + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.3.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "0dc2633f215a3d4aa3184c9b2c5766f4711e4e5a6b256e62aafee41f89f1bfb8" + sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.2.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "71bcd669bb9cdb6b39f22c4a7728b6d49e934f6cba73157ffa5a54f1eed67436" + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.3.2" sky_engine: dependency: transitive description: flutter @@ -494,34 +486,34 @@ packages: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: "4cf8e60dbe4d3a693d37dff11255a172594c0793da542183cbfe7fe978ae4aaa" + sha256: "0f0c746dd2d6254a0057218ff980fc7f5670fd0fcf5e4db38a490d31eed4ad43" url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.1.9+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "278ad5f816f58b1967396d1f78ced470e3e58c9fe4b27010102c0a595c764468" + sha256: "0edf6d630d1bfd5589114138ed8fada3234deacc37966bec033d3047c29248b7" url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.1.9+1" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "0bf61ad56e6fd6688a2865d3ceaea396bc6a0a90ea0d7ad5049b1b76c09d6163" + sha256: d24333727332d9bd20990f1483af4e09abdb9b1fc7c3db940b56ab5c42790c26 url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.1.9+1" vector_math: dependency: transitive description: @@ -542,34 +534,34 @@ packages: dependency: transitive description: name: win32 - sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 + sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574 url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "5.1.1" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 + sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.3" xml: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.5.0" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=3.7.0-0" + dart: ">=3.2.0 <4.0.0" + flutter: ">=3.16.0"