深入解析Flutter架构

Flutter:架构概览 Flutter本质上是一个跨平台的UI工具集,允许在各自操作系统上复用同样的代码。尽可能提供原生体验的高性能和复用代码。开发中,Flutter应用在一个VM上运行,使得可在保留状态且无需重新编译情况下,进行热加载。发行时,Flutter应用会直接通过AOT编译为机器码或者是JS。 阅读详情

想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。

本文旨在对Flutter的架构进行高层次的概述,包括构成其设计的核心原则和概念。

Flutter是一个跨平台的UI工具包,它的设计目的是允许跨iOS和Android等操作系统的代码重用,同时也允许应用程序直接与底层平台服务对接。其目标是让开发者能够交付在不同平台上感觉自然的高性能应用,在尽可能多的代码共享的同时,拥抱存在差异的地方。

在开发过程中,Flutter应用运行在一个虚拟机中,该虚拟机提供有状态的变化热重载,而不需要完全重新编译。发布时,Flutter应用直接编译成机器代码,无论是Intel x64,还是ARM指令,如果针对Web,则编译成JavaScript。该框架是开源的,采用允许的BSD许可证,并拥有一个繁荣的第三方包生态系统,补充核心库功能。

本概述分为若干部分。

  • layer model:建Flutter的部分。
  • Reactive user interfaces:lutter用户界面开发的核心概念。
  • widgets:lutter用户界面的基本构件。
  • rendering process:lutter如何将UI代码转化为像素。
  • platform embedders:移动和桌面操作系统执行Flutter应用程序的代码。
  • Integrating Flutter with other code:于Flutter应用程序可用的不同技术的信息。
  • Support for the web:于Flutter在浏览器环境下的特性的总结。

Achitectural layers

Flutter被设计成一个可扩展的、分层的系统。它作为一系列独立的库存在,每个库都依赖于底层。任何一层都没有特权访问下面的一层,框架层的每一部分都被设计成可选择和可替换的。

对底层操作系统而言,Flutter应用程序与其他本地应用程序一样,以相同的方式进行打包。一个平台特定的嵌入器提供了一个入口点;与底层操作系统协调,以访问服务,如渲染表面、可访问性和输入;并管理消息事件循环。嵌入器是用适合平台的语言编写的:目前Android的Java和C++,iOS和macOS的Objective-C/Objective-C++,Windows和Linux的C++。使用嵌入器,Flutter代码可以作为一个模块集成到现有的应用程序中,也可以是应用程序的全部内容。Flutter包含了许多针对常见目标平台的嵌入器,但也存在其他嵌入器。

Flutter的核心是Flutter引擎,它主要用C++编写,支持所有Flutter应用所需的基元。每当需要绘制新的帧时,该引擎负责对合成场景进行光栅化。它提供了Flutter核心API的低层实现,包括图形(通过Skia)、文本布局、文件和网络I/O、可访问性支持、插件架构以及Dart运行时和编译工具链。

该引擎通过dart:ui暴露给Flutter框架,它将底层的C++代码封装在Dart类中。这个库暴露了最底层的基元,例如用于驱动输入、图形和文本渲染子系统的类。

通常情况下,开发人员通过Flutter框架与Flutter进行交互,Flutter框架提供了一个用Dart语言编写的现代、反应式框架。它包括一套丰富的平台、布局和基础库,由一系列的层组成。从底层到顶层,我们有:

  • 基础类和构件服务,如动画,绘画和手势,在底层基础上提供了常用的抽象。
  • 渲染层提供了一个处理布局的抽象。通过这一层,你可以建立一个可渲染对象的树。你可以动态地操作这些对象,树会自动更新布局以反映你的变化。
  • widgets层是一个组成抽象。渲染层中的每个渲染对象在widgets层中都有一个对应的类。此外,widgets层还允许你定义可以重用的类的组合。这是引入反应式编程模型的一层。
  • Material和Cupertino库提供了全面的控件集,这些控件使用widget层的组合基元来实现Material或iOS设计语言。

Flutter框架相对较小;许多开发者可能会用到的更高级别的功能都是以包的形式实现的,包括像摄像头和webview这样的平台插件,以及像字符、http和动画这样的平台无关的功能,这些都是建立在核心Dart和Flutter库的基础上的。其中一些包来自更广泛的生态系统,涵盖应用内支付、苹果认证和动画等服务。

