修改复制清单会改变原始清单

时间:2018-12-27 15:39:58

标签: list dart flutter

我有两个屏幕,我正在将列表从一个屏幕传递到另一个屏幕。列表类型是一个自定义对象,其中包含另一个列表。在第二个屏幕上,从子列表中删除一个随机项目,直到没有更多项目为止,这时包含空列表的项目也将被删除。直到顶级列表中没有其他项目为止,这种情况才会发生。问题是,当修改列表时,该项目不见了。进入第二个屏幕将显示一个空白列表。

这就是我制作向前转发的列表副本的方式:

_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 :(得分:0)

似乎您在操作WordList的原始实例,而不是副本。

在第一个示例的第一行:

List<WordList>.from(_selections.values)

将创建一个新列表,其中的相同实例WordList,称为_selection。列表对象本身是新的,但它包含与_selection相同的WordList。

在第二个示例中

    final wordList = wordLists.first;

从传递的列表中获取WordList的一个实例(请记住,该实例也包含在原始_selection中)和

        wordList.words = words;

更新它。

解决方案:应将List<WordList>.from(_selections.values)行替换为在_selection中实际创建WordList的实际副本的新列表。导入dart:convert并使用JSON.decode(JSON.encode(object))在Flutter中将起作用。因此,您很可能必须使用自己的cloneFrom(WordList source)方法。