详解flutter刷新流程,让你的应用更流畅

这篇具有很好参考价值的文章主要介绍了详解flutter刷新流程,让你的应用更流畅。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文已授权公众号【缦图技术团队】发布

详解flutter刷新流程,让你的应用更流畅

一、概述

Flutter 是谷歌推出的高性能、跨端UI框架,可以通过一套代码,支持 iOSAndroidWindows/MAC/Linux 等多个平台,且能达到原生性能。Flutter 也可以与平台原生代码进行混合开发,其更新迭代速度很快,技术发展也日趋成熟,如今已经有很多公司在使用这种新跨端技术。我们知道在 flutter 中可以使用 setState() 来刷新 StatefulWidget 的 UI,这会遍历调用子 Widget 的 build() 重构视图。当一个页面内容比较复杂时,会包含多个 widget,如果直接调用根组件的 setState(),会遍历所有子 Widget 的 build(),刷新整个页面,这样会造成很多不必要的开销,刷新的成本相对较大。如果数据很多接口响应又慢的话,还会有界面闪烁的现象。那么 flutter 到底是如何实现界面刷新的,调用 setState({})后 flutter framework 到底做了哪些操作?接下来我们一起来揭开 flutter 刷新界面的神秘面纱。

二、Flutter 渲染中的三棵树

在了解flutter的刷新机制之前,先来看看flutter渲染过程中的三棵树。在Flutter的渲染过程中由WidgetElementRenderObject这个三个元素组成三棵树。Widget控件树,Element 元素树,RenderObject 渲染树。Widget内部调用 createElement()会创建对应的 ElementElement内部调用 createRenderObject()会创建对应的 RenderObject,所以我们只需要关心 Widget 就可以快速的构建视图界面了。为什么使用三棵树而不是 Widget RenderObject 两棵树呢?这里是为了复用 Element 提升渲染性能,因为 Widget 面向业务它的改变会很频繁,如果根据 Widget 直接生成 RenderObject 会导致渲染性能下降。

flutter 刷新页面,flutter开发,flutter,刷新
flutter 三棵树依赖关系

RenderObject 渲染树在上屏前会生成一棵 Layer 树去进行屏幕渲染。

三、刷新流程分析

在开始流程分析之前,先上个图来梳理下整个刷新流程,脑海里对整体先有个初步认识,这样再跟着下面的源码一步步往里深入分析,思路会更加清晰一些:

flutter 刷新页面,flutter开发,flutter,刷新
setState() 刷新流程

对整体的刷新流程有了大概的认识之后,我们对照着上面这个图的流程来看看调用setState({})之后,系统具体都做了哪些操作:

注:

setState() 源码位于 flutetr_sdk/packages/flutter/lib/src/widgets/framework.dart 文件中

本文源码基于 Flutter 3.3.8 Dart 2.18.4 • DevTools 2.15.0

  @protected
  void setState(VoidCallback fn) {
    assert(fn != null);
    assert(() {
      if (_debugLifecycleState == _StateLifecycle.defunct) {
        throw FlutterError.fromParts(<DiagnosticsNode>[
    			// 省略不重要代码
        ]);
      }
      if (_debugLifecycleState == _StateLifecycle.created && !mounted) {
        throw FlutterError.fromParts(<DiagnosticsNode>[
    			// 省略不重要代码
        ]);
      }
      return true;
    }());
    final Object? result = fn() as dynamic;
    ...
    // 省略不重要代码
    _element!.markNeedsBuild();
  }

setState() 中传入的回调函数是立刻同步执行的,不能是异步的。该方法前面主要是 assert 部分的一些校验逻辑,不允许传入的回调函数为null且不能为异步函数,这里有一个点需要注意:在 widget 构造函数中以及 dispose 调用之后,不允许再调用 setState() 方法去刷新界面,可以在调用前考虑使用 mounted 标志来检测该 widget 是否还挂载在 文章来源地址https://www.toymoban.com/news/detail-551233.html

