[英]flutter is updating without using setState
在此处提供的无限滚动示例中,它到达末尾时又增加了10个项目。
if (index >= _suggestions.length) {
// ...then generate 10 more and add them to the suggestions list.
_suggestions.addAll(generateWordPairs().take(10));
}
我不明白的是,即使ListView不调用setState()
,ListView如何得到更新?
众所周知。 我们将需要更多的代码来理解这一点。
Widget _buildSuggestions() {
return new ListView.builder(
padding: const EdgeInsets.all(16.0),
itemBuilder: (context, i) {
if (i.isOdd) return new Divider();
final index = i ~/ 2;
if (index >= _suggestions.length) {
_suggestions.addAll(generateWordPairs().take(10));
}
return _buildRow(_suggestions[index]);
},
);
}
查看ListView
和SliverChildBuilderDelegate
的文档,我看到以下语句:
仅对于大于或等于零且小于
childCount
(如果childCount
为非空),将调用builder
。
因此,发生的事情是我们没有向ListView
提供itemCount
,这使其认为它具有无限个元素。 因此,我们不需要setState
来告诉我们还有10个项目; 它从来不知道我们必须开始多少个项目。 只要ListView
到达项目时它们就在那里,它就会很高兴。
严格来说,此列表不会“跟踪”对_suggestions
更改。 通过提供空的itemCount
您可以告诉ListView
您有无限的项目; 此外, _suggestions
的现有项目永远不会改变,它们只会被附加。 在此示例中,只需要告知_saved
的更改。
另一方面,如果我们有类似ListView.builder(itemCount: _suggestions.length ...)
,则需要确保在列表长度更改时调用setState
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.