繁体   English   中英

不使用setState更新flutter

[英]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]);
      },
    );
  }

查看ListViewSliverChildBuilderDelegate的文档,我看到以下语句:

仅对于大于或等于零且小于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM