你有用过Flutter吗? Flutter架构是怎么样?为什么会比其他如ReactNative好?

Flutter移动开发系列教程! 原生开发与跨平台技术 原生开发 原生应用程序是指某一个移动平台(比如iOS或安卓)所特有的应用,使用相应平台支持的开发工具和语言,并直接调用系统提供的SDK API。比如Android原生应用就是指使用Java或Kotlin语言直接调用Android SDK开发的应用程序;而iOS原生应用就是指通过Objective-C或Swift语言直接调用iOS SDK开发的应用程序。原生开发有以下主要优... 阅读详情

面试官: 你有用过Flutter吗? Flutter架构是怎么样,为什么会比其他如ReactNative好
心理分析: 面试官所在的项目是用Flutter 开发的,或者正在转Flutter这种技术。如果你不会,面试官在第一眼会认为后面来应聘的人或许会、为了杜绝这种情况发生,你一定要说以前研究过,写过相关代码。其实”有用过Flutter“对大多数求职只是 会与不会 的问题。这不是面试官 想了解的。面试官的重点 你了解的有多深。
接下来,会问你他的原理 你是怎么看。 它的优缺点。为什么比其他的好。从原理层来解析。这才是最难的。
这篇文章 从原理层说明他们的区别
求职者: 应该做好被虐的准备。如果看了这篇文章,应付下来基本没有多大的问题
在Flutter诞生之前,已经有许多跨平台UI框架的方案,比如基于WebView的Cordova、AppCan等,还有使用HTML+JavaScript渲染成原生控件的React Native、Weex等。

1.0 框架架构

反观Flutter

首先看一下Flutter的架构图

1.1 Flutter三层架构

Framework
Engine
Embedder

1.Framework使用dart实现,包括Material Design风格的Widget,Cupertino(针对iOS)风格的Widgets,文本/图片/按钮等基础Widgets,渲染,动画,手势等。此部分的核心代码是:flutter仓库下的flutter package,以及sky_engine仓库下的io,async,ui(dart:ui库提供了Flutter框架和引擎之间的接口)等package。

2.Engine使用C++实现,主要包括:Skia,Dart和Text。Skia是开源的二维图形库,提供了适用于多种软硬件平台的通用API

3.Embedder是一个嵌入层,即把Flutter嵌入到各个平台上去,这里做的主要工作包括渲染Surface设置,线程设置,以及插件等。从这里可以看出,Flutter的平台相关层很低,平台(如iOS)只是提供一个画布,剩余的所有渲染相关的逻辑都在Flutter内部,这就使得它具有了很好的跨端一致性。

从架构图可以看出,从头到尾重写一套跨平台的UI框架,包括UI控件、渲染逻辑甚至开发语言。渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图形绘制相关的接口,可以在最大程度上保证不同平台、不同设备的体验一致性,逻辑处理使用支持AOT的Dart语言,执行效率也比JavaScript高得多

1.2 、万物皆widget

目前上主流的思想,都希望将各个ui控件接耦,慢慢演变出组件化的思想。

Flutter控件主要分为两大类,

  • StatelessWidget
  • StatefulWidget,

StatelessWidget用来展示静态的文本或者图片,如果控件需要根据外部数据或者用户操作来改变的话,就需要使用StatefulWidget

State的概念也是来源于Facebook的流行Web框架React,React风格的框架中使用控件树和各自的状态来构建界面,当某个控件的状态发生变化时由框架负责对比前后状态差异并且采取最小代价来更新渲染结果。

1.3 绘图基本原理

从下图这里可以看出 Flutter和 React-Native之众的本质区别:React-Native之类只是扩展调用 OEM组件,而 Flutter是自己渲染。

在 Flutter Architecture的解释中,Google还提供了一张更为详尽的图来解释 Flutter的原理:

image

​ 这张图解释得更清晰一些:Flutter只关心向 GPU提供视图数据,GPU的 VSync信号同步到 UI线程,UI线程使用 Dart来构建抽象的视图结构,这份数据结构在 GPU线程进行图层合成,视图数据提供给 Skia引擎渲染为 GPU数据,这些数据通过 OpenGL或者 Vulkan提供给 GPU。

​ 所以 Flutter并不关心显示器、视频控制器以及 GPU具体工作,它只关心 GPU发出的 VSync信号,尽可能快地在两个 VSync信号之间计算并合成视图数据,并且把数据提供给 GPU。

1.4 Flutter面试会出现的几个问题

了解 Flutter的基本概念后,自然有几个疑问亟待解决。

1.4.1 为什么使用 Dart?能说说其中的原因吗

  • Dart 的性能更好。Dart在 JIT模式下,速度与 JavaScript基本持平。但是 Dart支持 AOT,当以 AOT模式运行时,JavaScript便远远追不上了。速度的提升对高帧率下的视图数据计算很有帮助。
  • Native Binding。在 Android上,v8的 Native Binding可以很好地实现,但是 iOS上的 JavaScriptCore不可以,所以如果使用 JavaScript,Flutter 基础框架的代码模式就很难统一了。而 Dart的 Native Binding可以很好地通过 Dart Lib实现。
  • Fuchsia OS,看起来不像原因的一个原因。Fuchsia OS内置的应用浏览器就是使用 Dart语言作为 App的开发语言。而且实际上,Flutter是 Fuchisa OS的应用框架概念上的一个子集。(Flutter源代码和编译工具链也充斥了大量的 Fuchsia宏)
  • Dart是类型安全的语言,拥有完善的包管理和诸多特性。Google召集了如此多个编程语言界的设计专家开发出这样一门语言,旨在取代 JavaScript,所以 Fuchsia OS内置了 Dart。Dart可以作为 embedded lib嵌入应用,而不用只能随着系统升级才能获得更新,这也是优势之一。

1.4.2 Skia是什么? 为什么Flutter会引入Skia

前面提到了 Flutter只关心如何构建视图抽象结构,向 GPU提供视图数据。Skia就是 Flutter向 GPU提供数据的途径。

  • Skia是一个 2D的绘图引擎库,其前身是一个向量绘图软件,Chrome和 Android均采用 Skia作为绘图引擎。Skia提供了非常友好的 API,并且在图形转换、文字渲染、位图渲染方面都提供了友好、高效的表现。Skia是跨平台的,所以可以被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS闭源的 Core Graphics / Core Animation。
  • Android自带了 Skia,所以 Flutter Android SDK要比 iOS SDK小很多。

1.4.3 Flutter的架构是怎么样的,你是怎么理解FLutter的架构

我们可能只知道 Flutter做了什么,始终都还没有从侧面观察 Flutter的整个架构设计,了解 Flutter如何去做。

这张图了解过 Flutter的人可能很多地方都看过,这边来详细解释一下:

Flutter Framework: 这是一个纯 Dart实现的 SDK,类似于 React在 JavaScript中的作用。它实现了一套基础库, 用于处理动画、绘图和手势。并且基于绘图封装了一套 UI组件库,然后根据 Material 和Cupertino两种视觉风格区分开来。这个纯 Dart实现的 SDK被封装为了一个叫作 dart:ui的 Dart库。我们在使用 Flutter写 App的时候,直接导入这个库即可使用组件等功能。

Flutter Engine: 这是一个纯 C++实现的 SDK,其中囊括了 Skia引擎、Dart运行时、文字排版引擎等。不过说白了,它就是 Dart的一个运行时,它可以以 JIT、JIT Snapshot 或者 AOT的模式运行 Dart代码。在代码调用 dart:ui库时,提供 dart:ui库中 Native Binding 实现。 不过别忘了,这个运行时还控制着 VSync信号的传递、GPU数据的填充等,并且还负责把客户端的事件传递到运行时中的代码。

在了解屏幕绘图的基本原理和 Flutter的一个整体概念后,我们下面详细地来看一下 Flutter的大概实现。

要理解 Flutter的原理,我们从 entry point开始看 Flutter的代码。由于应用框架大同小异,所以下文提及 Flutter的代码即指代 Flutter Engine的代码,而非 Flutter Dart Framework代码。

