在提供here无限滚动的示例中,它在到达结尾时再添加10个项目。
if (index >= _suggestions.length) {
// ...then generate 10 more and add them to the suggestions list.
_suggestions.addAll(generateWordPairs().take(10));
}
我不明白的是,即使他们没有打电话给setState()
,ListView也会如何更新?
答案 0 :(得分:1)
请注意。我们需要更多代码才能理解这一点。
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
的文档,我看到了声明:
builder
仅对大于或等于零且小于childCount
的索引(如果childCount
非空)进行调用。
所发生的事情是我们没有向itemCount
提供ListView
,这使它相信它具有无限元素。所以我们不需要setState
告诉它我们还有10个项目;它从来不知道我们必须开始的项目数量。只要当ListView
到达他们时,项目就在那里就会很高兴。
严格地说,此列表不会“跟踪”_suggestions
的更改。通过提供空itemCount
,您告诉ListView
您有无限的项目;此外,_suggestions
中的现有项目永远不会改变,它们只是附加。在此示例中,只需要告知颤动_saved
。
另一方面,如果我们有类似的东西
ListView.builder(itemCount: _suggestions.length ...)
,然后我们需要确保在列表长度发生变化时调用setState
。