我有两个屏幕,我正在将列表从一个屏幕传递到另一个屏幕。列表类型是一个自定义对象,其中包含另一个列表。在第二个屏幕上,从子列表中删除一个随机项目,直到没有更多项目为止,这时包含空列表的项目也将被删除。直到顶级列表中没有其他项目为止,这种情况才会发生。问题是,当修改列表时,该项目不见了。进入第二个屏幕将显示一个空白列表。
这就是我制作向前转发的列表副本的方式:
_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();
}
}
有人告诉我制作一个副本可以让我修改它的长度,并保持原始列表的完整性。我该如何实现?
答案 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)
方法。