Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter ListView.builder按需创建小部件意味着什么?_Flutter_Dart - Fatal编程技术网

Flutter ListView.builder按需创建小部件意味着什么?

Flutter ListView.builder按需创建小部件意味着什么?,flutter,dart,Flutter,Dart,发件人: ListView.builder创建一个可滚动的线性小部件数组,这些小部件是根据需要创建的。 此构造函数适用于具有大量(或无限)子对象的列表视图,因为只为那些实际可见的子对象调用生成器 我在做一些实验,看看它是如何工作的,并了解它是否真的只创建了实际可见的小部件 我编写了以下简单代码: List<int> numbers = [1,2,3,4,5,6,7,8,9]; void test(){ print("one widget created"+DateTime.no

发件人:

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())
        );
}
列表编号=[1,2,3,4,5,6,7,8,9];
无效测试(){
打印(“创建一个小部件”+DateTime.now().toString());
}
小部件构建(构建上下文){
返回容器(
身高:300,
子项:ListView.builder(
itemBuilder:(ctx,索引){
test();
回程卡(
文本(“数字”+数字[索引].toString())
);
}
现在理论上,如果屏幕上可以看到的卡的最大数量是3,在控制台中我应该只读取3条消息,但是如果我执行代码,我将在控制台中看到9条消息,这意味着函数执行了9次,而不是预期的3次。
那么,什么意味着这些小部件是按需创建的呢?

是的,您在这里是正确的,
ListView.builder
不会创建3个而是9个元素,因为它在屏幕的顶部和底部保留了一些缓冲区,以便维护fps。假设它只创建了3个项目,并且用户以高速滚动页面,然后滚动页面将延迟,因为Flatter需要先创建显示项目的窗口,然后渲染它,因此为了避免这些类型的场景,它已经保留了一些缓冲区。它会根据需要创建小部件。这是真的,让我们举一个例子,如果有1000个项目需要显示,并且一次只能显示3个,那么它与F不同lutter将创建1000个widget对象,而不是像您上面所说的那样,它只创建9个,当用户滚动时,它将销毁并创建新的对象。

ListView确实会按需创建widget。只是您对“按需”的看法与他们的略有不同

ListView将创建从索引0到用户滚动并停止的所有窗口小部件

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


因此,它不仅构建可见的东西,而且也不能构建所有东西。

我刚刚做了另一个实验,你是对的,我认为颤振使用的方程是(x=y*4)其中,x是要加载的小部件总数的值,y是可见元素的值。但有一个细节,不幸的是,颤振并没有破坏那些不太可见的元素,而是简单地加载其他元素。事实上,在我的实验中,我创建了一个包含66个元素的列表,在我上下滚动之后,应用程序已经我开始有点滞后了哦,我不知道这个等式,但是是的,ListView.builder就是这样工作的。很高兴我能帮上忙!所有53个小部件都保留在内存中吗?或者有没有像Android的RecylerView这样的东西可以回收不立即可见的视图?所有53个都保留在内存中,直到你需要的更少。它们是需要的因为它们可能会被设置动画,所以随着时间的推移,可见的内容可能会发生变化