Deepak
Deepak

Reputation: 2188

flutter Error: The method '[]' was called on null. Receiver: null Tried calling: []("product")

when I clicking on my cart icon then open my cartpage.dart in this page my data not showing and give error but when i am using fast reload flutter page then that data is comming. How to solve it please help me.

error=> The method '[]' was called on null. Receiver: null Tried calling:

enter image description here

This is my cartPage.dart

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:hospital/CartPage/components/cartCard.dart';
import 'package:hospital/CartPage/components/priceDetailsCard.dart';
import 'package:hospital/constant.dart';
import 'package:hospital/customApiVariable.dart';
import 'package:http/http.dart' as http;

class Cartpage extends StatefulWidget {
  @override
  _CartpageState createState() => _CartpageState();
}

class _CartpageState extends State<Cartpage> {
  var response;

  var addToCartApi;

  @override
  void initState() {

    super.initState();

    fetchData();
  }

  fetchData() async {
    var api = Uri.parse(
        '$ecommerceBaseUrl/addToCartApi.php?a2rTokenKey=$a2rTokenKey&action=addToCartList&uid=${var_uid}');

    response = await http.get(api);

    print("Carousel" + response.body);
    addToCartApi = jsonDecode(response.body);
    print('addToCartApi' + addToCartApi['total'].toString());


// store in variable 
    totalOfferPrice = addToCartApi['total']['grandTotalOfferPrice'].toString();
    totalPrice = addToCartApi['total']['grandTotalPrice'].toString();
    totalPriceAfterOffer =
        addToCartApi['total']['grandTotalPriceAfterOffer'].toString();
    deliveryName = addToCartApi['total']['deliveryName'];
    deliveryCharge = addToCartApi['total']['deliveryCharge'].toString();
    total_num = addToCartApi['total']['num'].toString();

    setState(() {});
  }

  // List allItems = CartRepo().getAllCartItems();
  @override
  Widget build(BuildContext context) {
    final _media = MediaQuery.of(context).size;
    return Scaffold(
        appBar: AppBar(
          backgroundColor: kGreen,
          title: Text("My Cart"),
        ),
        body: Stack(
          children: [
            Container(
              decoration: BoxDecoration(color: Color(0xFFeeeeee)),
              height: _media.height,
              width: _media.width,
            ),
            ListView(
              shrinkWrap: true,
              children: <Widget>[
                CartCard(user_id: var_uid),
                PriceDetailsCard(totalItem: addToCartApi['total']),
                SizedBox(
                  height: 100,
                )
              ],
            ),
            Align(
              alignment: Alignment.bottomCenter,
              child: Container(
                width: _media.width,
                height: _media.height * .08,
                decoration: BoxDecoration(color: Colors.white, boxShadow: [
                  BoxShadow(color: Colors.black87, blurRadius: 5.0),
                  BoxShadow(color: Colors.white, blurRadius: 10.0),
                ]),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: <Widget>[
                    Padding(
                      padding: const EdgeInsets.only(left: 10.0),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                          Text(
                            "\u20B9 ${totalPriceAfterOffer}",
                            style: TextStyle(
                                fontWeight: FontWeight.bold, fontSize: 20),
                          ),
                          Text(
                            "View price details",
                            style: TextStyle(
                                color: Colors.blueGrey,
                                fontWeight: FontWeight.bold),
                          )
                        ],
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.only(right: 10.0),
                      child: Container(
                          width: _media.width * .4,
                          child: RaisedButton(
                            onPressed: () {},
                            color: kGreen,
                            child: Text(
                              "PLACE ORDER",
                              style: TextStyle(color: Colors.white),
                            ),
                          )),
                    ),
                  ],
                ),
              ),
            )
          ],
        ));
  }
}

This is CartCard.dart page

import 'dart:convert';

import 'package:flutter/material.dart';
// import 'package:hospital/FourthDelete/fourth_delete.dart';
// import 'package:hospital/FourthSection/MedicineProductList/medicine_product_list.dart';
import 'package:hospital/ProductDetailsPage/product_detailPage.dart';
import 'package:hospital/SecondSection/Medicine/medicine_page.dart';
import 'package:hospital/constant.dart';
import 'package:hospital/customApiVariable.dart';
import 'package:http/http.dart' as http;

class CartCard extends StatefulWidget {
  final user_id;

  const CartCard({Key key, this.user_id}) : super(key: key);
  @override
  _CartCardState createState() => _CartCardState();
}

