一般情况下我们通过Flutter 技术构建的应用程序在默认情况下都是高性能的。但是呢,在编程中难免会掉入一些性能陷阱,在这一节呢我将向大家分享Flutter一些性能优化的思路并根据优化实践。

性能优化的最好时机是在编码阶段,如果你能掌握一些性能优化技巧和最佳实践,那么在编码时就可以考虑到怎么设计会性能最优,怎么实现会拖慢性能;而不是开发完成之后在去着手做性能优化,这样先污染后治理的思路。

在我们前面的Flutter开发过程中已经应用了不少Flutter性能优化的技巧以及一些最佳实践,所以说呢,在这一节主要还是对性能优化做个总结,以帮助大家更新的学习和掌握。

优化前要以 性能模式 运行 Flutter 应用

  • 内存优化
  • build()方法优化
    • 在build()方法中执行了耗时的操作
    • build()方法中堆砌了庞大的Widget
  • 列表优化方法
  • 案例:帧率优化

内存优化

要进行内存优化首先我们需要了解下内存的检测手段,这样我们才好进行内存优化前后的效果对比。

Flutter性能检测工具Flutter Performance

在 IDE 的 Flutter plugin 中提供了 Flutter Performance工具,它是一个可用来检测Flutter滑动帧率和内存的工具。

我们可以从IDE的侧边栏中打开这个工具,也可以借助Dart DevTools来查看内存的使用情况:

此时可以打开一个页面或进行一些操作来观察内存的变化,如果内存突然增大很多就要特别关注是否是合理的增加,必要时要排查导致内存增加的原因和考虑对于的优化方案。

关于如何判断优化后内存有没有变化,可以通过Dart DevTools的Memory选项卡来完成,当你销毁一个FlutterEngine后可以通过GC按钮来触发一次GC来查看内存的变化。

build()方法优化

在我们用Flutter开发UI的时候,打交道最多的方法便是build()了,使用build()方法时有两个常见的陷阱,我们一起来看一下:

在build()方法中执行了耗时的操作

我们应该尽量避免在build()中执行耗时的操作,这是因为build()方法会频繁的调用,尤其是当父Widget重建的时候;所以,耗时的操作建议挪到initState()这种不会被频繁调用的方法中;

另外,我们尽量不要在代码中进行阻塞式操作,可以将文件读取,数据库操作,网络请求这些操作通过Future来转成异步完成;另外对于CPU计算频繁的操作比如:图片压缩等可以使用Isolate来充分利用多核心CPU;

build()方法中堆砌了庞大的Wdiget

在画UI的时候有的小伙伴喜欢一把梭,其实这是一个特别不好的习惯;如果build()中返回的Widget过于庞大会导致三个问题:

  • 代码可读性差:因为Flutter的布局方式的特殊性,画界面我们离不了的需要一个Wdiget嵌套一个Wdiget,但如果Wdiget嵌套太深则会导致代码的可读性变差,也不利于后期的维护和扩展;
  • 复用难:由于所有的代码都在一个build()方法中,会到导致无法将公共的UI代码服用到其它的页面或模块;
  • 影响性能:我们在 State 上调用 setState()时,所有build()中的 Widget 都将被重建;因此build()中返回的Widget树越大那么需要重新建的Widget越多,对性能越不利;见下图:

假如上图是我们在一个build()方法中所返回的widget树,那么当左侧红框中的widget需要更新的时候,最小的更新成本是只更新需要跟新的部分,但是由于它们都在一个State的build方法所以,调用setState()时会导致右边很多不需要更新的widget也需要重新;正确的做法是,将 setState() 的调用转移到其 UI 实际需要更改的 Widget 子树部分。

可以回想下在我们项目中有哪些地方又进行过类似的优化:hi_flexible_header.dart

列表优化方法

在构建大型网格或列表时,我们要尽量避免直接使用ListView(children: [],)GridView(children: [],),因为在这种场景下会导致列表中所有的数据都会被一次性绘制出来不管列表内容是否可见,这种用法类似Android的ScrollView;所以说当你的列表中的数据量比较大时建议你用:

  • ListView.builder(itemBuilder: null)
  • GridView.builder(gridDelegate: null, itemBuilder: null)

这两个方法,因为这两个方法只有在屏幕的可见部分是在列表的内容才开始被创建,这种又发类似于Android的RecyclerView。

帧率优化

决定列表性能的好坏一个很关键的因素就是帧率,通常情况下手机的刷新频率为60fps,当然目前陆续出现一些高刷屏的手机能够达到90甚至120的fps。在Flutter中获取应用的帧率我们可以通过Flutter Performance选项卡来查看页面帧率:

另外可以点击上图左上角Performance overlay按钮来打开性能图层功能:

通过这个图表我们可以帮助我们分析 UI是否产生了卡顿,垂直的绿色条条代表的是当前帧,每一帧都应该在 1/60 秒(大约 16 ms)内创建并显示。如果有一帧超时而无法显示,就导致了卡顿,上述图表就会展示出来一个红色竖条。如果是在 UI 图表出现了红色竖条,则表明 Dart 代码消耗了大量资源。红色竖条表明当前帧的渲染和绘制都很耗时。

帧率优化案例

借助Flutter Performance我们对课程项目的首页进行帧率检测:

