【发布时间】:2021-11-16 21:21:42
【问题描述】:
我有一个简短的ListView,最多包含 10 个项目。每个列表项都将包含一个DropDownButton,它将容纳大约 1K 个DropDownMenuItems 以供选择。
在原生 Android 中,我能够实现一个运行非常流畅的功能,但使用 Flutter 构建 ListView 需要一段时间,这会导致 UI 冻结。
在我的情况下,我需要在 ListView 中的一项发生每次更改时重建它,所以这将是一个主要问题。
有没有办法让 ListView 构建得更快,或者至少能够在构建之前显示ProgressBar?
注意:使用--profile 配置来模拟发布版本可以大大提高性能,但仍然感觉卡顿。
这是我的示例代码,如果您想自己测试,可以直接复制/粘贴。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool showList = false;
final List<DropdownMenuItem<int>> selections = List.generate(
1000,
(index) => DropdownMenuItem<int>(
value: index,
child: Text("$index"),
),
);
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Container(
width: double.infinity,
child: Column(
children: [
ElevatedButton(
child: Text("toggle list visibility"),
onPressed: () {
setState(() {
showList = !showList;
});
},
),
Expanded(
child: showList
? ListView.builder(
cacheExtent: 2000,
itemCount: 10,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Container(
height: 200,
color: Colors.green,
child: Column(
children: [
Text("List Item: $index"),
DropdownButton<int>(
onChanged: (i) {},
value: 1,
items: selections,
),
],
),
),
),
);
})
: Text("List Not Built"),
),
],
),
),
),
);
}
}
【问题讨论】:
-
您应该使用带有 SliverList 列表而不是 ListView 的 CustomScrollView。
标签: flutter flutter-listview flutter-dropdownbutton