class _CartCardState extends State<CartCard> {
  var response;

  //this drinks call from api
  var cartCardApi;

  @override
  void initState() {
    // TODO: implement initState
    //
    super.initState();
// for loading
    fetchData(widget.user_id);
  }

  fetchData(auth_uid) async {
    // var api = Uri.parse(
    //     'https://www.a2rstore.in/oceonicApi/ecommerce/v2/api/categoryApi.php?a2rTokenKey=carpet1234');
    // var api = Uri.parse('$baseUrl/productCatApi.php?a2rTokenKey=$a2rTokenKey');
    var api = Uri.parse(
        // '$ecommerceBaseUrl/addToCartApi.php?a2rTokenKey=$a2rTokenKey&action=addToCartList&uid=${widget.auth_uid}');
        '$ecommerceBaseUrl/addToCartApi.php?a2rTokenKey=$a2rTokenKey&action=addToCartList&uid=${widget.user_id}');
    // 'https://www.a2rstore.in/oceonicApi/ecommerce/v1/api/productSubCatApi.php?a2rTokenKey=a2rhos1234&pcat=60c461f032f2a');
    response = await http.get(
      api,
    );
    print("cartCardApi " + api.toString());
    print("cartCardbody " + response.body);

    // in double quotes drink is key value of json

    cartCardApi = jsonDecode(response.body);

    print("cartCardApi " + cartCardApi.toString());
    return cartCardApi['product'];
    // setState(() {});
  }

  String quantity = "1";
  @override
  Widget build(BuildContext context) {
    final _media = MediaQuery.of(context).size;
    return ListView.builder(
        // itemCount: categoryApi.length.clamp(0, 3),//THis is for showed minimun length of item listview.builder flutter
        itemCount: cartCardApi['product'].length,
        scrollDirection: Axis.vertical,
        physics: ScrollPhysics(),
        shrinkWrap: true,
        itemBuilder: (context, index) {
          var cartCard = cartCardApi['product'][index];
          return Container(
            height: _media.height * .4,
            child: Card(
              color: Colors.white,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Padding(
                        padding: const EdgeInsets.only(
                            left: 10.0, top: 10, bottom: 8),
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            Container(
                              width: _media.width * .6,
                              child: Text(
                                // widget.item.desc,
                                cartCard["productName"],
                                maxLines: 2,
                                style: TextStyle(
                                    color: Colors.black,
                                    fontSize: 18,
                                    fontWeight: FontWeight.w500),
                                overflow: TextOverflow.ellipsis,
                              ),
                            ),
                            SizedBox(
                              height: 5,
                            ),
                            Text(
                              // widget.item.quantity,
                              ' Quantity ${cartCard['orderQuantity']}',
                              style:
                                  TextStyle(color: Colors.grey, fontSize: 14),
                            ),
                            SizedBox(
                              height: 10,
                            ),
                            Row(
                              children: <Widget>[
                                Text(
                                  "Seller: ",
                                  style: TextStyle(
                                      color: Colors.grey, fontSize: 14),
                                ),
                                Icon(
                                  Icons.check_circle,
                                  color: Colors.grey,
                                  size: 15,
                                )
                              ],
                            ),
                            SizedBox(
                              height: 15,
                            ),
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              crossAxisAlignment: CrossAxisAlignment.end,
                              children: <Widget>[
                                Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                    Row(
                                      mainAxisAlignment:
                                          MainAxisAlignment.start,
                                      children: <Widget>[
                                        Text(
                                          "\u20B9 " +
                                              cartCard[
                                                  'productPriceAfterOffer'],
                                          style: TextStyle(
                                              fontWeight: FontWeight.bold,
                                              fontSize: 23),
                                        ),
                                        Padding(
                                          padding:
                                              const EdgeInsets.only(left: 10.0),
                                          child: Text(
                                            "\u20B9 " +
                                                cartCard['productRealPrice'],
                                            style: TextStyle(
                                                color: Colors.grey,
                                                decoration:
                                                    TextDecoration.lineThrough),
                                          ),
                                        ),
                                        SizedBox(
                                          width: 5,
                                        ),
                                        Text(
                                          '40' + "%off",
                                          style: TextStyle(
                                              color: Colors.green,
                                              fontSize: 13,
                                              fontWeight: FontWeight.w600),
                                        )
                                      ],
                                    ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Text(
                                      "2 offers available",
                                      style: TextStyle(
                                          color: Colors.green,
                                          fontSize: 13,
                                          fontWeight: FontWeight.w600),
                                    )
                                  ],
                                )
                              ],
                            )
                          ],
                        ),
                      ),
                      Padding(
                        padding: const EdgeInsets.only(
                            top: 10.0, right: 8, bottom: 8),
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            Container(
                              color: Colors.white,
                              child: Row(
                                children: <Widget>[
                                  Container(
                                    width: _media.width * .3,
                                    height: _media.height * .2,
                                    child: Image.network(
                                      // 'https://media.gettyimages.com/photos/woman-using-meal-delivery-service-through-mobile-app-picture-id1160735344?k=6&m=1160735344&s=612x612&w=0&h=tYEeckvNDyAoyUEfUeCii_29p_pBum_BVHKiUrGbjYY=',
                                      cartCard['pImgImg'],
                                      fit: BoxFit.cover,
                                    ),
                                  )
                                ],
                              ),
                            ),
                            Row(
                              children: <Widget>[
                                Text(
                                  "Qty:",
                                  style: TextStyle(fontWeight: FontWeight.bold),
                                ),
                                SizedBox(
                                  width: 10,
                                ),
                                DropdownButton<String>(
                                  value: quantity,
                                  items: <String>["1", "2", "3", "4", "5"]
                                      .map((String value) =>
                                          DropdownMenuItem<String>(
                                              value: value, child: Text(value)))
                                      .toList(),
                                  onChanged: (_value) {
                                    setState(() {
                                      quantity = _value;
                                    });
                                  },
                                )
                              ],
                            ),
                          ],
                        ),
                      )
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Container(
                        height: _media.height * .08,
                        width: _media.width * .4875,
                        child: RaisedButton(
                          onPressed: () {},
                          color: Colors.white,
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: <Widget>[
                              Icon(
                                Icons.favorite,
                                size: 15,
                                color: Colors.grey,
                              ),
                              SizedBox(
                                width: 5,
                              ),
                              Text(
                                "SAVE FOR LATER",
                                style: TextStyle(fontSize: 15),
                              )
                            ],
                          ),
                        ),
                      ),
                      Container(
                        height: _media.height * .08,
                        width: _media.width * .4875,
                        child: RaisedButton(
                          onPressed: () {},
                          color: Colors.white,
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: <Widget>[
                              Icon(
                                Icons.delete,
                                size: 15,
                                color: Colors.grey,
                              ),
                              SizedBox(
                                width: 5,
                              ),
                              Text(
                                "REMOVE",
                                style: TextStyle(fontSize: 15),
                              )
                            ],
                          ),
                        ),
                      ),
                    ],
                  )
                ],
              ),
            ),
          );
        });
  }
}

