Right deleting items from cart
This commit is contained in:
@@ -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,
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
|
||||
@@ -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(),
|
||||
);
|
||||
},
|
||||
),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user