下图是我简单整理了一下 Flutter应用启动后的执行顺序

  • 在应用的 View Controller 初始化后,会实例化一个 Flutter project的抽象(以下简称 project)。project会初始化一个 platform view的抽象实例,这个抽象实例会负责创建 Flutter 的运行时(以下简称 engine)。

  • 当 View Controller将要显示时,调用 project查找和组合 Flutter的应用资源 bundle,并且把资源提供给 engine。

  • engine在真正需要执行资源 bundle时才会创建 Dart执行的环境(懒加载,以下简称 Dart Controller),然后设置视图窗口的一些属性等东西(这是绘图引擎必需的)。

  • 然后 engine中的 Dart Controller会加载 Dart代码并执行,执行的过程中会调用 dart:ui的 native binding实现向 GPU提供数据。

1.4.4 Flutter SDK体积为什么非常大?这个你知道吗

  • Flutter应用的体积由两部分组成:应用代码和 SDK代码。应用代码是 Dart编译后的代码,如果做成可动态下发,那么这部分可以不计。
  • SDK代码比较大就有点无奈了,SDK的组成部分有 Dart VM,Dart标准库,libwebp、libpng、libboringssl等第三方库,libskia,Dart UI库,然后再加上 icu_data,可能在单 arch下(iOS),SDK体积达到 40+MB。其中仅仅 Dart VM(不包含标准库)就达到了 7MB。
  • Flutter SDK是 dynamic framework,如此大的二进制体积可能会造成动态链接耗时长。而如果静态链接,可能原来比较大的 App很有可能造成 TEXT段超标。

1.4.5 Flutter可以跑多个实例吗?(连环炮)

可以的。

  • Dart毫无疑问是一门优秀的编程语言,我也曾尝试将 Dart独立出来作为一个通用的 SDK。
  • Dart SDK托管在 chromium项目中,并且提供了 cross building的选项。原版即提供了 Android Build脚本。但在 iOS上原版行不通,猜测主要是标准库的问题。
  • 在 Flutter iOS项目中,Dart 标准库提供了一份完全不同的实现。而且,想要把 Dart VM和标准库从 Flutter剥离出来,太困难了。并且单个 arch下,Dart VM加标准库的体积是 > 10MB的。

小编整理了一些关于面试类的文章,含有从基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之相关的视频+学习笔记

话不多请看下图↓↓↓ (把所有的知识+每日一题整理了)

进扣裙回复【333】获取完整资料

 

 

Flutter VS ReactNative Flutter 简介 目前 Hybrid App 主要分为两类: (1) 通过 WebView 加载本地网页,App 相当于本地网站。如 PhoneGap、Cordova、IOnic。 (2) 原生控件的跨平台抽象,如 ReactNative、Weex。 Flutter 走了不一样的路:自己开发了一套原生控件,每个平台实现一遍,然后把渲染引擎(这套控件)打包在每个应用里面,因此性能没有问题,平... 阅读详情

相关推荐

X光安检模型训练第一步:手把手教你处理OPIXray和HIXray这两个小众数据集

本文详细解析了X光安检AI模型训练的关键步骤,重点介绍如何处理OPIXray和HIXray这两个专业数据集。从数据格式转换到YOLO标准,再到数据增强和质量验证,手把手指导开发者高效利用这些数据集进行目标检测模型训练,提升安检场景下的危险物品识别准确率。

weixin_32629853的博客 295

2023年Flutter发展的怎么样了?还有学的必要吗?

随着移动应用市场的不断扩大,跨平台开发框架的需求也越来越大。Flutter框架可以帮助开发者在不同平台上快速开发高质量的移动应用程序,这种趋势将进一步推动Flutter的发展和普及。作为一名Android开发工程师,学习Flutter框架是非常有必要的。因为现在的前端开发已经不仅仅局限于网页开发,而是需要涉及到多个平台的应用开发。如果掌握了Flutter框架的开发技能,就可以更好地满足前端开发的多样化需求。从19年过去的几年时间,Flutter在Google带领各大厂商的引领下,飞速发展。

嘴巴吃糖了 1610

rv1126平台spi屏调试

st7789v2 i2c调试

zuoanyouzhuan_的博客 2007

