#flutter #dart
#трепетание #dart
Вопрос:
Как мне получить общую цену всех товаров в корзине?
Я хочу получить общую цену всех товаров в корзине после добавления товаров в корзину. Цена также должна увеличиваться при увеличении количества каждого товара, а также уменьшаться при уменьшении количества. Пожалуйста, помогите мне с этим,
Код для класса cart приведен ниже.
Класс корзины
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'dish_object.dart';
class Cart extends StatefulWidget {
final List<Dish> _cart;
Cart(this._cart);
@override
_CartState createState() => _CartState(this._cart);
}
class _CartState extends State<Cart> {
_CartState(this._cart);
List<Dish> _cart;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Cart'),
actions: <Widget>[
IconButton(
icon: Icon(Icons.send_rounded),
tooltip: "Confirm Order",
onPressed: () {
if (_cart.isNotEmpty) {
setState(() {
Fluttertoast.showToast(
msg: "Order Confirmed",
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
timeInSecForIosWeb: 1,
backgroundColor: Colors.grey,
textColor: Colors.white,
fontSize: 16.0);
});
}
if (_cart.isEmpty) {
setState(() {
Fluttertoast.showToast(
msg: "Cart Empty",
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
timeInSecForIosWeb: 1,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0);
});
}
}),
if (_cart.length > 0)
Padding(
padding: const EdgeInsets.only(left: 0.0),
child: CircleAvatar(
radius: 10.0,
backgroundColor: Colors.red,
foregroundColor: Colors.white,
child: Text(
_cart.length.toString(),
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12.0,
),
),
),
),
],
),
body: ListView.builder(
itemCount: _cart.length,
itemBuilder: (context, index) {
var item = _cart[index];
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 2.0),
child: Card(
elevation: 4.0,
child: ListTile(
//Leading
leading:
Text(item.category "n" "R" item.price.toString()),
//Title
title: Text(item.brandName
"n"
"("
item.counter.toString()
")"),
//Subtitle
subtitle: GestureDetector(
child: Icon(
Icons.add,
color: Colors.green,
),
onTap: () {
setState(() {
item.incrementCounter();
});
},
),
//Trailing
trailing: GestureDetector(
child: Icon(
Icons.remove_circle,
color: Colors.red,
),
onTap: () {
setState(() {
item.decrementCounter();
});
},
),
isThreeLine: true,
),
),
);
},
),
);
}
}
Комментарии:
1. где ваш
textField
for total ?
Ответ №1:
Добавьте метод расчета цены в свой класс блюд
class Dish{
int count;
double price;
double totalPrice(){
// add your price calculation logic
return price * count;
}
}
добавьте приведенный ниже метод в свой виджет корзины
double cartTotalPrice(){
double total=0;
_cart.forEach((item) { total = item.totalPrice(); });
return total;
}
Или используйте однострочное решение
double total = _cart.map<double>((item) => item.count*item.price).reduce((value1, value2) => value1 value2);
Комментарии:
1. Переменная total выдает ошибку, которая гласит, что получатель ‘total’ не определен для типа dish
2. Вы можете проверить рабочий код здесь https://dartpad.dev . Убедитесь, что вы не перезаписываете имя переменной total
3. Метод
_cart.map
in total класса cart теперь выдает ошибку, в которой говорится, что член экземпляра ‘_cart’ не может быть доступен в инициализаторе.