Search code examples
flutterflutter-dependenciesflutter-provider

array value getting inherited/copied


I have 2 arrays cart and cartCopy, inside that array I have an object. Data is inserted in cart and cartCopy. When updating the variant or extras in cart I first create a separate list for them variantList=[] and extrasList=[], now when updating variantList/extrasList the values in cart and cartCopy also changes even though I did not update them.

{"product_name:"",variants:[],extras:[]}

Provider class changing variant for reference and Setting Product to Edit. Whenever I update the variant, cart and cartCopy variant also changes. How to I separate the values in cart?

class ProductDetailsProvider extends ChangeNotifier {
  List<VariantDetails>? variants = [];
  List<VariantDetails>? selectedVariants = [];
  List<AddOnDetails>? selectedExtras = [];

    addVariant(VariantDetails? item) {
        var exist =
            variants?.indexWhere((element) => element.typeID == item?.typeID);
        if (exist != -1) {
          variants?[exist!] = item!;
        } else {
          variants?.insert(0, item!);
        }
      }

  setProduct(CartData item) async {
    variants = item.variant;
    selectedExtras = item.extras;
    selectedVariants = item.variant;
    notifyListeners();
  }
     }

Add to Cart Class

class CartProvider extends ChangeNotifier {
  List<CartData>? cart = [];
  List<CartData>? cartCopy = [];

 addToCart(context, CartData cartItem, isUpdate) async {
      cart?[exist!] = cartItem;
      cartCopy?[exist!] = cartItem;
   
    }}

Solution

  • You can use the following methods to encode and decode the list of CartData

    static String encode(List<CartData> cart) => json.encode(cart
         .map<Map<String, dynamic>>((value) => CartData.toMap(value))
         .toList(),
    );
    
    static List<CartData> decode(String cart) {
      return cart.isNotEmpty
      ? (json.decode(cart) as List<dynamic>)
              .map<CartData>((item) => CartData.fromJSON(item))
              .toList()
     : [];
    

    And in CartData class you should have something like this for the object

    CartData.fromJSON(Map<String, dynamic> jsonMap)
          : id = jsonMap['id'],            
            name = jsonMap['name'],
            price = jsonMap['price'],
            tax = jsonMap['tax'];
    
    
    static Map<String, dynamic> toMap(CartData cartItem) => {
            'id': cartItem.id,
            'name': cartItem.name,
            'price': cartItem.price,
            'tax': cartItem.tax
    };
    

    Those methods would allow you to do this:

    cartCopy = CartData.decode(CartData.encode(cart));