当前位置: 首页 > ai >正文

认识 Flutter

一、Flutter是什么?

Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.

Flutter 是 Google 的 UI 工具包,用于从单个代码库构建漂亮的、本地编译的移动、web 和桌面应用程序。

Flutter 的几个特点:美观、快速、高效、开放。

  • 美观:使用 Flutter 内置美丽的 Material Design 和 Cupertino widget、丰富的 motion API、平滑而自然的滑动效果和平台感知,为用户带来全新体验。
  • 快速:(1)Flutter 的 UI 渲染性能很好。在生产环境下,Flutter 将代码编译成机器码执行,并充分利用 GPU 的图形加速能力,因此使用 Flutter 开发的移动应用即使在低配手机上也能实现每秒60帧的UI渲染速度;(2)Flutter引擎使用C++编写,包括高效的Skia2D渲染引擎,Dart运行时和文本渲染库。
  • 高效:HotReload(热重载);开发一套代码多端可以使用。
  • 开放:Flutter是开放的,它是一个完全开源的项目。

二、跨平台历史

任何一种技术的出现是为了解决之前技术的痛点。

跨平台解决方案一:webview

基于 JavaScript 和 WebView 的跨平台

  • 最早出现的跨平台框架是基于 JavaScript 和 WebView ,代表框架有 PhoneGap,ApacheCordova,Ionic 等等。
  • 主要是通过 HTML 来构建自己的界面,再将其显示在各个平台的 WebView 中。
  • 但是它默认是不能调用本地的一些服务的(比如相机、蓝牙等),所以需要通过 JavaScript 进行桥接调用 Native 的一些代码来完成某些功能。
  • 但是,它本身的体验、性能都并不理想,而且开发过程中的坑非常多。

跨平台解决方案二:React Native

备受欢迎的 ReactNative
在寻求最佳跨平台解决方案的过程中,无疑 ReactNative 是之前最优秀的一个。

  • ReactNative(简称RN)是 Facebook 于2015年4月开源的跨平台移动应用开发框架,是Facebook 早先开源的 JS 框架 React 在原生移动应用平台的衍生产物,目前支持iOS和安卓两大平台;
  • RN使用 JavaScript 语言,类似于 HTML 的 JSX,以及 CSS 来开发移动应用,因此熟悉 Web前端开发的技术人员只需很少的学习就可以进入移动应用开发领域。
  • 并且在保留基本宣染能力的基础上,用原生自带的UI组件实现核心的渲染引擎,从而保证了良好的渲染性能。
  • 但是,由于 RN 的本质是通过 JavaScriptVM 调用原生接口,通信相对比较低效,而且框架本身不负责宣染,而是是间接通过原生进行渲染的。

跨平台解决方案三:Flutter

从下面的图中可以对比出 flutter - native - rn 的区别。

  • Flutter 利用 Skia 绘图引擎,直接通过 CPU、GPU 进行绘制,不需要依赖任何原生的控件
  • Android 操作系统中,我们编写的原生控件实际上也是依赖于 Skia 进行绘制,所以 flutter 在某些 Android 操作系统上甚至还要高于原生(因为原生 Android 中的 Skia 必须随着操作系统进行更新,而 FlutterSDK 中总是保持最新的)
  • 而类似于 RN 的框架,必须通过某些桥接的方式先转成原生进行调用,之后再进行渲染。

  • 在 iOS 上,Flutter 同样不依赖原生控件进行渲染,而是使用自带的引擎(主要基于 Metal)直接绘制。 这带来了与 Android 上相同的好处:渲染一致性、不受系统版本制约、以及避免了桥接带来的性能损失。虽然苹果的原生渲染极其优秀,但 Flutter 通过这种方案实现了高度的跨平台一致性并具备了媲美原生的性能潜力。