如何评价Flutter

Flutter在我们团队的六年实践中,不仅证实了其作为跨平台开发框架的巨大潜力,更是在性能、一致性、开发效率和测试支持等方面超出了我们的最初预期。当然,我们也意识到持续关注其发展,适时调整策略以应对潜在挑战的重要性。Flutter的旅程还在继续,我们对其未来充满信心。

developer_laoliu的博客 1602

Flutter一路飙升,为何受欢迎?

Flutter的人气飙升是有充分理由的。Flutter为开发人员提供了广泛的优势,可以加快开发速度,并带来更加用户友好的移动应用程序。Flutter很容易上手,无论你是否有丰富的开发经验。经常使用其他语言(如Java,Python,C#或其他面向对象语言)的开发人员将毫无问题地将Flutter和Dart添加到他们的库中,因为Dart在结构和语法上都与这些语言相似。此外,对于那些开发经验较少的人来说,Flutter的扩展小部件库使得构建应用程序变得容易,而无需编写大量代码;

star_nwe的博客 539

Flutter 学习路线图

Flutter 学习路线图 如果你真的觉得很难,坚持不了了,那就放弃,既然放弃了就不要抱怨没有得到。 选择你热爱的,坚持你选择的,不抱怨放弃的。 前言 Flutter越来越火,学习Flutter的人越来越多,对于刚接触Flutter的人来说最重要的是如何学习Flutter,重点学习Flutter的哪些内容。下面是Flutter的学习路线图,学会这些你就入门了,当然这仅仅是初学者的学习路线图,...

老孟Flutter 8196

面试官:你有用过Flutter? Flutter架构是怎么样,为什么会比其他如ReactNative

面试官:你有用过Flutter? Flutter架构是怎么样,为什么会比其他如ReactNative好心理分析:面试官所在的项目是用Flutter 开发的,或者正在转Flutter这种技术。如果你不会,面试官在第一眼会认为后面来应聘的人或许会、为了杜绝这种情况发生,你一定要说以前研究过,写过相关代码。其实”有用过Flutter“对大多数求职只是 会与不会 的问题。这不是面试官 想了解的。面试官的重点 你了解的有多深。 接下来,会问你他的原理 你是怎么看。 它的优缺点。为什么比其他的好。从原理层来解析...

嘴巴吃糖了 2866

面试官:你有用过FlutterFlutter架构是怎么样,为什么会比其他如ReactNative好_flutter面试

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。贵在坚持!网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84544714的博客 1262

面试官:你有用过FlutterFlutter架构是怎么样,为什么会比其他如ReactNative好_flutter面试(1)

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

2401_84544714的博客 1148

阿里面试:用过Flutter吗--Flutter架构是怎么样?为什么会比其他如ReactNative

(一)调整好心态心态是一个人能否成功的关键,如果不调整好自己的心态,是很难静下心来学习的,尤其是现在这么浮躁的社会,大部分的程序员的现状就是三点一线,感觉很累,一些大龄的程序员更多的会感到焦虑,而且随着年龄的增长,这种焦虑感会越来越强烈,那么唯一的解决办法就是调整好自己的心态,要做到自信、年轻、勤奋。这样的调整,一方面对自己学习有帮助,另一方面让自己应对面试更从容,更顺利。(二)时间挤一挤,制定好计划一旦下定决心要提升自己,那么再忙的情况下也要每天挤一挤时间,切记不可“两天打渔三天晒网”。

2401_84102979的博客 1011

RN和Flutter对比

RN和Flutter对比 Flutter是谷歌的移动端UI框架,可以快速在IOS和Android上面构建高质量的原生用户界面,免费开源的,是可以用于常见高性能、快平台的移动应用的框架。 1.性能方面: Flutter是基于Drt语言,所有避免了RN的那种通过桥接器与js通讯导致效率低下的问题,所有在性能方面,Flutter要比RN更高一些,会更接近原生体验 2.学习方面: Flutter是基于Da...

weixin_46401812的博客 2411

RN是什么

React Native(反应 本地) 简称RN,是Facebook在2015年的F8大会上宣布的。刚开始仅支持ios,现在,主流的iOS和Android支持度已经很好了。主要是提供了一种多平台同时运行的语言环境。RN的口号是:Learn Once,Write AnyWhere。学起来炒鸡简单。但是各个平台的适配等工作,就得慢慢自己折腾!这个也和移动端设备的多样有关,不同设备从硬件到软件的环境都可能不同。比如Android有返回等物理按键,但是iPhone就没有这样的按钮。等等类似的这种情况都使得我们不得不

老高的专栏 1万+

Flutter、Weex、RN,Native对比

Flutter、Weex、RN,Native对比 最火移动端跨平台方案盘点:React Native、weex、Flutter

云梦九章~ 1万+

聊一聊Flutter

Dart 是由 Google 开发的一种编程语言,最初于 2011 年发布,最主要的用途是为 Flutter 框架提供支持。Dart 作为一门现代化语言,既可以用于客户端(如移动端和桌面端)的应用开发,也适用于服务端和 Web 开发。它设计简洁、易于上手,并支持多种编程风格,满足开发者在不同场景下的需求。Dart 是一门多功能的编程语言,特别适合跨平台开发,尤其是在 Flutter 框架中发挥了重要作用。它的高效编译机制、异步编程支持和面向对象特性,使得它在现代应用开发中备受欢迎。Flutter

Junes inh 的技术专栏 2219

Flutter是否是跨平台移动开发最好的框架?是否值得学习?

Flutter是否是跨平台移动开发最好的框架?是否值得学习?

Misdirection_XG的博客 3005

React Native、Weex和Flutter比较,选择哪个跨平台框架?

综合来看,React Native、Weex和Flutter都具有自身的优点和缺点。React Native具有很好的系统适配性和开发效率,Weex可以实现完美的Pixel Perfect设计,Flutter则具有优秀的性能和高效的开发方式。选择适合自己的跨平台框架需要结合自己的需求和项目特点进行综合考虑。但不管你选择哪一种框架,都需要注意它们的生态系统,这将直接关系到开发者之间的交流和知识传递。希望在本文的帮助下,你能够更好地选择合适的框架来开发您的跨平台应用程序。

kobekd8的博客 1829

flutter 简介 flutter 能为我们做什么

陆陆续续已经写了60多篇的flutter 的文章了,本篇文章就来说说我对flutter 的简单看法Flutter是一种由谷歌开发的开源用户界面(UI)工具包,用于在多个平台上构建高性能、美观和流畅的移动应用程序。它使用Dart编程语言,并提供丰富的UI组件和工具,可以快速构建现代化的应用程序界面。总的来说,Flutter具有跨平台、响应式UI、热重载、自绘引擎、丰富的UI组件、开发效率、强大的社区支持和优秀的性能等特点和优势,使开发人员能够更轻松、高效地构建漂亮、流畅和高性能的应用程序。

半身风雪 1万+

国内用Flutter开发多吗?

截至目前,全球已经发布了近50万个使用Flutter的应用,其中包括来自字节跳动等大公司的应用,以及来自30个谷歌团队的应用。在国内找个主流的应用商店,把其中排名靠前的100个非游戏类App找出来。大约能有50个左右的App是使用了Flutter开发的。

嘴巴吃糖了 4655

Flutter 、Vue、React Native 、Weex哪个好

跨平台项目GSYGithubApp系列三大开源版本比较(Flutter 、React Native 、Weex) vue react angularjs这三个是同一类型,是js框架,框架的目的是简化开发,但是这几个框架都是针对传统网页开发,直接用在移动端一个是慢,另一个是有些功能不适配。weex和react native是基于vue和react改造的移动端混合开发框架,把网页包装成app,可以通过...

欢迎加入Android老司机学院 482266514(技术交流群)密码CSDN 8197

HCIP-AI-EI Developer V2.5 培训文档及实验手册.zip

HCIP-AI-EI Developer V2.5 培训文档HCIP-AI-EI Developer V2.5 实验手册

上一篇: Android 调用相机拍照,适配到Android 10?
下一篇: 字节跳动选择Flutter的现状与工程实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值