流畅度(提高渲染性能)
控制build()方法的耗时
避免在
build()
方法中进行重复且耗时的工作,因为当父 widget 重建时,子 Wdiget 的build()
方法会被频繁地调用。将嵌套过多的 widget拆成不同的 widget,并进行封装
在构建可复用的 UI 代码时,最好使用 StatelessWidget 而不是函数。
请尽可能地在 widget 上使用
const
构造函数const 在 Dart 中用于声明常量,应用到 widget 中就相当于告诉 Flutter,“我这个组件不会随状态更新而改变了。”,因此达到了减少重建的效果。
使用 const 也需要注意如下几点:
当const 修饰类的构造函数时,它要求该类的所有成员都必须是final的。
const 变量只能在定义的时候初始化。
尽量减少 saveLayer 的调用(调用 saveLayer() 会开辟一片离屏缓冲区)
参考:Flutter 应用性能优化最佳实践 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter
列表优化
- 构建大型网格或列表的时候,使用懒加载的方式也就是使用 ListView 和 GridView 的 builder 方法,尽量避免使用 ListView(children: [],) 或 GridView(children: [],)
对已知的所有单元格大小固定时设置属性:itemExtent
- 针对于可折叠的 ListView,未展开状态时,设置其 itemCount 为 0,这样 item 只会在展开状态下才进行构建,以减少页面第一次的打开构建时间。
尽量减少由内部操作引起的布局传递
例如,你想要所有单元格都具有或大或小的效果(或类似需要轮询所有单元格的计算)时,就会发生内部传递。
避免内部传递:
将单元格设置为固定大小。(比如设置ListView属性:itemextent大小)
选择一个特定的单元格作为 “锚” —所有单元格的尺寸都将相对于这个单元格。编写一个自定义渲染对象,首先定位子锚点,然后在其周围布置其他子单元。
避免使用 Opacity
widget,尤其是在动画中避免使用。可以使用 AnimatedOpacity
或 FadeInImage
代替该操作。
使用 AnimatedBuilder
时,将不需要变化的widget作为 child 传递给 AnimatedBuilder
,从而只构建一次。
避免在动画中裁剪,尽可能的在动画开始之前预先裁剪图像。
应用程序的大小
执行如下命令,可以查看详细信息:
flutter build apk --analyze-size --target-platform android-arm64
- 代码混淆
flutter build apk --obfuscate --split-debug-info=./out/android/app.android-arm64.symbols
资源文件优化
避免使用过多的第三方库
图片优化:1.压缩 PNG 和 JPEG 文件2.使用WebP格式替换PNG图片
移除未使用的依赖库和资源。其中Android端
buildTypes { release { // 移除无用的资源文件 shrinkResources true // ZipAlign 优化 zipAlignEnabled true // 设置混淆 minifyEnabled true // Signing with the debug keys for now, so `flutter run --release` works. signingConfig signingConfigs.release } }
minifyEnabled:是否启用代码缩减
如果将 minifyEnabled 属性设为 true,系统会默认启用 R8 代码缩减功能。代码缩减(也称为“摇树优化”)是指移除 R8 确定在运行时不需要的代码的过程。此过程可以大大减小应用的大小,例如,当您的应用包含许多库依赖项,但只使用它们的一小部分功能时。
shrinkResources:是否启用缩减资源
资源缩减只有在与代码缩减配合使用时才能发挥作用。在代码缩减器移除所有不使用的代码后,资源缩减器便可确定应用仍要使用的资源。
android端可以设置cpu架构
ndk { // armeabi:已经淘汰(0%) // armeabi-v7a:曾经主流的架构平台(20%) // arm64-v8a:目前主流架构平台(80%) abiFilters "armeabi-v7a", "arm64-v8a" // abiFilters "arm64-v8a" }