4

I'm pretty new to Flutter and still struggling to understand a few things. My objective right now is to place map objects inside a list the logic for which that I've written hasn't been kind. I would therefore need suggestions as to how this can be achieved. The code I've written by far is below:

class CartItemProvider with ChangeNotifier {
  Map<String, dynamic> _cartItems = {};
  var _cartItemList = [];
  List<dynamic> _individualItems = [];

  Network network = Network();

  String baseUrl = 'https://achievexsolutions.in/current_work/eatiano/';

  double deliveryCost = 40;
  double discountCost = 50;

  Map<String, dynamic> get cartItems {
    return {..._cartItems};
  }

  Future<void> fetchCartItems() async {
    final url = Uri.parse(baseUrl + 'api/auth/cart');
    final response = await http.get(url, headers: {
      'Authorization': 'Bearer ${network.getToken()}',
      'Accept': 'application/json'
    });
    Cart cartJson = cartFromJson(response.body);
    _cartItems = cartJson.toJson();
    _cartItems.forEach((key, values) => _cartItemList.add(values['data'])); 
    print(_cartItems);
  }
}

The error that I get says Unhandled Exception: NoSuchMethodError: The method 'map' was called on null.

{
    "status": "success",
    "data": [
        {
            "cart_id": 9,
            "restaurant_id": "6",
            "product_id": "8",
            "restaurant_name": "Mocambo",
            "product_name": "Kaju Paneer",
            "product_description": "Tasty yummy paneer gravy dish",
            "product_image": "/public/assets/product/lgml5L03-19-41.jpg",
            "product_selling_price": "320",
            "product_status": "active",
            "product_quantity": "41",
            "product_rating": null,
            "product_rating_count": null,
            "product_sell_count": null,
            "quantity": "1"
        }
    ]
}

I would like to store the objects in the list named data which is my main priority. The model class for the above response is below:

import 'package:meta/meta.dart';
import 'dart:convert';

Cart cartFromJson(String str) => Cart.fromJson(json.decode(str));

String cartToJson(Cart data) => json.encode(data.toJson());

class Cart {
  Cart({
    required this.status,
    required this.data,
  });

  String status;
  List<Datum> data;

  factory Cart.fromJson(Map<String, dynamic> json) => Cart(
        status: json["status"],
        data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "status": status,
        "data": List<dynamic>.from(data.map((x) => x.toJson())),
      };
}

class Datum {
  Datum({
    required this.cartId,
    required this.restaurantId,
    required this.productId,
    required this.restaurantName,
    required this.productName,
    required this.productDescription,
    required this.productImage,
    required this.productSellingPrice,
    required this.productStatus,
    required this.productQuantity,
    required this.productRating,
    required this.productRatingCount,
    required this.productSellCount,
    required this.quantity,
  });

  int cartId;
  String restaurantId;
  String productId;
  String restaurantName;
  String productName;
  String productDescription;
  String productImage;
  String productSellingPrice;
  String productStatus;
  String productQuantity;
  dynamic productRating;
  dynamic productRatingCount;
  dynamic productSellCount;
  String quantity;

  factory Datum.fromJson(Map<String, dynamic> json) => Datum(
        cartId: json["cart_id"],
        restaurantId: json["restaurant_id"],
        productId: json["product_id"],
        restaurantName: json["restaurant_name"],
        productName: json["product_name"],
        productDescription: json["product_description"],
        productImage: json["product_image"],
        productSellingPrice: json["product_selling_price"],
        productStatus: json["product_status"],
        productQuantity: json["product_quantity"],
        productRating: json["product_rating"],
        productRatingCount: json["product_rating_count"],
        productSellCount: json["product_sell_count"],
        quantity: json["quantity"],
      );

  Map<String, dynamic> toJson() => {
        "cart_id": cartId,
        "restaurant_id": restaurantId,
        "product_id": productId,
        "restaurant_name": restaurantName,
        "product_name": productName,
        "product_description": productDescription,
        "product_image": productImage,
        "product_selling_price": productSellingPrice,
        "product_status": productStatus,
        "product_quantity": productQuantity,
        "product_rating": productRating,
        "product_rating_count": productRatingCount,
        "product_sell_count": productSellCount,
        "quantity": quantity,
      };
}
2

1 Answer 1

1

This three cases are likely the cause of your problem:

        "product_rating": null,
        "product_rating_count": null,
        "product_sell_count": null,

because in your function below

 Map<String, dynamic> toJson() => {
        "status": status,
        "data": List<dynamic>.from(data.map((x) => x.toJson())),
 };

you're calling .map on a null object, hence the error. You have to handle somehow the cases where json["data"] is null before calling any method on it. Is your code null-safe? That might help in cases like this because I think the IDE would warn you of such nullable cases (at least, Android Studio does).

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.