ObservableList <Object>перезаписывает значения из других объектов при добавлении нового объекта - PullRequest
0 голосов
/ 21 апреля 2020

Я разрабатываю приложение для доставки в ресторан, и у меня возникают проблемы при добавлении одного и того же продукта в список, но с другими значениями, оно перезаписывает значение из старых.

У меня есть магазин BaseStore, который имеет объект "Bag" в качестве наблюдаемого.

abstract class _BaseStore with Store {

  @observable
  Bag bag = Bag(
      products: ObservableList<Product>()
  );

  @action
  addProduct(Product product){
  bag,products.add(products);
 }

}

Я регистрирую BaseStore как Singleton, используя пакет get_it: https://pub.dev/packages/get_it

GetIt.I.registerSingleton<BaseStore>(BaseStore());

Класс Bag имеет объект ObservableList объекта Product.

class Bag {
    ObservableList<Product> products;
}

В классе Product есть больше переменных, но я покажу только эти две для примера:

class Product {
     String name;
     List<Option> options;

}

class Option {
    String optionSelected;
   List<ItemOption>

}

class ItemOption {
    String name;

}

Я пытаюсь добавить два products, оба имеют одинаковые значения, единственным отличием является String "optionSelected" из класса "Option", который в приведенном ниже примере создал два продукта, и они имеют разные значения "optionSelected" (Diet и другие Normal).

Product product1 = Product(
            name: "Coke",
            options: [
              Option(optionSelected: "Diet")
            ]
        );

 Product product2 = Product(
            name: "Coke",
            options: [
              Option(optionSelected: "Normal")
            ]
        );

Я вызываю действие из синглтона и печатаю значения.

GetIt.instance<BaseStore>().addProduct(product1);
GetIt.instance<BaseStore>().addProduct(product2);


    bag.products.forEach((product){

      product.options.forEach((option)=> print(option.optionSelected));

    });

выводит:

Normal
Normal

Когда я добавляю второй продукт со всеми теми же значениями, Кроме одно значение из внутреннего списка (Option's optionSelected) изменяет все значения продуктов из списка в соответствии с последним добавленным.

Пример при добавлении другого продукта, некоторых других значений, проблема не возникает: https://i.imgur.com/ULzdPRM.mp4

При добавлении одного и того же продукта, но с другой опциейВыбрано и количество: https://i.imgur.com/vlgKkq5.mp4

1 Ответ

0 голосов
/ 24 апреля 2020

Друг @bwolf, помогите мне решить проблему, мне пришлось использовать copyWith для создания нового экземпляра объекта для каждого выбранного мной продукта, а также использовать copyWith для класса Option.

Product copyWith({
    String id,
    String restaurantId,
    String image,
    String name,
    String desc,
    int price,
    int quantity,
    String category,
    List<Option> options,
  }) =>
      Product(
        id: id ?? this.id,
        restaurantId: restaurantId ?? this.restaurantId,
        image: image ?? this.image,
        name: name ?? this.name,
        desc: desc ?? this.desc,
        price: price ?? this.price,
        quantity: quantity ?? this.quantity,
        category: category ?? this.category,
        options: options ?? this.options,
      );



Option copyWith({
    String id,
    String title,
    List<ItemOption> items,
    String optionSelected,
  }) =>
      Option(
        id: id ?? this.id,
        title: title ?? this.title,
        items: items ?? this.items,
        optionSelected: optionSelected ?? this.optionSelected,
      );

При передаче продукта на экран:

products[index].copyWith()

В конструкторе продукта.

 Product({this.id, this.restaurantId, this.image, this.name, this.desc,
    this.price, this.category,List<Option> options, this.quantity = 1}){

    if(options != null && options.isNotEmpty){
      this.options = options.map((e) => e.copyWith()).toList();
    }

  }
...