在 iOS 上,Flutter 的渲染机制和性能优势逻辑与 Android 类似,甚至更显著。

  1. 绘图引擎

    • 在 iOS 上,Flutter 不再使用 Skia(默认情况下)。为了更好地与苹果生态系统集成并追求极致的性能,Flutter 使用了苹果自家的 Metal 作为底层图形 API(对于支持 Metal 的设备,基本上是 iPhone 5s 及以后的所有机型)。

    • Flutter 的引擎会将 UI 指令直接编译为 Metal 的命令,由 GPU 执行。对于旧设备,Flutter 会回退到 OpenGL ES。

    • 所以,准确的说法是:Flutter 在 iOS 上使用 Metal/OpenGL 进行绘制,同样不依赖原生控件。

  2. 与 iOS 原生的对比

    • 原生 iOS 应用:使用 UIKit 框架(如 UIButtonUILabelUITableView)。这些原生控件的绘制最终是由 Core Animation 和 Core Graphics 来完成的,它们底层也是调用 Metal/OpenGL,但这是一个非常优化和紧密集成的过程。

    • Flutter 应用:如前所述,用自己的渲染流水线,直接调用 Metal。

  3. 性能对比

    • 理论上:由于 Flutter 是直接调用 Metal,它避免了 UIKit 的抽象层,理论上可以做到和原生一样快,甚至在某些极端复杂的自定义 UI 绘制场景下更快,因为它避免了原生控件组合可能带来的一些开销。

    • 实际上:苹果对 UIKit 和 Core Animation 的优化已经到了登峰造极的地步,经过十多年的打磨,其性能在日常使用中极其流畅和稳定。Flutter 要达到与之媲美甚至超越,需要付出巨大的工程努力。

    • 更重要的优势:和 Android 的情况一样,Flutter 的渲染引擎是打包在 App 里的。这意味着:

      • 一致性:你的 App 在 iOS 12 和 iOS 16 上的外观、表现和性能是完全一致的。你不需要担心旧系统上的渲染 bug 或性能差异。

      • 不受系统限制:你可以立即使用 Flutter 引擎带来的最新图形特性,而无需等待用户升级到最新的 iOS 系统。

http://www.xdnf.cn/news/20051.html

相关文章:

  • 告别 OpenAI SDK:如何使用 Python requests 库调用大模型 API(例如百度的ernie-4.5-turbo)
  • 【Qt开发】按钮类控件(三)-> QCheckBox
  • 【完整源码+数据集+部署教程】手袋类型检测系统源码和数据集:改进yolo11-AFPN-P345
  • 前端开发,同源策略
  • 【Linux】Linux进程状态和僵尸进程:一篇看懂“进程在忙啥”
  • 基于OpenGL封装摄像机类:视图矩阵与透视矩阵的实现
  • 如何下载B站视频,去水印,翻译字幕
  • .Net程序员就业现状以及学习路线图(四)
  • 创建线程有哪几种方式
  • 【数字孪生核心技术】数字孪生有哪些核心技术?
  • Kubernetes(四):Service
  • HyperWorks许可服务器设置
  • 企业微信AI怎么用?食品集团靠它砍掉50%低效操作,答案就是选对企业微信服务商
  • ZeroMQ 编译 项目使用流程文档
  • Android 生命周期函数调用原理
  • 《计算机网络安全》实验报告一 现代网络安全挑战 拒绝服务与分布式拒绝服务攻击的演变与防御策略(3)
  • 2025年数学建模国赛参考论文发布
  • 从碎片化到一体化:Java分布式缓存的“三级跳”实战
  • Spring Security 深度学习(六): RESTful API 安全与 JWT
  • 服务器IP暴露被攻击了怎么办?
  • 微算法科技 (NASDAQ:MLGO)利用量子密钥分发QKD技术,增强区块链系统的抗攻击能力
  • 自动化运维-ansible中对roles的创建与使用
  • 数据无言,网关有声 耐达讯自动化RS485转Profinet让千年液位数据“开口说话”
  • 在VSCode中更新或安装最新版的npx和uv工具
  • 数码视讯TR100-OTT-G1_国科GK6323_安卓9_广东联通原机修改-TTL烧录包-可救砖
  • 容器的定义及工作原理
  • 【华为Mate XTs 非凡大师】麒麟芯片回归:Mate XTs搭载麒麟9020,鸿蒙5.1体验新境界
  • Java 21 虚拟线程微服务进阶实战:2 个企业级场景源码 + 底层调度原理 + 性能调优指南
  • 艾克斯图片转换器,不只图片压缩
  • 音响皇帝BO,牵手全球第一AR眼镜雷鸟,耳机党坐不住了?