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 id;
final Image image;
final VoidCallback onTap;
final String quantity;
final VoidCallback onTapPlus;
final VoidCallback onTapMinus;
const BasketItemCard({
super.key,
@@ -13,7 +15,9 @@ class BasketItemCard extends StatelessWidget {
required this.price,
required this.id,
required this.image,
required this.onTap,
required this.onTapPlus,
required this.quantity,
required this.onTapMinus,
});
@override
@@ -57,9 +61,21 @@ class BasketItemCard extends StatelessWidget {
)
],
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: onTap,
icon: const Icon(Icons.close),
icon: const Icon(Icons.remove),
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 {
const BasketPage({super.key});
@@ -59,23 +58,52 @@ class _BasketPageState extends State<BasketPage> {
super.initState();
getCart().then((value) {
setState(() {
cartItems = cart
.where((element) => value.any((e) => e['id'] == element['id']))
.toList();
totalPrice =
cartItems.fold(0, (sum, item) => sum + int.parse(item['price']));
cartItems = value.map((element) {
final item = cart.firstWhere((e) => e['id'] == element['id']);
return {...item, 'count': element['count'] as int};
}).toList();
totalPrice = cartItems.fold(
0,
(sum, item) =>
sum + int.parse(item['price']) * item['count'] as int);
});
});
}
void removeItem(String id) async {
final item = cartItems.firstWhere((element) => element['id'] == id);
bool toDelete = false;
setState(() {
cartItems.removeWhere((element) => element['id'] == id);
totalPrice =
cartItems.fold(0, (sum, item) => sum + int.parse(item['price']));
if (item['count'] > 1) {
item['count']--;
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);
}
}
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 {
return showDialog<void>(
@@ -101,7 +129,10 @@ class _BasketPageState extends State<BasketPage> {
TextButton(
child: const Text('Удалить'),
onPressed: () {
removeItem(id);
removeItemFromCart(id);
setState(() {
cartItems.removeWhere((element) => element['id'] == id);
});
Navigator.of(context).pop();
},
),
@@ -196,8 +227,10 @@ class _BasketPageState extends State<BasketPage> {
item['image'],
width: 50,
),
onTap: () =>
_deleteItemAlert(item['id'], item['name']),
onTapPlus: () => addItem(item['id'].toString()),
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'),
const SizedBox(width: 10),
IconButton(
icon: const Icon(Icons.add),
onPressed: () async {

View File

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