【发布时间】:2021-11-13 11:52:15
【问题描述】:
我有一个使用 ListView.builder 显示的项目列表(5-6 项)。 每个项目包含一个 DropdownButton 小部件,供用户从 1 到 1000 中选择一个数字,因此包含 1000 个 DropdownMenuItems。
我实现如下图,但问题是向下滚动ListView太慢而且卡顿。即使 listView 有 5 或 6 个项目,但请注意,每个项目都有一个嵌入的 DropdownButton,其中包含 1000 个 DropdownMenuItem。
有解决办法吗?或者其他方式来满足我的要求?
注意:即使我将 DropdownMenuItem 的数量减少到 100 个,它仍然会在向下滚动 ListView 时卡顿。
class List extends StatelessWidget {
final List<Item> // Contains 5 items.
final List<int> quantityList = List<int>.generate(1000, (int i) => i);
//--
child: ListView.builder(
itemBuilder: (buildContext, i) {
return MyItem(
quantityList,
);
},
itemCount: items.length(),
)
class MyItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Container(
child: DropdownButton<int>(
items: quantityList
.map(
(int e) =>
DropdownMenuItem<int>(
value: e,
child: Text(e.toString()),
),
)
.toList(),
),
),
);
}
编辑
我将 MyItem 类更改为如下,但仍然存在同样的问题。
尝试使用 ListView 和 ListView.custom 而不是 ListView.builder,根据this提前而不是懒惰地构建整个列表,但仍然是同样的问题。
我还尝试使用--profile 配置运行应用程序来模拟发布版本。性能更好,但仍然遭受可怕的口吃和滞后。在模拟器和物理设备上测试。
class MyItem extends StatelessWidget {
List<DropDownMenuItem> quantityList; // contains 1k
@override
Widget build(BuildContext context) {
return Container(
width:300,
height:300,
child: DropdownButton<int>(
items: quantityList,
),
),
);
}
【问题讨论】:
-
如果将 DropdownButton() 替换为相同宽度/高度的 SizedBox() 会发生什么?如果将 DropdownButton() 替换为 Column(children: quantityList) 会发生什么?这些中的任何一个都表现出相同的性能问题吗?
-
@Pat9RB 不,如果我使用包含 1000 个文本小部件的非常长的列,则没有问题。
标签: flutter flutter-listview flutter-dropdownbutton