Add: CartProvider

This commit is contained in:
2024-05-15 13:49:18 +03:00
parent e52357edf5
commit c54176212a
5 changed files with 89 additions and 54 deletions

View File

@@ -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/basket_item_card.dart';
import 'package:gymlink_module_web/components/heading.dart'; import 'package:gymlink_module_web/components/heading.dart';
import 'package:gymlink_module_web/pages/order_confirmation.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/prefs.dart';
import 'package:gymlink_module_web/tools/routes.dart'; import 'package:gymlink_module_web/tools/routes.dart';
import 'package:lazy_load_scrollview/lazy_load_scrollview.dart'; import 'package:lazy_load_scrollview/lazy_load_scrollview.dart';
import 'package:provider/provider.dart';
List<Map<String, dynamic>> cart = [ List<Map<String, dynamic>> cart = [
{ {
@@ -73,6 +75,10 @@ class _BasketPageState extends State<BasketPage> {
}); });
} }
void _updateCart() {
Provider.of<CartProvider>(context, listen: false).updateCartLength();
}
void removeItem(String id) async { void removeItem(String id) async {
final item = cartItems.firstWhere((element) => element['id'] == id); final item = cartItems.firstWhere((element) => element['id'] == id);
bool toDelete = false; bool toDelete = false;
@@ -136,6 +142,9 @@ class _BasketPageState extends State<BasketPage> {
setState(() { setState(() {
cartItems.removeWhere((element) => element['id'] == id); cartItems.removeWhere((element) => element['id'] == id);
}); });
if (mounted) {
_updateCart();
}
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
@@ -173,6 +182,9 @@ class _BasketPageState extends State<BasketPage> {
setState(() { setState(() {
cartItems = []; cartItems = [];
}); });
if (mounted) {
_updateCart();
}
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),

View File

@@ -1,7 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gymlink_module_web/components/app_bar.dart'; import 'package:gymlink_module_web/components/app_bar.dart';
import 'package:gymlink_module_web/components/heading.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:gymlink_module_web/tools/prefs.dart';
import 'package:provider/provider.dart';
//TODO: Сделать получение инфы через объект //TODO: Сделать получение инфы через объект
class DetailPage extends StatefulWidget { class DetailPage extends StatefulWidget {
@@ -67,6 +69,9 @@ class _DetailPageState extends State<DetailPage> {
isInCart = true; isInCart = true;
quantity = 1; quantity = 1;
}); });
if (mounted) {
context.read<CartProvider>().updateCartLength();
}
}, },
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).primaryColor, backgroundColor: Theme.of(context).primaryColor,
@@ -93,6 +98,9 @@ class _DetailPageState extends State<DetailPage> {
quantity = 0; quantity = 0;
} }
}); });
if (mounted) {
context.read<CartProvider>().updateCartLength();
}
}, },
), ),
const SizedBox(width: 10), const SizedBox(width: 10),

View File

@@ -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/basket.dart';
import 'package:gymlink_module_web/pages/detail.dart'; import 'package:gymlink_module_web/pages/detail.dart';
import 'package:gymlink_module_web/pages/order_history.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/prefs.dart';
import 'package:gymlink_module_web/tools/relative.dart'; import 'package:gymlink_module_web/tools/relative.dart';
import 'package:gymlink_module_web/tools/routes.dart'; import 'package:gymlink_module_web/tools/routes.dart';
import 'package:lazy_load_scrollview/lazy_load_scrollview.dart'; import 'package:lazy_load_scrollview/lazy_load_scrollview.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
const List<Map<String, String>> testData = [ const List<Map<String, String>> testData = [
@@ -105,6 +107,7 @@ class _MainPageState extends State<MainPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final cartL = context.watch<CartProvider>().cartLength;
return Scaffold( return Scaffold(
appBar: widget.isLoading ? null : const GymLinkAppBar(), appBar: widget.isLoading ? null : const GymLinkAppBar(),
body: widget.isLoading body: widget.isLoading
@@ -233,14 +236,16 @@ class _MainPageState extends State<MainPage> {
), ),
], ],
), ),
floatingActionButton: SizedBox( floatingActionButton: !widget.isLoading
? SizedBox(
height: 80, height: 80,
width: 80, width: 80,
child: FittedBox( child: FittedBox(
child: Stack( child: Stack(
children: [ children: [
FloatingActionButton( FloatingActionButton(
onPressed: () => Navigator.of(context).push(CustomPageRoute( onPressed: () =>
Navigator.of(context).push(CustomPageRoute(
builder: (context) => const BasketPage(), builder: (context) => const BasketPage(),
)), )),
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@@ -251,11 +256,7 @@ class _MainPageState extends State<MainPage> {
foregroundColor: Colors.white, foregroundColor: Colors.white,
child: const Icon(Icons.shopping_cart_outlined)), child: const Icon(Icons.shopping_cart_outlined)),
), ),
/** cartL > 0
* Загадочная штука, надо переделать
* TODO: По идее надо через провайдер сделать, но не пойму как это сделать
*/
cartLength > 0
? Positioned( ? Positioned(
right: -3, right: -3,
bottom: 0, bottom: 0,
@@ -265,7 +266,7 @@ class _MainPageState extends State<MainPage> {
width: 20, width: 20,
child: Center( child: Center(
child: Text( child: Text(
cartLength.toString(), cartL.toString(),
style: const TextStyle(color: Colors.white), style: const TextStyle(color: Colors.white),
), ),
), ),
@@ -276,7 +277,8 @@ class _MainPageState extends State<MainPage> {
], ],
), ),
), ),
), )
: null,
floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, floatingActionButtonLocation: FloatingActionButtonLocation.startFloat,
); );
} }

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gymlink_module_web/main_mobile.dart'; import 'package:gymlink_module_web/main_mobile.dart';
import 'package:gymlink_module_web/pages/main.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:gymlink_module_web/providers/main.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -8,12 +9,19 @@ class MyAppStateMobile extends State<MyApp> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<GymLinkProvider>( return Consumer<GymLinkProvider>(
builder: (context, provider, __) => MaterialApp( builder: (context, provider, __) {
final theme = provider.theme;
final isLoading = provider.isLoading;
return ChangeNotifierProvider(
create: (_) => CartProvider(),
builder: (context, __) => MaterialApp(
title: 'GymLink Module', title: 'GymLink Module',
theme: provider.theme, theme: theme,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
home: MainPage(isLoading: provider.isLoading), home: MainPage(isLoading: isLoading),
), ),
); );
},
);
} }
} }

View File

@@ -5,7 +5,9 @@ import 'dart:js_interop_unsafe' as js_util;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gymlink_module_web/main.dart'; import 'package:gymlink_module_web/main.dart';
import 'package:gymlink_module_web/pages/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:gymlink_module_web/theme.dart';
import 'package:provider/provider.dart';
@js.JSExport() @js.JSExport()
class MyAppStateWeb extends State<MyApp> { class MyAppStateWeb extends State<MyApp> {
@@ -30,11 +32,14 @@ class MyAppStateWeb extends State<MyApp> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return ChangeNotifierProvider(
create: (_) => CartProvider(),
child: MaterialApp(
title: 'GymLink Module', title: 'GymLink Module',
theme: theme, theme: theme,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
home: MainPage(isLoading: _isLoading), home: MainPage(isLoading: _isLoading),
),
); );
} }