Flutter 最佳实践 - 06
原文 https://vipinvijayannair.medium.com/
前言
作者把工作中的经验这样了罗列,这是第 6 部分,持续更新。
正文
抽取正确命名
// Do not
SvgPicture.asset(
Images.frameWhite,
height: 13.0,
width: 13.0,
);
// Do
final _frameIconSize = 13.0;
SvgPicture.asset(
Images.frameWhite,
height: _frameIconSize,
width: _frameIconSize,
);
理解 Flutter 的约束概念
Flutter 布局有一个经验法则,每个 Flutter 应用程序开发者都需要知道: 约束减少,尺寸增加,父代设置位置。
widget 的选择很重要
widget 的选择不当可能导致更大的树,从而导致更大的构建时间,从而导致性能问题。
只在必要时使用软件包
当你想要加快你的构建过程时,软件包是一个很好的选择, Pub 有很多这样的软件包。尽管如此,他们可以有显着的影响,你的应用程序的性能时,他们使用没有事先研究。
Linting 语法检查
当您使用最新版本的 Flutter 创建项目时,analysis_options.yml
文件默认使用正式的 lint 规则创建。
你可浏览 https://flutter.dev/docs/perf/rendering/best-practices ,了解更多有关上述两点的详细资料,以及更多其他良好作业模式。
在构建完成后做一些事情可以提高性能
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
doSomething();
});
}
使用安全区 SafeArea
SafeArea widget 通过移除操作系统控件(如状态栏、底部导航按钮(如后退按钮))所需的填充来插入子部件。
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: SafeArea(
child: YourWidget(),
},
};
}
使用 keys 来提高 Flutter 性能
这通过使用键的 Flutter 来更好地识别 widget ,从而提供了更好的性能。
// FROM
return value
? const SizedBox()
: const Placeholder(),
// TO
return value
? const SizedBox(key: ValueKey('SizedBox'))
: const Placeholder(key: ValueKey('Placeholder')),
----------------------------------------------
// FROM
final inner = SizedBox();
return value ? SizedBox(child: inner) : inner,
// TO
final global = GlobalKey();
final inner = SizedBox(key: global);
return value ? SizedBox(child: inner) : inner,
分析并减小应用程序的大小
在开发阶段,很容易在应用程序中使用多个包、代码和 widget 。但有时,存储所有这些数据需要很高的内存,这也降低了应用程序的性能。
Flutter 的开发工具提供了减少应用程序大小的优势。在 Gradle 的帮助下,你可以减少 Flutter 应用程序的大小来优化 Flutter 的性能。
使用 Google 推出的打包系统,您可以创建大量 Android 应用程序。应用程序包在许多方面都是有益的。这个应用程序包的一个主要特性是允许您从 Google Play Store 下载原始代码。Google Play Store 提供了与设备兼容的应用程序,并支持平台架构。
构建应用程序包
iOS:
使用图像列表 image ListView 视图时优化内存
ListView.builder(
...
addAutomaticKeepAlives: false (true by default)
addRepaintBoundaries: false (true by default)
);
精确地显示图像和图标
预缓存图像以获得更好的性能。
precacheImage(AssetImage(imagePath), context);
使用 SKSL Warmup
$ flutter run --profile --cache-sksl --purge-persistent-cache
$ flutter build apk --cache-sksl --purge-persistent-cache
如果应用程序在第一次运行时有干净的动画,然后对于相同的动画变得平滑,这可能是由于着色器编译的延迟。
不要在 List Maps 列表映射中使用引用
不要
List a = [1,2,3,4];
List b;
b = a;
a.remove(1);
print(a); // [2,3,4]
print(b); // [2,3,4]
因此,每当您尝试调用 list a 的任何方法时,list b 都会被自动调用。
例如 a.remove (some) ; 也将从列表 b 中删除该项;
应该
List a = [1,2,3,4];
List b;
b = jsonDecode(jsonEncode(a));
a.remove(1);
print(a); // [2,3,4]
print(b); // [1,2,3,4]
不惜一切代价避免绝对定位
绝对定位是构建应用程序时最糟糕的事情之一。当只为一个特定的设备编写代码时,看起来绝对定位并没有那么糟糕。然而,当你构建一个应用程序,并打算发布到各种不同的设备和操作系统上时,绝对定位可能真的会把界面搞得一团糟。尽可能使用适合屏幕大小的值,而不是绝对定位
小贴士:
- 减少不透明度的使用(使用渐变/动画不透明度)
- 避免将所有 widget 划分为方法。
- 将代码分割成更小的代码以获得更高的性能。
- 避免重新构建 widget 。
官方文档
Https://docs.flutter.dev/perf/best-practices
使用 DevTools 进行性能测试:
Https://docs.flutter.dev/development/tools/devtools/performance
Https://docs.flutter.dev/perf
Https://api.flutter.dev/flutter/widgets/statefulwidget-class.html#performance-considerations
结束语
如果本文对你有帮助,请转发让更多的朋友阅读。
也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。
祝你有一个美好的一天~
© 猫哥
微信 ducafecat
https://wiki.ducafecat.tech
https://ducafecat.com