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

标签 flutter dart

flutter's official documentation:

ListView.builder creates a scrollable, linear array of widgets that are created on demand. This constructor is appropriate for list views with a large (or infinite) number of children because the builder is called only for those children that are actually visible.



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

我写了这个简单的代码:
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。
那么,什么是按需创建窗口小部件?

最佳答案

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

关于flutter - ListView.builder按需创建窗口小部件是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58097736/

相关文章:

flutter - 致命异常 : main, 启动应用程序/Flutter 时出错

flutter - 如何在 TextButton 上设置最小宽度(不更改最小高度)

unit-testing - 测试基于 WebGL/Canvas 的游戏的视觉部分的可能方法是什么

list - Flutter 计算其类别中商品的总价

dart - 了解 Dart Flutter 框架

ios - Flutter + Firebase 抛出未处理的异常 : This widget has been unmounted Error Using Navigator to change view

dart - 如何在Dart中的html模板中获取RouteDefinition的AdditionalData

flutter - Provider中的监听器如何在Flutter中工作?

ios - Flutter iOS 错误类 AMSupportURLConnectionDelegate 在/usr/lib/libamsupport.dylib (0x203913130) 中都有实现

angularjs - 在Polymer.dart中是否有类似于angular $ rootScope的东西?