Right deleting items from cart

This commit is contained in:
2024-05-07 16:51:58 +03:00
parent e4628e977f
commit fecc388e1c
4 changed files with 70 additions and 18 deletions

View File

@@ -5,7 +5,9 @@ class BasketItemCard extends StatelessWidget {
final String price; final String price;
final String id; final String id;
final Image image; final Image image;
final VoidCallback onTap; final String quantity;
final VoidCallback onTapPlus;
final VoidCallback onTapMinus;
const BasketItemCard({ const BasketItemCard({
super.key, super.key,
@@ -13,7 +15,9 @@ class BasketItemCard extends StatelessWidget {
required this.price, required this.price,
required this.id, required this.id,
required this.image, required this.image,
required this.onTap, required this.onTapPlus,
required this.quantity,
required this.onTapMinus,
}); });
@override @override
@@ -57,9 +61,21 @@ class BasketItemCard extends StatelessWidget {
) )
], ],
), ),
Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton( IconButton(
onPressed: onTap, icon: const Icon(Icons.remove),
icon: const Icon(Icons.close), onPressed: onTapMinus,
),
const SizedBox(width: 10),
Text(quantity),
const SizedBox(width: 10),
IconButton(
icon: const Icon(Icons.add),
onPressed: onTapPlus,
),
],
) )
], ],
), ),

View File

@@ -42,7 +42,6 @@ List<Map<String, dynamic>> cart = [
} }
]; ];
//TODO: Сделать правильное удаление из корзины по одному
class BasketPage extends StatefulWidget { class BasketPage extends StatefulWidget {
const BasketPage({super.key}); const BasketPage({super.key});
@@ -59,23 +58,52 @@ class _BasketPageState extends State<BasketPage> {
super.initState(); super.initState();
getCart().then((value) { getCart().then((value) {
setState(() { setState(() {
cartItems = cart cartItems = value.map((element) {
.where((element) => value.any((e) => e['id'] == element['id'])) final item = cart.firstWhere((e) => e['id'] == element['id']);
.toList(); return {...item, 'count': element['count'] as int};
totalPrice = }).toList();
cartItems.fold(0, (sum, item) => sum + int.parse(item['price'])); totalPrice = cartItems.fold(
0,
(sum, item) =>
sum + int.parse(item['price']) * item['count'] as int);
}); });
}); });
} }
void removeItem(String id) async { void removeItem(String id) async {
final item = cartItems.firstWhere((element) => element['id'] == id);
bool toDelete = false;
setState(() { setState(() {
cartItems.removeWhere((element) => element['id'] == id); if (item['count'] > 1) {
totalPrice = item['count']--;
cartItems.fold(0, (sum, item) => sum + int.parse(item['price'])); cartItems[cartItems.indexOf(item)]['count'] = item['count'];
} else {
toDelete = true;
}
totalPrice = cartItems.fold(0,
(sum, item) => sum + int.parse(item['price']) * item['count'] as int);
}); });
if (toDelete) {
await _deleteItemAlert(id, item['name']);
} else {
await removeItemFromCart(id); await removeItemFromCart(id);
} }
}
void addItem(String id) async {
setState(() {
final item = cartItems.firstWhere((element) => element['id'] == id,
orElse: () => {
...cart.firstWhere((element) => element['id'] == id),
'count': 0
});
item['count']++;
cartItems[cartItems.indexOf(item)]['count'] = item['count'];
totalPrice = cartItems.fold(0,
(sum, item) => sum + int.parse(item['price']) * item['count'] as int);
});
await addItemToCart(id);
}
Future<void> _deleteItemAlert(String id, String name) async { Future<void> _deleteItemAlert(String id, String name) async {
return showDialog<void>( return showDialog<void>(
@@ -101,7 +129,10 @@ class _BasketPageState extends State<BasketPage> {
TextButton( TextButton(
child: const Text('Удалить'), child: const Text('Удалить'),
onPressed: () { onPressed: () {
removeItem(id); removeItemFromCart(id);
setState(() {
cartItems.removeWhere((element) => element['id'] == id);
});
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
@@ -196,8 +227,10 @@ class _BasketPageState extends State<BasketPage> {
item['image'], item['image'],
width: 50, width: 50,
), ),
onTap: () => onTapPlus: () => addItem(item['id'].toString()),
_deleteItemAlert(item['id'], item['name']), onTapMinus: () =>
removeItem(item['id'].toString()),
quantity: item['count'].toString(),
); );
}, },
), ),

View File

@@ -78,7 +78,9 @@ class _DetailPageState extends State<DetailPage> {
}); });
}, },
), ),
const SizedBox(width: 10),
Text('$quantity'), Text('$quantity'),
const SizedBox(width: 10),
IconButton( IconButton(
icon: const Icon(Icons.add), icon: const Icon(Icons.add),
onPressed: () async { onPressed: () async {

View File

@@ -38,6 +38,7 @@ dependencies:
url_launcher: ^6.2.6 url_launcher: ^6.2.6
shared_preferences: ^2.2.3 shared_preferences: ^2.2.3
flutter_markdown: ^0.7.1 flutter_markdown: ^0.7.1
http: ^1.2.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: