Как сделать копию элементов массива в дротике - PullRequest
0 голосов
/ 10 июля 2020

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

Посмотрите на иллюстрацию ниже, чтобы лучше понять.

List<page> _pageList;
List<page> _orderList = [];
_pageList = _apiResponse.result as List<page>;
_orderList.add(_pageList[0].element);
_orderList[0].title = "XYZ" 
//--> Here if I change the `_orderList[0].title` then it also change the `title` inside "_pageList" 

Как мы можем предотвратить изменения в основном массиве?

Ответы [ 3 ]

2 голосов
/ 10 июля 2020

Вы можете использовать функцию получения, чтобы создать копию вашего списка и использовать ее вместо изменения вашего фактического списка. пример:

List<Page> get orderList{
return [..._orderList];
}
2 голосов
/ 10 июля 2020

У меня такая же проблема в одном из проектов. Я использовал json для кодирования и декодирования объекта, который поможет вам сделать копию объекта, чтобы это не повлияло на основной список.

После 3-й строки вашего кода внесите изменения как показано ниже

Elements copyObject = Elements.fromJson(_pageList[0].element.toJson());
// First of all you have to convert your object to the Map and and map to original object like above
_orderList.add(copyObject);    
 

Надеюсь, что это вам поможет.

1 голос
/ 10 июля 2020

Списки в Dart хранят ссылки для сложных типов, поэтому это предполагаемое поведение.

Из вашего кода:

_orderList.add(_pageList[0].element);

_orderList[0] и _pageList[0].element указывают на одну и ту же ссылку (если они не примитивны).

Насколько я знаю, в dart нет общего метода copy() или clone(). Поэтому вам нужно скопировать объект самостоятельно, если вам нужен отдельный экземпляр. (см. этот вопрос )

...