es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuando se modifica un valor en la lista copiada, se modifica también en la lista original Flutter.

Quiero copiar una lista y hacer una referencia independiente incluso cuando edite el valor en la lista copiada. Intenté addAll(), List.from(), map(), toList() y [...myList] pero no fueron útiles.

Edit de Clarificación

Por ejemplo:

class Item{
    String description;
    int price; 

    Item(this.description, this.price);
    }

List<Item> items = [
Item('item 1', 100),
Item('item 2', 200),
Item('item 3', 300),
];

List<Item> selectedItems = List.from(items);

Cuando edito selectedItems, la lista original items no debería ser afectada, ¿pero no es así?

selectedItems[0].price = 115;

Esto modifica el precio del elemento 0 en ambas listas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para copiar una lista y no hacer referencia a ella incluso al editar valores en la lista copiada, es necesario realizar una copia profunda de la lista original. Esto implica crear un nuevo objeto de lista y copiar cada elemento de la lista original de forma individual. Una forma de hacerlo es creando un constructor de copia en la clase de los elementos de la lista, como se muestra en el ejemplo a continuación:

    class Item {
      String description;
      int price;
    
      Item(this.description, this.price);
    
      Item.copy(Item item)
          : description = item.description,
            price = item.price;
    
      // otros métodos y variables
    }
    
    List<item> items = [
      Item('item 1', 100),
      Item('item 2', 200),
      Item('item 3', 300),
    ];
    
    List<item> copiedItems = items.map((item) => Item.copy(item)).toList();
    
    copiedItems[0].price = 115;
    
    print(items[0].price); // Salida: 100
    print(copiedItems[0].price); // Salida: 115
    

    En el ejemplo anterior, creamos un constructor de copia en la clase Item que crea una nueva instancia de Item con los mismos valores que otra instancia de Item. Luego utilizamos la función map() para aplicar el constructor Item.copy() a cada elemento de la lista items, y lo convertimos a una lista utilizando la función toList(). Esto crea un nuevo objeto de lista con nuevos objetos Item que tienen los mismos valores que la lista items, pero no son referencias a los mismos objetos.

    Ahora, cuando modificamos la lista copiedItems, la lista items permanece sin cambios, como se desea.

Comments are closed.