Как мне получить общую цену всех товаров в корзине?

#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’ не может быть доступен в инициализаторе.