Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 无法将项目添加到购物车-颤振_Flutter_Flutter Layout_Flutter Provider_Flutter Change Notifier - Fatal编程技术网

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,
  });
}
以及my
CartData
通知程序类,该类具有一个带有预加载数据的
\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())