【发布时间】:2021-09-27 09:41:46
【问题描述】:
ListView.builder 和 map 函数在创建小部件列表时有什么区别?我们什么时候应该使用一个而不是另一个?。
【问题讨论】:
ListView.builder 和 map 函数在创建小部件列表时有什么区别?我们什么时候应该使用一个而不是另一个?。
【问题讨论】:
如果您的项目列表很长,请使用ListView.builder()。它只构建在屏幕上可见的项目。每次用户滚动列表时,它都会构建下一个可见项。
如果你使用
Column(
children: items.map((items){
return ...
}).toList()
)
它的构建成本很高。
所以,我认为最好的做法是使用 ListView.builder() 。
你可以使用map
如果您确定项目不超过几项。
【讨论】:
它们是具有不同目的的方法。您可以使用列表的 map 方法将其转换为不同的可迭代对象。另一方面,ListView.builder 是一个带有 itemBuilder 方法的小部件。我假设您问的是 ListView() 和 ListView.builder() 构造函数之间的区别。
ListView() 构造函数接受子参数,您可以在其中使用列表的 map 方法创建小部件列表。调用 build 方法时会立即呈现这些小部件。
ListView.builder() 另一方面,接受 itemBuilder 和 itemCount 参数。不同之处在于它不会立即渲染对象,而是仅当它们需要在屏幕上可见时才渲染。因此,如果您有一个大列表,则仅会渲染由于滚动而应该可见的唯一项目,而其他项目则不会。向下滚动时,将呈现新项目,而不再呈现以前的项目。如果您有 1000 个项目但只有 10 个适合页面,则呈现这 10 个。所以这种方式可以有效地使用内存。
只要您有需要转换为小部件列表的数据列表,请使用 ListView.builder()。仅当您手动创建小部件或使用小列表时才使用 ListView()。
两者的示例:
final list = ['this', 'is', 'my', 'list'];
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: list.length,
itemBuilder: (context, index) => Text(list[index]),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: const [
Text('Some Text'),
Text('Some different text'),
Text('Another'),
Text('Some Text'),
],
),
);
}
【讨论】: