Изменение скопированного списка - это изменение оригинала. - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть два экрана, на которых я передаю список от одного к другому.Тип списка - это пользовательский объект, в котором есть еще один список.На втором экране случайный элемент удаляется из подсписка до тех пор, пока его больше не будет, и в этот момент элемент, содержащий пустой список, также удаляется.Это происходит до тех пор, пока в списке верхнего уровня больше не будет элементов.Проблема в том, что, когда список изменен, элемент остается в прошлом.Вход на второй экран передаст пустой список.

Вот как я делаю копию списка, которая передается вперед:

_pushWordLists(List<WordList>.from(_selections.values));

_pushWordLists(List<WordList> wordLists) {
  Navigator.of(context).push(
    MaterialPageRoute(
        builder: (context) => CardWidget(wordLists)
    )
  );
}

И вот как я изменяюсписок:

_loadNewWord() {
    if (wordLists.length > 0) {
        wordLists.shuffle();

        final wordList = wordLists.first;

        if (wordList.words.length > 0) {
            wordList.words.shuffle();
            var words = List<String>.from(wordList.words);

            final word = words.first;
            words.remove(word);

            wordList.words = words;

            setState(() {
                _multiplier = wordList.multiplier;
                _word = word;
            });
        } else {
            wordLists.remove(wordList);

            _loadNewWord();
        }
    } else {
        _done();
    }
}

Мне сказали, что создание копии позволит мне изменить ее длину, а также сохранить исходный список без изменений.Как мне этого добиться?

1 Ответ

0 голосов
/ 28 декабря 2018

Кажется, что вы используете оригинальные экземпляры WordList вместо копий.

В первой строке первого примера:

List<WordList>.from(_selections.values)

создаст новый список с такими же экземплярами из WordList, что и _selection.Сам объект списка является новым, но он содержит те же списки WordLists, что и _selection.

Во втором примере

    final wordList = wordLists.first;

берет экземпляр WordList из переданного списка (помните, этоЭкземпляр также включен в оригинальный _selection) и

        wordList.words = words;

обновляет его.

Решение: строка List<WordList>.from(_selections.values) должна быть заменена чем-то, чтобы фактически создать новый список фактических клонов WordLists в _selection.Импорт dart:convert и использование JSON.decode(JSON.encode(object)) будет , а не работать в Flutter.Итак, вам, скорее всего, придется прийти с собственным cloneFrom(WordList source) методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...