#flutter #dart
#flutter #dart
Вопрос:
Как мне отобразить общее количество всей корзины?
Я хочу отобразить общую цену всей корзины, но вместо этого я получаю общую цену товара, когда увеличиваю количество товара. Я получаю разное значение для каждого товара в корзине. Логика для моего общего вычисления находится в классе cart в методе TotalPrice()
Класс корзины
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(("Total: R")
item.totalPrice().toString()
"n"
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,
),
),
);
},
),
);
}
}
Класс dish
import 'package:flutter/material.dart';
class Dish {
final String category;
final String brandName;
final int price;
int counter = 1;
int sum;
int totalPrice() {
return sum = price * counter;
}
void decrementCounter() {
counter--;
}
void incrementCounter() {
counter ;
}
Dish({this.category, this.brandName, this.price});
}
Ответ №1:
Чтобы вычислить общее количество корзины, можно fold
использовать список Dish()
для вычисления общего количества:
_cart
.fold<int>(0, (a, b) => a b.totalPrice());
Ниже приведен полный пример для указанного виджета:
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 1,
itemBuilder: (context, index) {
if (index == _cart.length)
return Padding(
padding:
const EdgeInsets.symmetric(horizontal: 8.0, vertical: 2.0),
child: Card(
elevation: 4.0,
child: Text("Cart Total: R"
_cart
.fold<int>(0, (a, b) => a b.totalPrice())
.toString()),
),
);
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(("Total: R")
item.totalPrice().toString()
"n"
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. где мне реализовать метод _cart.reduce? я получаю сообщение об ошибке, в котором говорится
The return type 'int' isn't a 'Dish', as required by the closure's context.
2. Вы можете найти полный пример во втором фрагменте ответа, более конкретно, из строк с 71 по 83, в
ListView.builder()
3. Я получаю сообщение об ошибке, в котором говорится, что возвращаемый тип ‘int’ не является ‘Dish’, как того требует контекст закрытия.
4. Должен ли я инициализировать
a
b
переменные and ? Если да, то где?5. Я обновил код в ответе, пожалуйста, дайте мне знать, решил ли он проблему