flutter正在更新而不使用setState

时间:2018-05-19 19:04:24

标签: android dart flutter

在提供here无限滚动的示例中,它在到达结尾时再添加10个项目。

if (index >= _suggestions.length) {
      // ...then generate 10 more and add them to the suggestions list.
      _suggestions.addAll(generateWordPairs().take(10));
}

我不明白的是,即使他们没有打电话给setState(),ListView也会如何更新?

1 个答案:

答案 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]);
      },
    );
  }

查看ListViewSliverChildBuilderDelegate的文档,我看到了声明:

  

builder仅对大于或等于零且小于childCount的索引(如果childCount非空)进行调用。

所发生的事情是我们没有向itemCount提供ListView,这使它相信它具有无限元素。所以我们不需要setState告诉它我们还有10个项目;它从来不知道我们必须开始的项目数量。只要当ListView到达他们时,项目就在那里就会很高兴。

严格地说,此列表不会“跟踪”_suggestions的更改。通过提供空itemCount,您告诉ListView您有无限的项目;此外,_suggestions中的现有项目永远不会改变,它们只是附加。在此示例中,只需要告知颤动_saved

另一方面,如果我们有类似的东西 ListView.builder(itemCount: _suggestions.length ...),然后我们需要确保在列表长度发生变化时调用setState