diff --git a/lib/pages/basket.dart b/lib/pages/basket.dart index 9936d14..b2b0a99 100644 --- a/lib/pages/basket.dart +++ b/lib/pages/basket.dart @@ -3,9 +3,11 @@ import 'package:gymlink_module_web/components/app_bar.dart'; import 'package:gymlink_module_web/components/basket_item_card.dart'; import 'package:gymlink_module_web/components/heading.dart'; import 'package:gymlink_module_web/pages/order_confirmation.dart'; +import 'package:gymlink_module_web/providers/cart.dart'; import 'package:gymlink_module_web/tools/prefs.dart'; import 'package:gymlink_module_web/tools/routes.dart'; import 'package:lazy_load_scrollview/lazy_load_scrollview.dart'; +import 'package:provider/provider.dart'; List> cart = [ { @@ -73,6 +75,10 @@ class _BasketPageState extends State { }); } + void _updateCart() { + Provider.of(context, listen: false).updateCartLength(); + } + void removeItem(String id) async { final item = cartItems.firstWhere((element) => element['id'] == id); bool toDelete = false; @@ -136,6 +142,9 @@ class _BasketPageState extends State { setState(() { cartItems.removeWhere((element) => element['id'] == id); }); + if (mounted) { + _updateCart(); + } Navigator.of(context).pop(); }, ), @@ -173,6 +182,9 @@ class _BasketPageState extends State { setState(() { cartItems = []; }); + if (mounted) { + _updateCart(); + } Navigator.of(context).pop(); }, ), diff --git a/lib/pages/detail.dart b/lib/pages/detail.dart index 301644e..4675afa 100644 --- a/lib/pages/detail.dart +++ b/lib/pages/detail.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:gymlink_module_web/components/app_bar.dart'; import 'package:gymlink_module_web/components/heading.dart'; +import 'package:gymlink_module_web/providers/cart.dart'; import 'package:gymlink_module_web/tools/prefs.dart'; +import 'package:provider/provider.dart'; //TODO: Сделать получение инфы через объект class DetailPage extends StatefulWidget { @@ -67,6 +69,9 @@ class _DetailPageState extends State { isInCart = true; quantity = 1; }); + if (mounted) { + context.read().updateCartLength(); + } }, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).primaryColor, @@ -93,6 +98,9 @@ class _DetailPageState extends State { quantity = 0; } }); + if (mounted) { + context.read().updateCartLength(); + } }, ), const SizedBox(width: 10), diff --git a/lib/pages/main.dart b/lib/pages/main.dart index e3ea23d..0aecf6a 100644 --- a/lib/pages/main.dart +++ b/lib/pages/main.dart @@ -6,10 +6,12 @@ import 'package:gymlink_module_web/components/item_card.dart'; import 'package:gymlink_module_web/pages/basket.dart'; import 'package:gymlink_module_web/pages/detail.dart'; import 'package:gymlink_module_web/pages/order_history.dart'; +import 'package:gymlink_module_web/providers/cart.dart'; import 'package:gymlink_module_web/tools/prefs.dart'; import 'package:gymlink_module_web/tools/relative.dart'; import 'package:gymlink_module_web/tools/routes.dart'; import 'package:lazy_load_scrollview/lazy_load_scrollview.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; const List> testData = [ @@ -105,6 +107,7 @@ class _MainPageState extends State { @override Widget build(BuildContext context) { + final cartL = context.watch().cartLength; return Scaffold( appBar: widget.isLoading ? null : const GymLinkAppBar(), body: widget.isLoading @@ -233,50 +236,49 @@ class _MainPageState extends State { ), ], ), - floatingActionButton: SizedBox( - height: 80, - width: 80, - child: FittedBox( - child: Stack( - children: [ - FloatingActionButton( - onPressed: () => Navigator.of(context).push(CustomPageRoute( - builder: (context) => const BasketPage(), - )), - backgroundColor: Colors.transparent, - elevation: 0, - child: CircleAvatar( - radius: 25, - backgroundColor: Theme.of(context).primaryColor, - foregroundColor: Colors.white, - child: const Icon(Icons.shopping_cart_outlined)), - ), - /** - * Загадочная штука, надо переделать - * TODO: По идее надо через провайдер сделать, но не пойму как это сделать - */ - cartLength > 0 - ? Positioned( - right: -3, - bottom: 0, - child: Card( - color: Colors.red, - child: SizedBox( - width: 20, - child: Center( - child: Text( - cartLength.toString(), - style: const TextStyle(color: Colors.white), + floatingActionButton: !widget.isLoading + ? SizedBox( + height: 80, + width: 80, + child: FittedBox( + child: Stack( + children: [ + FloatingActionButton( + onPressed: () => + Navigator.of(context).push(CustomPageRoute( + builder: (context) => const BasketPage(), + )), + backgroundColor: Colors.transparent, + elevation: 0, + child: CircleAvatar( + radius: 25, + backgroundColor: Theme.of(context).primaryColor, + foregroundColor: Colors.white, + child: const Icon(Icons.shopping_cart_outlined)), + ), + cartL > 0 + ? Positioned( + right: -3, + bottom: 0, + child: Card( + color: Colors.red, + child: SizedBox( + width: 20, + child: Center( + child: Text( + cartL.toString(), + style: const TextStyle(color: Colors.white), + ), + ), + ), ), - ), - ), - ), - ) - : const SizedBox.shrink(), - ], - ), - ), - ), + ) + : const SizedBox.shrink(), + ], + ), + ), + ) + : null, floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } diff --git a/lib/states/mobile.dart b/lib/states/mobile.dart index 072e3f2..bdbe5d2 100644 --- a/lib/states/mobile.dart +++ b/lib/states/mobile.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gymlink_module_web/main_mobile.dart'; import 'package:gymlink_module_web/pages/main.dart'; +import 'package:gymlink_module_web/providers/cart.dart'; import 'package:gymlink_module_web/providers/main.dart'; import 'package:provider/provider.dart'; @@ -8,12 +9,19 @@ class MyAppStateMobile extends State { @override Widget build(BuildContext context) { return Consumer( - builder: (context, provider, __) => MaterialApp( - title: 'GymLink Module', - theme: provider.theme, - debugShowCheckedModeBanner: false, - home: MainPage(isLoading: provider.isLoading), - ), + builder: (context, provider, __) { + final theme = provider.theme; + final isLoading = provider.isLoading; + return ChangeNotifierProvider( + create: (_) => CartProvider(), + builder: (context, __) => MaterialApp( + title: 'GymLink Module', + theme: theme, + debugShowCheckedModeBanner: false, + home: MainPage(isLoading: isLoading), + ), + ); + }, ); } } diff --git a/lib/states/web.dart b/lib/states/web.dart index 39c6e7b..fabf884 100644 --- a/lib/states/web.dart +++ b/lib/states/web.dart @@ -5,7 +5,9 @@ import 'dart:js_interop_unsafe' as js_util; import 'package:flutter/material.dart'; import 'package:gymlink_module_web/main.dart'; import 'package:gymlink_module_web/pages/main.dart'; +import 'package:gymlink_module_web/providers/cart.dart'; import 'package:gymlink_module_web/theme.dart'; +import 'package:provider/provider.dart'; @js.JSExport() class MyAppStateWeb extends State { @@ -30,11 +32,14 @@ class MyAppStateWeb extends State { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'GymLink Module', - theme: theme, - debugShowCheckedModeBanner: false, - home: MainPage(isLoading: _isLoading), + return ChangeNotifierProvider( + create: (_) => CartProvider(), + child: MaterialApp( + title: 'GymLink Module', + theme: theme, + debugShowCheckedModeBanner: false, + home: MainPage(isLoading: _isLoading), + ), ); }