Flutter 无法将项目添加到购物车-颤振
我的Flutter 无法将项目添加到购物车-颤振,flutter,flutter-layout,flutter-provider,flutter-change-notifier,Flutter,Flutter Layout,Flutter Provider,Flutter Change Notifier,我的购物车型号如下 class Cart { String description; double unitCost; double amount; int quantity; String color; String imageURl; Cart({ this.description, this.unitCost, this.amount, this.color, this.quantity, this.imageU
购物车
型号如下
class Cart {
String description;
double unitCost;
double amount;
int quantity;
String color;
String imageURl;
Cart({
this.description,
this.unitCost,
this.amount,
this.color,
this.quantity,
this.imageURl,
});
}
以及myCartData
通知程序类,该类具有一个带有预加载数据的\cartList
,如下所示:
class CartData extends ChangeNotifier {
List<Cart> _cartItems = [
Cart(
imageURl:
'https://s2.r29static.com/bin/entry/ebd/0,675,2000,1050/x,80/1929471/image.jpg',
description: 'Nike Air Max',
quantity: 3,
unitCost: 6000,
),
Cart(
color: 'red',
description: 'Nike Air Max',
quantity: 3,
unitCost: 3000,
),
Cart(
imageURl:
'https://s2.r29static.com/bin/entry/ebd/0,675,2000,1050/x,80/1929471/image.jpg',
description: 'Nike Air Max',
quantity: 6,
unitCost: 6000,
),
Cart(
color: 'purple',
description: 'Nike Air Max',
quantity: 2,
unitCost: 1000,
),
Cart(
color: 'purple',
description: 'Nike Air Max',
quantity: 2,
unitCost: 2000,
),
];
UnmodifiableListView<Cart> get cartItems {
return UnmodifiableListView(_cartItems);
}
int get cartItemsCount {
return _cartItems.length;
}
void addItemToCart(
String color,
double unitCost,
String description,
String imageURL,
int quantity,
) {
_cartItems.insert(
0,
Cart(
color: color,
unitCost: unitCost,
description: description,
imageURl: imageURL,
quantity: quantity,
),
);
notifyListeners();
}
void getTotalSum(Cart cart) {}
double getAmount(int qty, double unitCost) {
return qty * unitCost;
}
void upDateCartItem(Cart cartItem, bool isIncrementing) {
if (isIncrementing == true) {
cartItem.quantity++;
print(
'Cart item purchase quantity is: ${cartItem.quantity}, after incrementing from updateCartItem');
} else {
if (cartItem.quantity >= 1) {
cartItem.quantity--;
print(
'Cart item purchase quantity is: ${cartItem.quantity} after decrementing from updateCartItem');
}
if (cartItem.quantity == 0) {
deleteItemFromCart(cartItem);
}
print(cartItem.quantity);
}
cartItem.amount = cartItem.quantity * cartItem.unitCost;
print('Cart Item amount is: ${cartItem.amount} from updateCartItem');
notifyListeners();
}
void deleteItemFromCart(Cart cartItem) {
_cartItems.remove(cartItem);
notifyListeners();
}
}
但是,当我调用addItemToCart方法时,无法从我的购物屏幕向购物车添加项目,如下所示:
String defaultDescription = 'add description';
String paymentDescription = 'add description';
String amount = '0';
int cartTotal = 0;
_addToCart() {
if (amount == '' || amount == '0') {
print('add an amount');
_showToast(this.context, 'amount');
} else if (paymentDescription == defaultDescription) {
print('please enter a valid description to proceed');
_showToast(this.context, 'payment description');
} else {
print(amount);
print(paymentDescription);
//do something like add to cart
CartData cartData = Provider.of<CartData>(context, listen: false);
cartData.addItemToCart(
null,
double.parse(output),
paymentDescription,
null,
1,
);
}
setState(() {
paymentDescription = defaultDescription;
amount = '0';
});
}
\u addToCart(){
如果(金额=“”| |金额=“”“0”){
打印(“添加金额”);
_showtoos(this.context,“amount”);
}else if(paymentDescription==defaultDescription){
打印('请输入有效的说明以继续');
_showtoos(此.context为“付款说明”);
}否则{
打印(金额);
打印(付款说明);
//执行类似“添加到购物车”的操作
CartData CartData=Provider.of(上下文,侦听:false);
cartData.addItemToCart(
无效的
double.parse(输出),
付款说明,
无效的
1.
);
}
设置状态(){
paymentDescription=默认描述;
金额='0';
});
}
这是我的结帐屏幕,显示购物车项目:
class CheckoutScreen extends StatefulWidget {
static const String id = 'checkout_screen';
@override
_CheckoutScreenState createState() => _CheckoutScreenState();
}
class _CheckoutScreenState extends State<CheckoutScreen> {
@override
void initState() {
super.initState();
CustomerNotifier customerNotifier =
Provider.of<CustomerNotifier>(context, listen: false);
customerNotifier.getCustomers(customerNotifier);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: ChangeNotifierProvider(
create: (context) => CartData(),
child: Consumer<CartData>(
builder: (context, cartData, child) {
return Column(
children: <Widget>[
Row(
children: <Widget>[
IconButton(
icon: Icon(
Icons.arrow_back_ios,
color: Colors.black26,
),
onPressed: () => Navigator.pop(context),
),
Text(
'Shopping cart',
style: TextStyle(
fontSize: 21.0,
color: Colors.black26,
fontWeight: FontWeight.bold,
),
),
],
),
Container(
margin: EdgeInsets.only(top: 8.0, bottom: 8.0),
height: MediaQuery.of(context).size.height / 16,
width: MediaQuery.of(context).size.width - 150,
decoration: BoxDecoration(
border: Border.all(color: kThemeStyleButtonFillColour),
borderRadius: BorderRadius.circular(5.0),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Customer drop down',
textAlign: TextAlign.center,
style: kRegularTextStyle,
maxLines: 2,
textDirection: TextDirection.ltr,
softWrap: true,
),
SizedBox(width: 5.0),
Icon(
Icons.keyboard_arrow_down,
color: kThemeStyleButtonFillColour,
size: 25,
),
],
),
),
Expanded(
flex: 4,
child: Container(
height: MediaQuery.of(context).size.height - 225,
padding: const EdgeInsets.only(
left: 16, right: 16, bottom: 8.0),
child: ListView.builder(
itemCount: cartData.cartItems.length,
shrinkWrap: true,
itemBuilder: (context, index) {
final cartItem = cartData.cartItems[index];
return cartData.cartItems.isEmpty
? Container(
child: Align(
alignment: Alignment.center,
child: Text('Your cart is empty')))
: Container(
color: Colors.white,
margin: EdgeInsets.symmetric(vertical: 6.0),
child: Row(
children: <Widget>[
Expanded(
child: Container(
width: 80.0,
height: 70.0,
child: Center(
child: cartItem.imageURl == null
? Container(
padding:
EdgeInsets.all(4.0),
decoration: BoxDecoration(
color: Color((math.Random()
.nextDouble() *
0xFFFFFF)
.toInt())
.withOpacity(1.0),
borderRadius:
BorderRadius.circular(
20.0),
),
)
: Container(
padding:
EdgeInsets.all(4.0),
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(
cartItem.imageURl),
),
borderRadius:
BorderRadius.circular(
20.0),
),
),
),
),
),
SizedBox(width: 12.0),
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 100.0,
child: Text(
cartItem.description,
style: TextStyle(
fontWeight: FontWeight.bold),
),
),
SizedBox(height: 8.0),
Row(
children: <Widget>[
GestureDetector(
child: Container(
width: 20.0,
height: 20.0,
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius:
BorderRadiusDirectional
.circular(4.0),
),
child: Icon(
Icons.remove,
color: Colors.white,
size: 15.0,
),
),
onTap: () {
cartData.upDateCartItem(
cartItem, false);
},
),
Padding(
padding:
const EdgeInsets.symmetric(
horizontal: 15.0),
child: Text(
'${cartItem.quantity}',
style: TextStyle(
fontWeight:
FontWeight.bold,
fontSize: 15.0),
),
),
GestureDetector(
child: Container(
width: 20.0,
height: 20.0,
decoration: BoxDecoration(
color:
kThemeStyleButtonFillColour,
borderRadius:
BorderRadiusDirectional
.circular(4.0),
),
child: Icon(
Icons.add,
color: Colors.white,
size: 15.0,
),
),
onTap: () {
cartData.upDateCartItem(
cartItem, true);
},
),
],
),
],
),
// Spacer(),
Expanded(
child: Text(
'${cartData.getAmount(cartItem.quantity, cartItem.unitCost)}',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 15.0),
),
),
Expanded(
child: GestureDetector(
child: Icon(
Icons.delete_forever,
size: 25.0,
color: kThemeStyleButtonFillColour,
),
onTap: () => cartData
.deleteItemFromCart(cartItem),
),
),
],
),
);
},
),
),
),
],
);
},
),
),
),
);
}
}
class CheckoutScreen扩展了StatefulWidget{
静态常量字符串id='checkout_screen';
@凌驾
_CheckoutScreenState createState()=>\u CheckoutScreenState();
}
类_CheckoutScreenState扩展状态{
@凌驾
void initState(){
super.initState();
CustomerNotifier CustomerNotifier=
Provider.of(上下文,listen:false);
getCustomers(customerNotifier);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:安全区(
子项:ChangeNotifierProvider(
创建:(上下文)=>CartData(),
儿童:消费者(
生成器:(上下文、数据、子项){
返回列(
儿童:[
划船(
儿童:[
图标按钮(
图标:图标(
Icons.arrow\u back\u ios,
颜色:颜色。黑色,
),
onPressed:()=>Navigator.pop(上下文),
),
正文(
“购物车”,
样式:TextStyle(
字体大小:21.0,
颜色:颜色。黑色,
fontWeight:fontWeight.bold,
),
),
],
),
容器(
边距:仅限边集(顶部:8.0,底部:8.0),
高度:MediaQuery.of(context).size.height/16,
宽度:MediaQuery.of(context).size.width-150,
装饰:盒子装饰(
边框:边框。全部(颜色:kthemestylebuttonfillcolor),
边界半径:边界半径。圆形(5.0),
),
孩子:排(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“客户下拉列表”,
textAlign:textAlign.center,
风格:kRegularTextStyle,
maxLines:2,
textDirection:textDirection.ltr,
软包装:是的,
),
尺寸箱(宽度:5.0),
图标(
图标。键盘箭头向下,
颜色:KThemestyleButtonFillColor,
尺码:25,
),
],
),
),
扩大(
弹性:4,
子:容器(
高度:MediaQuery.of(context).size.height-225,
填充:仅限常量边设置(
左:16,右:16,下:8.0),
子项:ListView.builder(
itemCount:cartData.cartItems.length,
收缩膜:对,
itemBuilder:(上下文,索引){
最终cartItem=cartData.cartItems[索引];
返回cartData.cartItems.isEmpty
?容器(
子对象:对齐(
对齐:对齐.center,
子:文本(“您的购物车是空的”))
:容器(
颜色:颜色,白色,
边缘:边缘组。对称(垂直:6.0),
孩子:排(
儿童:[
扩大(
子:容器(
宽度:80.0,
身高:70.0,
儿童:中心(
子项:cartItem.imageURl==null
?容器(
衬垫:
所有边缘设置(4.0),
装饰:盒子装饰(
颜色:颜色((math.Random()
.nextDouble()*
0xFFFFFF)
.toInt())