Создание копии/клона «Списка<Списка>»

#flutter #reference #copy #clone

Вопрос:

Я пытаюсь создать копию/клон «Списка<Списка<Карты’><Карты’>».

До сих пор я пытался:

 dataFTY2 = dataFTY.map((element)=>element).toList();
dataFTY2 = json.decode(json.encode(dataFTY));
dataFTY2 = List.from(dataFTY);
 

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

Для справки добавлен дополнительный код.

 List failureDetails = [];
    List trackIDs = [];
    List dateTime = [];
    var dataFTY2 = dataFTY.map((element) => element.map((ele) => Map.from(ele)).toList()).toList();

    // get historyData for each one and sort through "F"s and put them into the table in a row?
    for (var x in dataFTY2[4]) {
      trackIDs.add(x["track_id"]);
      dateTime.add(x["datetime"]);
    }
    List failuresOnly = List.filled(trackIDs.length, {}, growable: true);
    for (var i = 0; i < trackIDs.length; i  ) {
      await fetchTrackIDTestDetails(context, trackIDs[i], dateTime[i], false);
      failureDetails.add(MyGlobals().getTestCodeDetailsData());
    }
    //filter out only "F"s
    for (var p = 0; p < failureDetails.length; p  ) {
      for (var t in failureDetails[p][0]) {
        if (t["Status"] == "F") {
          //add it to list, if pass do nothing
          failuresOnly[p] = t;
        }
      }
    }
    //combine with FTY failure data, don't use new screen use old screen and toggle when pressed, add column on right side
    //dataFTY2 = MyGlobals().getFTYFailureMoreDetails();
    for (var i = 0; i < dataFTY2[4].length; i  ) {
      dataFTY2[4][i]["TestCode"] = failuresOnly[i]["TestCode"];
      dataFTY2[4][i]["Status"] = failuresOnly[i]["Status"];
      dataFTY2[4][i]["TestValue"] = failuresOnly[i]["TestValue"];
      dataFTY2[4][i]["Lo_Limit"] = failuresOnly[i]["Lo_Limit"];
      dataFTY2[4][i]["Up_Limit"] = failuresOnly[i]["Up_Limit"];
      dataFTY2[4][i]["ProcTime"] = failuresOnly[i]["ProcTime"];
    }

 

Комментарии:

1. List<List<Map>> list1 = const [[{"1":"first"}]]; List<List<Map>> list2 = List.from(list1); list2.add([{"2":"second"}]); print(list1); print(list2); Я не вижу никакой ошибки, связанной с дротиком.

2. Возможно, это поможет, но мой список<Список<Карта><Карта>> содержит другие переменные, такие как Список<Карта>><Карта> failureLinksMap = [{}]; Не уверен, что это будет иметь значение при создании копии. Но ни одно из решений до сих пор не сработало. Я даже попытался поместить List.from() во все переменные, которые находятся внутри основного списка<Список<Карта><Карта>>, и это все еще не работает.

3. Не знаю, что я изменил, если честно, но я заставил это работать. Должно быть, в моем коде было что-то еще, что вызывало проблему.

Ответ №1:

Вы можете использовать конструктор Map.from с именем для клонирования Map , как это,

 dataFTY2 = dataFTY.map((element) => element.map((ele) => Map.from(ele)).toList()).toList();
 

Комментарии:

1. Я попробовал это, и это, кажется, не слишком работает. Когда я вношу изменения в копию, оригинал все равно меняется…

2. Не знаю, что я изменил, если честно, но я заставил это работать. Должно быть, в моем коде было что-то еще, что вызывало проблему. В итоге я воспользовался этим методом. Спасибо.

Ответ №2:

Я нахожу более простым использование оператора сбора for и распространения ( ... ) :

 void main() {
  var original = [
    [
      {'foo': 1, 'bar': 2},
      {'foo': 3, 'bar': 4},
    ]
  ];

  // Create a new List...
  var copy = [
    for (var sublist in original)
      // ... where each element is a new List...
      [
        for (var map in sublist)
          // ... where each element of the sublist is a new Map that
          // copies all entries from `map`.
          {...map},
      ],
  ];

  original[0][0]['foo'] = -1;
  print(original); // Prints: [[{foo: -1, bar: 2}, {foo: 3, bar: 4}]]
  print(copy); // Prints: [[{foo: 1, bar: 2}, {foo: 3, bar: 4}]]
}
 

Комментарии:

1.Я попробовал это, и это, кажется, не слишком работает. Когда я вношу изменения в копию, оригинал все равно меняется…

2. Возможно, это поможет, но мой список<Список<Карта><Карта>> содержит другие переменные, такие как Список<Карта>><Карта> failureLinksMap = [{}]; Не уверен, что это будет иметь значение при создании копии. Но ни одно из решений до сих пор не сработало. Я даже попытался поместить List.from() во все переменные, которые находятся внутри основного списка<Список<Карта><Карта>>, и это все еще не работает.