这篇综述的其余部分从UI开发的反应式范式开始,大致浏览了各个层次。然后,我们描述了如何将widget组合在一起,并将其转换为可作为应用程序的一部分进行渲染的对象。我们描述了Flutter如何在平台层面与其他代码进行交互,然后简要总结了Flutter的Web支持与其他目标的不同之处。

Reactive user interfaces

从表面上看,Flutter是一个被动的、伪声明式的UI框架,开发者提供一个从应用状态到界面状态的映射,当应用状态发生变化时,框架在运行时承担更新界面的任务。这种模式的灵感来自于Facebook为自己的React框架所做的工作,其中包括对很多传统设计原则的重新思考。

在大多数传统的UI框架中,用户界面的初始状态被描述一次,然后由用户代码在运行时响应事件单独更新。这种方法的一个挑战是,随着应用程序的复杂性增加,开发人员需要意识到状态变化如何在整个UI中级联。例如,考虑以下UI。

image

有很多地方可以改变状态:颜色框、色调滑块、单选按钮。当用户与用户界面交互时,变化必须反映在其他每个地方。更糟糕的是,除非小心翼翼,否则对用户界面的一个部分的微小改变可能会对看似不相关的代码产生涟漪效应。

一种解决方案是像MVC这样的方法,通过控制器将数据变化推送到模型,然后模型通过控制器将新的状态推送到视图。然而,这也是有问题的,因为创建和更新UI元素是两个独立的步骤,很容易不同步。

Flutter与其他反应式框架一样,采用了另一种方法来解决这个问题,通过明确地将用户界面与其底层状态解耦。使用React风格的API,你只需要创建UI描述,而框架则负责使用这一个配置来创建和/或适当更新用户界面。

在Flutter中,widget(类似于React中的组件)由不可变的类来表示,这些类用于配置对象树。这些widgets用于管理单独的对象树进行布局,然后用于管理单独的对象树进行合成。Flutter的核心是一系列机制,用于有效地行走树的修改部分,将对象树转换为低级对象树,并在这些树上传播变化。

一个widget通过覆盖build()方法来声明其用户界面,build()方法是一个将状态转换为UI的函数。

UI = f(state)
从架构设计思想出发看Flutter 您可以根据自己的需求,将 BLoC 模式应用于其他数据模型,例如订单信息或用户配置,以实现应用程序的高可维护性和可重用性。在这个例子中,我们创建了一个 `ProductsList` 组件,该组件接收一个 `ProductsBloc` 对象作为参数,并使用 `StreamBuilder` 在应用程序的展示部分中响应数据流的变化。BLoC 模式是 Flutter 架构中的一种方式,旨在将用户界面与代码逻辑进行分离,以实现应用程序逻辑的重用并提高代码的可维护性。首先,您需要定义应用程序中使用的数据模型。 阅读详情

相关推荐

flutter架构解析

微任务用于处理优先级较高、需要尽快执行的任务,而事件队列用于处理响应事件、网络请求等异步任务。在 Dart 中,事件循环会不断地从微任务队列和事件队列中取出任务执行,这就是 Dart 异步编程的核心机制。

qq_25218777的博客 1265

深入解析美团外卖Flutter-架构演进之路(上篇)(1)

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84122760的博客 1185

Flutter大型项目架构:分层设计篇

上篇文章讲的是状态管理,提到了,相比与原生的setState()及Provider等有哪些优缺点,并结合实际项目写了一个简单的使用,接下来本篇文章来讲Flutter大型项目是如何进行分层设计的。

mzxj7255的博客 2525

Flutter PopupMenuButton 深度解析:从入门到架构级实战

通过本文的全方位解析,我们不仅掌握了PopupMenuButton的基础用法,更深入到了性能优化、架构设计、底层原理等专业领域。在Flutter 3.0的更新中,菜单组件新增了等实验性功能,预示着未来将支持更复杂的动态效果。优先考虑无障碍访问需求建立统一的菜单设计规范持续关注Flutter Menu插件生态探索与机器学习结合的智能菜单推荐当交互设计遇上Flutter的渲染能力,PopupMenuButton已不再是简单的UI控件,而是通往卓越用户体验的设计思维载体。