This is my json data

{
  "product": [
    {
      "plistId": "60c71ed46839f",
      "plistPriceId": "",
      "uid": "60daaedd3b9f8751161",
      "orderQuantity": "1",
      "date": "2021-07-06",
      "productName": "MUKTI CHURNA",
      "productCode": "499",
      "productlink": "detail.php?pListName=MUKTI CHURNA&plistId=60c71ed46839f",
      "productRealPrice": "1112",
      "productPriceAfterOffer": 1110,
      "productOfferAmountMulOrdrQuantity": 0,
      "quantity": "1 p",
      "pImgImg": "http:\/\/a2rstore.com\/inventory\/images\/product_images\/product-Mukti-Churan-600x600.jpg",
      "subTotalRealPrice": 1110,
      "subTotalofferPrice": 0,
      "subTotalPriceAfterOffer": 1110
    },
    {
      "plistId": "60cacee2ee4ff",
      "plistPriceId": "",
      "uid": "60daaedd3b9f8751161",
      "orderQuantity": "1",
      "date": "2021-07-06",
      "productName": " PAIN CALM OIL",
      "productCode": "504",
      "productlink": "detail.php?pListName= PAIN CALM OIL&plistId=60cacee2ee4ff",
      "productRealPrice": "123",
      "productPriceAfterOffer": "123",
      "productOfferAmountMulOrdrQuantity": 0,
      "quantity": "1 p",
      "pImgImg": "http:\/\/a2rstore.com\/inventory\/images\/product_images\/product-Oil-pulling-ff-600x600.jpg",
      "subTotalRealPrice": 123,
      "subTotalofferPrice": 0,
      "subTotalPriceAfterOffer": 123
    },
    {
      "plistId": "60cacee2ee4ff",
      "plistPriceId": "",
      "uid": "60daaedd3b9f8751161",
      "orderQuantity": "3",
      "date": "2021-07-06",
      "productName": " PAIN CALM OIL",
      "productCode": "504",
      "productlink": "detail.php?pListName= PAIN CALM OIL&plistId=60cacee2ee4ff",
      "productRealPrice": "123",
      "productPriceAfterOffer": "123",
      "productOfferAmountMulOrdrQuantity": 0,
      "quantity": "1 p",
      "pImgImg": "http:\/\/a2rstore.com\/inventory\/images\/product_images\/product-Oil-pulling-ff-600x600.jpg",
      "subTotalRealPrice": 369,
      "subTotalofferPrice": 0,
      "subTotalPriceAfterOffer": 369
    },
    {
      "plistId": "60cacee2ee4ff",
      "plistPriceId": "",
      "uid": "60daaedd3b9f8751161",
      "orderQuantity": "3",
      "date": "2021-07-06",
      "productName": " PAIN CALM OIL",
      "productCode": "504",
      "productlink": "detail.php?pListName= PAIN CALM OIL&plistId=60cacee2ee4ff",
      "productRealPrice": "123",
      "productPriceAfterOffer": "123",
      "productOfferAmountMulOrdrQuantity": 0,
      "quantity": "1 p",
      "pImgImg": "http:\/\/a2rstore.com\/inventory\/images\/product_images\/product-Oil-pulling-ff-600x600.jpg",
      "subTotalRealPrice": 369,
      "subTotalofferPrice": 0,
      "subTotalPriceAfterOffer": 369
    },
    {
      "plistId": "60cacee2ee4ff",
      "plistPriceId": "",
      "uid": "60daaedd3b9f8751161",
      "orderQuantity": "1",
      "date": "2021-07-06",
      "productName": " PAIN CALM OIL",
      "productCode": "504",
      "productlink": "detail.php?pListName= PAIN CALM OIL&plistId=60cacee2ee4ff",
      "productRealPrice": "123",
      "productPriceAfterOffer": "123",
      "productOfferAmountMulOrdrQuantity": 0,
      "quantity": "1 p",
      "pImgImg": "http:\/\/a2rstore.com\/inventory\/images\/product_images\/product-Oil-pulling-ff-600x600.jpg",
      "subTotalRealPrice": 123,
      "subTotalofferPrice": 0,
      "subTotalPriceAfterOffer": 123
    },
    {
      "plistId": "60cacee2ee4ff",
      "plistPriceId": "",
      "uid": "60daaedd3b9f8751161",
      "orderQuantity": "1",
      "date": "2021-07-06",
      "productName": " PAIN CALM OIL",
      "productCode": "504",
      "productlink": "detail.php?pListName= PAIN CALM OIL&plistId=60cacee2ee4ff",
      "productRealPrice": "123",
      "productPriceAfterOffer": "123",
      "productOfferAmountMulOrdrQuantity": 0,
      "quantity": "1 p",
      "pImgImg": "http:\/\/a2rstore.com\/inventory\/images\/product_images\/product-Oil-pulling-ff-600x600.jpg",
      "subTotalRealPrice": 123,
      "subTotalofferPrice": 0,
      "subTotalPriceAfterOffer": 123
    }
  ],
  "total": {
    "grandTotalOfferPrice": 0,
    "grandTotalPrice": 123,
    "grandTotalPriceAfterOffer": 123,
    "deliveryName": "Shipping Charge",
    "deliveryCharge": "Free",
    "num": 6
  }
}

Upvotes: 1

Views: 4505

Answers (3)

sujith sa
sujith sa

Reputation: 37

Seems the way you are trying to fetch data from products is wrong. Try to print the full JSON from response and print each individual item to see the correct value.

This is why JSON formatting is preferred where you can create a model class for the response values, and map the response values to predefined keys in the model class and then use that model class to populate values in UI.

Avoids these types of errors

https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51

Upvotes: 0

Pradyot Prakash
Pradyot Prakash

Reputation: 31

According to the error your cartCardApi is null before you are accessing it in the ListView.

If it'a is an API call use FutureBuilder to handle all the asynchronous calls like showing loading, error when there is an error from api and the ui if its success.

Otherwise make cartCardApi as an empty list from before.

So that when you call setState the new list is updated and ui gets the new list.

Upvotes: 2

Shekhar
Shekhar

Reputation: 79

Looks like your cartCardApi is null somewhere when you are trying to fetch the "product" value.

Upvotes: 0

Related Questions