当拖动模态底层表时,如果有很多小部件住在表内,flutter应用就会开始滞后。这只发生在模态底层工作表上(showModalBottomSheet),而不是在普通工作表上(showBottomSheet).下面我附上了一张性能分析的截图,它显示,当用户拖动时,工作表内的所有widget都在不断重建。
我写了一个小演示来比较两种类型的表的性能。有什么方法可以防止拖动时的重建吗?
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
/// This Widget is the main application widget.
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "demo",
home: Scaffold(
body: MyButtons(),
),
);
}
}
class MyButtons extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
onPressed: () {
showModalBottomSheet<void>(
context: context,
builder: (context) => BottomSheet(),
);
},
child: Text("show modal (laggy)"),
),
RaisedButton(
onPressed: () {
showBottomSheet<void>(
context: context,
builder: (context) => BottomSheet(),
);
},
child: Text("show normal (not laggy)"),
),
],
),
);
}
}
class BottomSheet extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Wrap(
spacing: 8.0,
alignment: WrapAlignment.center,
children: List<Widget>.generate(
100,
(int index) {
return InputChip(
label: Text("test"),
);
},
),
);
}
}
我已经创建了 此公关 来解决这个性能问题。问题在于 AnimatedContainer
来自 ModalBottomSheet
没有使用 child
财产,因此它被迫调用 builder
方法多次,而不是使用已经建立的子部件。