ListView.builder按需创建窗口小部件是什么意思?

时间:2019-09-25 11:53:23

标签: flutter dart

来自flutter's official documentation

  

ListView.builder创建一个可滚动的线性数组,这些数组是按需创建的。   此构造函数适用于具有大量(或无限多个)子级的列表视图,因为仅针对那些实际可见的子级调用该构建器。

我正在做一些实验,以了解其工作原理,并了解它是否仅创建了实际上可见的小部件。

我写了这个简单的代码:

List<int> numbers = [1,2,3,4,5,6,7,8,9];

void test(){
  print("one widget created"+DateTime.now().toString());
}

Widget build(BuildContext context) {
  return Container(
    height: 300,
    child: ListView.builder(
      itemBuilder: (ctx, index){
        test();
        return Card(
          Text("number "+numbers[index].toString())
        );
}

现在从理论上讲,如果屏幕上显示的Cards的最大数量为3,则在控制台中我应该只读取3条消息,但是如果执行代码,我将在控制台中看到9条消息,这意味着该功能是被执行了9次,而不是预期的3次。 那么,什么是按需创建窗口小部件?

2 个答案:

答案 0 :(得分:1)

是的,您在这里是对的,ListView.builder不会创建3个元素而是9个元素,因为它在屏幕的顶部和底部保留了一些缓冲区以保持fps。假设它只创建了3个项目,并且用户高速滚动,那么滚动会滞后,因为Flutter需要先创建要显示的项目然后进行渲染,因此要避免这些类型的情况,它会保留一些内容缓冲区数量已满。它按需创建小部件,这是真的,让我们举个例子,如果有1000个项目需要显示,一次只能显示3个,那么Flutter不会创建1000个小部件对象,而是像上面所说的那样创建只有9个,随着用户滚动,它将销毁并创建新的。

答案 1 :(得分:1)

ListView 按需创建小部件。只是您对“按需”的愿景与他们的愿景略有不同。

ListView将创建从索引0到用户滚动并在此处停止的所有小部件。

因此,如果我们有1000个项目的列表,并且用户滚动到50个项目并且可见3个项目,那么ListView.builder将构建前53个小部件(为了平滑滚动,可能会添加一些小部件)

因此,它不会仅构建可见的内容 ,但也不会构建所有内容

相关问题