QQ_778132974的博客 1267

Flutter插件式架构深度解析与实战应用

插件架构中的另一个重要设计原则是关注点分离Dart 层应专注于 API 的定义、错误处理和业务组合,而原生层则负责与操作系统交互并返回原始数据。两者之间通过明确定义的契约(contract)进行通信——这个契约就是所承载的消息协议。为了实现真正的模块化,建议采用如下分层结构:lib/├── device_info.dart # 公共接口暴露├── platform_interface.dart # 抽象类定义标准方法。

weixin_42610010的博客 865

3A之自动对焦(AF)算法:从Tenegrad到拉普拉斯的清晰度评价实战

本文深入解析自动对焦(AF)算法的核心——清晰度评价函数,通过实战对比Tenegrad、方差、能量梯度、Brenner和拉普拉斯五大经典算法的原理、代码实现与性能。文章详细阐述了各函数在计算速度、抗噪性和单峰性上的优劣,并提供了从仿真测试到硬件部署的优化策略,帮助开发者根据实际场景选择最合适的AF算法。

weixin_29281915的博客 312

基于STM32与SimpleFOC实现直流无刷电机开环控制的实战指南

本文提供了一份基于STM32微控制器与SimpleFOC开源库实现直流无刷电机开环控制的详细实战指南。内容涵盖硬件连接、PlatformIO环境搭建、核心代码解析及上电测试,旨在帮助开发者快速验证硬件并理解开环控制的基本原理,为后续实现高性能的闭环FOC控制奠定基础。

xxx12的博客 959

YOLOv11涨点改进 | Neck改进篇 | YOLOv11引入 BiFPN双向特征金字塔网络,显著提升了多尺度特征融合效率

本文介绍了基于BiFPN特征融合模块优化的YOLOv11目标检测模型。BiFPN通过双向跨尺度连接和加权特征融合机制,显著提升了多尺度特征融合效率。该方法在COCO数据集上实现了55.1AP的检测精度,同时大幅降低计算成本(减少13-42倍FLOPs)。文章详细解析了BiFPN模块结构、核心代码实现方法,并提供了YOLOv11-BiFPN配置文件的修改指导,为计算机视觉领域提供了一种高效的目标检测解决方案。

Ai缝合怪、助力小伙伴高效发论文 711

华为OD机试 - 末世分配资源包 - 二分查找 + 贪心(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。末世时代,政府为各地方配资源,现有资源分配表 nums[n],要求按如下规则分配给 k 个营地:在最优平均分配情况下,得到最大团队所获得的资源数4,3,6,9,7 216最佳划分之一:[4,3,6] -> 13 [9,7] -> 16最大

学Java,找哪吒 223

​网格划分理论:CFD理论67 网格划分-三大理论问题_哔哩哔哩_bilibili传统解释非结构化网格是不对的——计算传热学大叔专题讨论2--CFD网格类型_哔哩哔哩_bilibili

传统解释非结构化网格是不对的——计算传热学大叔。fluent计算理论和离散方法原理视频推荐。

qq_15963745的博客 182

VTK-9.5.0 1D2D3DWidget实现灰度图+深度图+3D点云显示(可轻松集成到自己的项目)

VTK1D2D3DWidget是一个基于Qt和VTK开发的3D点云可视化工具,支持RGB和深度点云数据的显示与处理。主要功能包括点云加载、可视化、保存为PLY格式文件,以及背景颜色、点间隔、坐标轴显示等参数的自定义设置。该工具采用模块化设计,核心组件包括主窗口管理类、VTK渲染组件和自定义鼠标交互样式,依赖Qt5+和VTK9.5.0库实现跨平台支持。项目提供完整的源码和构建指南,适用于点云数据的快速展示与分析。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 385

matlab 质心重合法实现点云配准【2026最新版】

质心重合法是将源点云和目标点云的质心重合,以此缩小两点云集之间的平移误差,从而为下一步粗配准提供更好的初始位置姿态。

点云侠的博客 509

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 字节跳动Android一面凉凉,竟以为一面是HR面...
下一篇: 后端转 Android 我该从何处下手,现在学习 Android 晚吗?
Python_林一
博客等级 码龄7年 877粉丝 510原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值