Flutter中ListView和SingleChildScrollView+ListBody有什么区别?

aiqt4smr  于 2023-04-07  发布在  Flutter
关注(0)|答案(2)|浏览(135)

我有一个关于比较ListView和包含ListBodySingleChildScrollView的问题。表面上,这两个结果看起来是一样的。但我很好奇这两个在功能上是否有区别。在我看来,这可能是效率或性能的一部分,但我不确定。提前感谢。

SingleChildScrollView + ListBody

final items = List.generate(100, (index) => index).toList();

SingleChildScrollView(
  child: ListBody(
    children: items.map((e) => Text('$e')).toList(),
  )
)

列表视图

final items = List.generate(100, (index) => index).toList();

ListView(
  children: items.map((e) => Text('$e')).toList(),
)
agxfikkp

agxfikkp1#

我知道一个区别:

  • ListView:是lazy load。
  • ListBody是一次性加载的。

今天我修正了一个bug,涉及到ListView的延迟加载功能,我改到ListBody,修正了一下。
我有一个应用程序,使用flutter-markdown,我使用ListView渲染许多markdown片段,像这样:

ListView(
   children: <Markdown>[..._contents], 
)

我使用flutter_markdown.MarkdownElementBuilder来解析Markdown大纲(TOC内容表),但是flutter_markdown ast逻辑只在Markdown.build()上运行,所以,如果你不把ListView页面拉到底部,你就不会得到完整的大纲,bug显示:bug image
我用ListBody修复了这个bug

SingleChildScrollView(
  child: ListBody(
       children: <Markdown>[..._contents], 
    )
)

修复bug后:bug fix image
此外,如果您正在浏览一个长页面,向下滚动时可能会有一些卡住(使用ListView),因为ListView在下拉期间会不时加载计算。

jaql4c8m

jaql4c8m2#

我必须说我实际上从来没有听说过小部件ListBody,但是当你检查它的源代码时,你可以看到评论:

/// This widget is rarely used directly. Instead, consider using [ListView],
/// which combines a similar layout algorithm with scrolling behavior, or
/// [Column], which gives you more flexible control over the layout of a
/// vertical set of boxes.

所以flutter的开发者们并不推荐使用它。我也不知道两者的确切区别是什么,所以我想我并没有真正回答你的问题。也许其他人可以,但你也可以自己研究源代码,因为它都是开源的。

相关问题