performance - Flutter modal 底片性能问题
问题描述
拖动模态底部工作表时,如果工作表内有很多小部件,则颤动应用程序开始滞后。这仅发生在模态底部表 (showModalBottomSheet) 上,而不发生在普通底部表 (showBottomSheet) 上。下面我附上了性能分析的屏幕截图,它显示,当用户拖动时,工作表内的所有小部件都在不断重建。
我写了一个小演示来比较两种类型的工作表的性能。有没有办法在拖动时防止重建?
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"),
);
},
),
);
}
}
解决方案
我创建了这个 PR来解决这个性能问题。问题是AnimatedContainer
fromModalBottomSheet
没有使用该child
属性,因此它在动画运行时强制调用builder
方法多次,而不是使用已经构建的子小部件。
推荐阅读
- string - 如何在同一行中多次拆分字符串?
- java - HashMap获取键值的意外字符串
- java - 使用具有可变大小的 cplex 在 java 中定义二元决策变量
- flutter - 无法将 Image.file 设置为颤动的圆形头像
- qt - 将 QPainter 渲染的结果存储到 QPixmap 实例中
- python - 如何使用 pandas 从数据框中构建开始/停止段列表?
- dialogflow-es - 我需要使用 PHP y Dialogflow 存储会话变量
- flutter - 如何使用 GroupedListView/ListView.builder 对卡片中的 listTiles 进行分组?
- reactjs - 如何在最初下载和执行 React 项目时创建加载?
- android - 如何使用图像流(颤振)创建条形码扫描仪