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/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<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 {
final item = cartItems.firstWhere((element) => element['id'] == id);
bool toDelete = false;
@@ -136,6 +142,9 @@ class _BasketPageState extends State<BasketPage> {
setState(() {
cartItems.removeWhere((element) => element['id'] == id);
});
if (mounted) {
_updateCart();
}
Navigator.of(context).pop();
},
),
@@ -173,6 +182,9 @@ class _BasketPageState extends State<BasketPage> {
setState(() {
cartItems = [];
});
if (mounted) {
_updateCart();
}
Navigator.of(context).pop();
},
),

View File

@@ -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<DetailPage> {
isInCart = true;
quantity = 1;
});
if (mounted) {
context.read<CartProvider>().updateCartLength();
}
},
style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).primaryColor,
@@ -93,6 +98,9 @@ class _DetailPageState extends State<DetailPage> {
quantity = 0;
}
});
if (mounted) {
context.read<CartProvider>().updateCartLength();
}
},
),
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/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<Map<String, String>> testData = [
@@ -105,6 +107,7 @@ class _MainPageState extends State<MainPage> {
@override
Widget build(BuildContext context) {
final cartL = context.watch<CartProvider>().cartLength;
return Scaffold(
appBar: widget.isLoading ? null : const GymLinkAppBar(),
body: widget.isLoading
@@ -233,50 +236,49 @@ class _MainPageState extends State<MainPage> {
),
],
),
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,
);
}