到了这里,关于详解flutter刷新流程,让你的应用更流畅的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 让你的微信小程序对用户更加友好:上拉加载和下拉刷新就是关键

    上拉加载和下拉刷新是小程序开发的常见需求。本文将介绍如何在微信小程序中实现上拉加载和下拉刷新的功能,为用户带来更加流畅、便捷的使用体验。 实现效果如下: 1. 首先需要在使用到的 json 文件下配置 \\\"enablePullDownRefresh\\\": true 2. 在 js 文件中加上触底函数跟上拉函数

    2024年02月11日
    浏览(41)
  • 分享 7 个有用的 Flutter 库,让你的开发生活更轻松

    让你的 Flutter 开发更高效 为什么要编写自定义功能,当你可以使用库呢?库是开发者最好的朋友和救命稻草。在我看来,一个好的项目应该充分利用一些最好的可用库。 本文是有关 Flutter 中很棒的库系列文章的一部分,我总结了7个 Flutter 库,这些库将有助于您在开发过程中

    2024年02月17日
    浏览(42)
  • Flutter应用发布流程详解:从开发到上架一站式指南

    Flutter是一款由Google推出的跨平台移动应用开发框架,其强大的性能和流畅的用户体验使其备受开发者青睐。然而,开发一款应用只是第一步,将其成功上架到苹果商店才是实现商业目标的关键一步。本文将详细介绍如何使用Flutter将应用程序上架到苹果商店,让您的应用更快

    2024年04月09日
    浏览(88)
  • Flutter页面刷新失败?看看是不是这个原因

    我用flutter开发了一个页面,页面上有一些自己写的控件A,A控件里有一个button,我点击这个A控件里的button的时候,直接在onPressed里调用setState发现页面并没有刷新。 要实现控件A所在页面的整体刷新要怎么实现呢? 在Flutter中,要实现点击控件A中的按钮后刷新整个页面,你可

    2024年02月05日
    浏览(45)
  • 用上Parallel让你的.NET应用效率飙升

    简介 .NET Framework 和 .NET Core 提供了强大的并行编程支持,其中一个核心工具就是Parallel类。Parallel类是.NET Framework4.0推出的新特性。Parallel类使得在多核系统上执行并行操作变得更加简单和高效。通过并行编程,可以充分利用现代计算机系统的硬件资源,提高应用程序的性能。

    2024年02月05日
    浏览(48)
  • JUnit 使用详解,让你的项目健壮起来

    JUnit 是 Java 中最为流行的测试框架之一,用于对单元测试进行自动化测试。本文将全面介绍 JUnit 的相关概念和使用方式,并提供多种类型的代码示例。 1.1 JUnit 概述 JUnit 是一个基于 Java 语言的测试框架,最初是由 Kent Beck 和 Erich Gamma 开发的。JUnit 提供了一系列的 API ,可以帮

    2024年02月07日
    浏览(31)
  • C语言柔性数组详解:让你的程序更灵活

    仔细观察下面的代码,有没有看出哪里不对劲? 还有另外一种写法: 你应该一眼就看到了,结构体的最后一个成员数组的写法是 int arr[]; 或者是 int arr[0] ,这两种写法是等价的,意思是这个数组的大小是 不确定的、未知的、可以变化的 。 C99允许这种特殊的结构体存在。这

    2024年02月09日
    浏览(41)
  • 轻松搞定Spring集成缓存,让你的应用程序飞起来!

    主页传送门:📀 传送   Spring 提供了对缓存的支持,允许你将数据存储在缓存中以提高应用程序的性能。Spring 缓存抽象基于 Java Caching API,但提供了更简单的编程模型和更高级的功能。   Spring 集成缓存提供了一种方便的方式来使用缓存,从而提高应用程序的性能。Spr

    2024年02月07日
    浏览(61)
  • 6种打包Python代码的方法,让你的程序变成exe应用

    Python是一种高级编程语言,它具有易学易用、跨平台等优点,因此在开发中得到了广泛的应用。 然而,Python代码需要在Python解释器中运行,这对于一些用户来说可能不太方便。 因此,将Python代码打包成可执行文件(exe)是一种很好的解决方案。 本文将介绍6种将Python代码打包

    2024年01月18日
    浏览(48)
  • 6种打包Python代码的方法,让你的程序变成exe应用!

    Python是一种高级编程语言,它具有易学易用、跨平台等优点,因此在开发中得到了广泛的应用。 然而,Python代码需要在Python解释器中运行,这对于一些用户来说可能不太方便。 因此,将Python代码打包成可执行文件(exe)是一种很好的解决方案。 本文将介绍6种将Python代码打包

    2024年02月16日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包