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;
}}
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));