Skip to main content

如何实现的

  • 树形结构:界面是一个树形结构,每个 Widget 都是一个不可变的配置对象,它们可以包含子级 Widget

    • 查找算法复杂度 nlogn
  • 更新过程:当子级 Widget 更新时,Flutter 会从该子级 Widget 开始递归地重新构建该子树,并且会比较新旧子树之间的差异(Diff 算法),以决定哪些部分需要重新布局和绘制,这个过程确实是一个异步过程

  • 脏更新:如果需要立即更新 Widget,可以调用 setState() 方法触发更新,这将立即标记 Widget 为 “脏”,并在下一个帧开始之前异步地进行重建和更新

  • 底层方法:Widget 构建递归的底层是 RenderObjectWidget,都有一个 RenderObject 类,用于实现渲染逻辑

触发屏幕刷新

在每秒钟内,Flutter 渲染引擎能够将屏幕刷新120次,即120帧/秒 为了提高性能和节省电量,Flutter 默认帧率为60帧/秒

  • Flutter 默认会与硬件垂直同步信号进行同步
  • 手动调用 setState() 方法
  • 使用 AnimationController、Animation 或 Tween 等动画库的 API 来创建动画并触发屏幕刷新

组成结构

  • Framework 框架层(Dart)
    • 在 Flutter 中一切UI皆 Widget
  • Engine 引擎层(C++)
    • 2D 渲染引擎:Skia(Chrome 和 Android均采用 Skia )
    • GPU 加速
    • 音频
    • IO 操作
  • Plattform 平台层
    • 负责与不同的操作系统进行交互,并提供特定的 shell

四颗树

  • Widget 树
  • Element 树:中间代理
  • Render 树:布局和渲染
  • Layer 树

项目结构

flutter_app ├── android │   ├── .gradle │   ├── app │   ├── gradle │   └── tsettings.gradle ├── build ├── ios ├── lib │   ├── util:通用方法 │   ├── route:路由 │   ├── components:组件 │   ├── pages:页面 │   └── main.dart:入口文件 ├── test ├── web └── pubspec.yaml:配置文件

全局状态管理包

  • Provider
  • Redux