因为debug模式下Flutter的性能会受到比较大的限制,为了还原检测的真实性我们需要在分析模式运行APP。

  • 在 Android Studio 和 IntelliJ 使用 Run > Flutter Run main.dart in Profile Mode 选项
  • 或者通过命令行使用 --profile 参数运行
    • flutter run --profile

注意:模拟器不支持分析模式,可以用真机连接电脑来进行分析

优化前

优化后

Flutter 性能优化相关推荐

  1. Flutter性能优化—UI

    耗时三个月总结全网大部分Flutter性能分析的方法论,并且结合实战验证效果和自己开发经验,保姆式的一步步带你了解优化中的细节和注意点,希望能给你带来一些收获 原理 Flutter的架构 Framew ...

  2. 干货 | 携程酒店Flutter性能优化实践

    作者简介 Qifan,携程高级工程师,专注移动端开发:Yinuo,携程高级工程师,专注移动端开发:popeye,携程软件技术专家,关注移动端跨端技术,致力于快速,高性能地支撑业务开发. 一 .前言 携 ...

  3. Flutter性能优化

    对于Flutter的性能优化,Google官方在frameWork层做了很多优化,包括渲染机制中的diff算法,因此Flutter的性能是非常强大的.那么做Flutter的性能优化,我们只需要关注wi ...

  4. Flutter性能优化实践 —— UI篇

    1.前言 flutter_deer这个项目开源也近一年了,目前收获了3100+的star,这无疑是对这个项目的最大认可.虽然从功能和UI看来和一年前的没什么区别.不过这期间我不断在优化它,希望它的性能 ...

  5. Flutter性能优化实践 —— UI篇,头条android面试节奏

    推荐使用ListView.builder来动态实现列表,而不是直接使用ListView静态创建.注意这里在使用ListView.builder的itemBuilder来构建item时,可不要预构建Wi ...

  6. 2019 下半年 Flutter 实现的性能优化 | 英雄榜

    作者 / Yuqian Li & Shams Zakhour 高性能是 Flutter 的关键特性之一.我们希望通过本文着重分享在 2019 年下半年由整个 Flutter 社群实现的性能优化 ...

  7. echarts一次渲染两个图_一次 Flutter WebView 性能优化

    本文记录了基于 WebView 的 Flutter 可视化库:echarts_flutter 的一次优化加载性能的过程. 对于任何基于 WebView 的组件,html 的加载都是关乎性能的一个重要环 ...

  8. 重度使用Flutter研发模式下的页面性能优化实践

    简介: 淘宝特价版是集团内应用Flutter技术场景比较多,且用户量一亿人以上的应用了.目前我们首页.详情.店铺.我的,看看短视频,及评价,设置等二级页面都在用Flutter技术搭建.一旦Flutte ...

  9. Flutter 小技巧之 3.7 性能优化background isolate

    Flutter 3.7 的 background isolate 绝对是一大惊喜,尽管它在 release note 里被一笔带过 ,但是某种程度上它可以说是 3.7 里最实用的存在:因为使用简单,提 ...

  10. 字节跳动Android三面视频解析:framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等

    前言 对于字节跳动的二面三面而言,Framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等问题都成高频问点!然而很多的朋友在面试时却答不上或者答不全!今天在这分享下这些 ...

最新文章

  1. iScience | 大规模表征学习寻找分子间相互作用
  2. Laravel之路——file缓存修改为redis缓存
  3. application.properties amp;amp;amp; application.yml 配置文件详解(转)
  4. dell设置从ssd启动_为什么懂电脑的人都说SSD不要分区?原来真相是这样!
  5. outlook邮箱邮件内容乱码_VBA:Outlook和Excel综合运用
  6. 怎么批量修改html文件后缀,怎么批量修改文件后缀
  7. ubuntu14.04上网问题
  8. 聊聊 vue 生命周期
  9. Python以字符形式打印双色图片中的文字
  10. android编译的错误日志,android编译遇到错误
  11. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_07-新增页面-前端-页面完善...
  12. 关于AOP(面向方面的编程)
  13. 暮光之城3蓝光BD高清下载
  14. 时序分析 29 - 时序预测 - 格兰杰因果关系(下) python实践2
  15. 下载苹果官网视频的方式
  16. 阿里云ECS服务器安装Nginx
  17. 爬取manhua.fzdm.com上的妖尾漫画
  18. 人工神经网络 经验公式_不会算工程成本?建筑测算一本通+全套自动计算表,公式可套定额...
  19. ubuntu 14.04 使用极点五笔输入法
  20. 三级网络技术应付式速成考试笔记(汇总)

热门文章

  1. java isprime函数_Java8函数式编程入门
  2. 修改oracle管理员用户密码
  3. “程序员猝死”引发的思考
  4. 论文发表费用具体是多少
  5. nvidia卸载程序失败_卸载删除NVIDIA驱动程序的方法步骤教程 - 系统家园
  6. Pycharm菜单栏消失,(File 、view消失)快速调出来的方法。(Professional Edition 2022版)
  7. Halcon算子threshold、dyn_threshold、binary_threshold、auto_threshold、fast_threshold、var_threshold
  8. 关于ARP请求报文和ARP报文的源地址和目的地址
  9. 开源看板 wekan docker-compose部署
  10. flutter大小单位:dp