Flutter开发(0)- 简介与安装

Flutter是什么?

    Flutter是一个UI SDK(Software Development Kit) p可以进行移动端(iOS、Android),Web端(Beta),桌面(technical preview),跨平台解决方案; p 移动端目前已经很多公司在用,Google、阿里、腾讯

    特别是阿里的咸鱼团队,为Flutter做了非常多的贡献;

    Flutter它是有一统大前端的野心的,并且它正在侵蚀iOS、Android这些原生开发;

Flutter的特点

    Google公司在国内做过很多宣讲,其中多次提到Flutter的几个特点:美观、快速、高效、开放。

    美观:

        使用Flutter内置美丽的Material Design和Cupertino widget(什么是widget,不着急)、丰富的motion API、平滑而自然的 滑动效果和平台感知,为您的用户带来全新体验。

    快速:

        Flutter 的 UI 渲染性能很好。在生产环境下,Flutter 将代码编译成机器码执行,并充分利用 GPU 的图形加速能力,因此使用

        Flutter 开发的移动应用即使在低配手机上也能实现每秒 60 帧的 UI 渲染速度。

        Flutter 引擎使用 C++ 编写,包括高效的 Skia 2D 渲染引擎,Dart 运行时和文本渲染库。 

    高效:

        Hot Reload (热重载) ,在前端已经不是什么新鲜的东西,但在移动端之前一直是没有的

    开放:

        Flutter 是开放的,它是一个完全开源的项目。

跨平台历史

    我们知道,任何一种技术的出现都是为了解决之前技术的痛点,其实在长久以来一直在寻找一种跨平台的解决方案 

    跨平台解决方案经历过怎样的历史了?(移动端)

平台独立开发

    完整的软件系统需要移动端:iOS端和Android端

    iOS端使用OC、Swift来进行开发,大部分iOS程序员目前这两个都需要掌握;(iOS开发工程师)

    Android端使用Java、Kotlin来进行开发,使用Java开发Android会更多一些;(Android开发工程师) 

    对于公司来说成本其实是非常高的。

    在很长一段时间内,大家都在需求一种移动端的跨平台解决方案

    希望可以通过一套代码开发出可以同时运行在iOS和Android两个系统上的应用程序

跨平台解决方案一:webview

    基于 JavaScript 和 WebView的跨平台 p最早出现的跨平台框架是基于 JavaScript 和 WebView,代表框架有PhoneGap,Apache Cordova,Ionic 等等。

    主要是通过HTML来构建自己的界面,再将其显示在各个 平台的WebView中。

    但是它默认是不能调用本地的一些服务的(比如相机、 蓝牙等),所以需要通过JavaScript进行桥接调用Native 的一些代码来完成某些功能。

    但是,它本身的体验、性能都并不理想,而且开发过程 中的坑非常多。

跨平台解决方案二:React Native

    在寻求最佳跨平台解决方案的过程中,无疑React Native 是之前最优秀的一个。

    React Native (简称RN)是Facebook于2015年4月开源的跨平台 移动应用开发框架,是Facebook早先开源的JS框架 React 在原生 移动应用平台的衍生产物,目前支持iOS和安卓两大平台。

    RN使用JavaScript语言,类似于HTML的JSX,以及CSS来开发移 动应用,因此熟悉Web前端开发的技术人员只需很少的学习就可 以进入移动应用开发领域。

    并且在保留基本渲染能力的基础上,用原生自带的 UI 组件实现核 心的渲染引擎,从而保证了良好的渲染性能。

    但是,由于RN的本质是通过JavaScript VM调用原生接口,通信 相对比较低效,而且框架本身不负责渲染,而是是间接通过原生 进行渲染的。

    所在在RN上做出非常多贡献的Airbnb之前就宣布放弃RN, 而转向Native进行开发。

跨平台解决方案三:Flutter

    从Flutter出现到现在,我个人就一直非常看好,因为它可能才是我们很久以来所期待的跨平台的终极解决方案。

    我们直接看下面这幅图来对比flutter - native - rn的区别

    Flutter利用Skia绘图引擎,直接通过CPU、GPU进行绘制,不需要依赖任何原生的控件

    Android操作系统中,我们编写的原生控件实际上也是依赖于Skia进行绘制,所以flutter在某些Android操作系统上甚至还要高 于原生(因为原生Android中的Skia必须随着操作系统进行更新,而Flutter SDK中总是保持最新的)

    而类似于RN的框架,必须通过某些桥接的方式先转成原生进行调用,之后再进行渲染。

Flutter绘制原理图 – 回头再看

直接看这幅图很难理解两个GPU的作用: 

    GPU将信号同步到 UI 线程

    UI 线程用Dart来构建图层树

    图层树在GPU 线程进行合成 p合成后的视图数据提供给Skia 引擎

    Skia 引擎通过OpenGL 或者 Vulkan将显示内容提供给GPU

图像是如何显示的?

    首先,你需要知道,我们在屏幕上可以看到的所有内容都是计算机绘制出来的图像

    无论是视频还是GIF图片,还是操作系统给我们看到的图形化界面中的画面,都是图像。

为什么看到的不是一幅幅图像?

    但是我们为什么能看到类似于动画的效果呢?

    这是因为它播放的速度非常快,研究表明:

    当图片连续播放的频率超过16帧(16张图片),人眼就会感觉非常流畅,当少于16帧时,会感觉到卡顿

    所以我们平时看到的电影,通常都是24帧或者30帧的(李安之前拍摄120帧的电影,目的就是让图片间隔更小,画面更加的流畅)

    但是理解了上面的东西之后,还是不能完全解释图片的整个显示过程,我们还需要区分两个概念:     

        帧率(fps):Frames Per Second

        刷新率:显示器的频率,比如iPhone的 60Hz、iPad Pro的 120Hz。

帧率和刷新率的关系

    CPU/GPU 向 Buffer 中生成图像,屏幕从 Buffer 中取 图像、刷新后显示。

    这是一个典型的生产者——消费者模型。

    理想的情况是帧率和刷新频率相等,每绘制一帧,屏幕显示一帧。

    但是实际往往它们的大小是不同的。

    如果没有锁来控制同步,很容易出现问题。

    例如,当帧率大于刷新频率,当屏幕还没有刷新第 n-1 帧的时候,GPU 已经在生成第 n 帧了

    从上往下开始覆盖第 n-1 帧的数据,当屏幕开始刷新第 n-1 帧的时候,Buffer 中的数据上半部分是第 n 帧数据, 而下半部分是第 n-1 帧的数据

    显示出来的图像就会出现上半部分和下半部分明显偏差 的现象,我们称之为 “tearing”(撕裂)

双重缓存(Double Buffer)


    为了解决单缓存的“tearing”问题,就出现了 双重缓存和 VSync ;

    两个缓存区分别为 Back Buffer 和 Frame Buffer。

    GPU 向 Back Buffer 中写数据,屏幕从 Frame Buffer 中读数据。

    VSync 信号负责调度从 Back Buffer 到 Frame Buffer 的复制操作

    当然底层不是通过复制,而是通过交换内存地址方式,所以可以瞬间完成,效率是非常高的;

工程流程:

    在某个时间点,一个屏幕刷新周期完成,VSync 信号产生,先完成复制操作,然后通知 CPU/GPU 绘制下一帧图像。

    复制操作完成后屏幕开始下一个刷新周期,即将刚复制到 Frame Buffer 的数据显示到屏幕上。

    在这种模型下,只有当 VSync 信号产生时,CPU/GPU 才会开始绘制。

双重缓存存在的问题


    双重缓存的缺陷在于:当 CPU/GPU 绘制一帧的时间过长(比如超过 16ms)时,会产生 Jank(画面停顿,甚至空白)。

    蓝色代表 CPU 生成 Display List;

    绿色代表 GPU 执行 Display List 中的命令从而生成帧; 

    黄色代表生成帧完成,在屏幕上显示;

双缓存模型中:

    CPU生成蓝色B的数据,由GPU进行B的绘制,但是这个过长由于过长,那么第二个A就产生了Jank。

    B在屏幕上显示之后,发出Vsync信号,A开始绘制,但是由于绘制时间过长,第二个B位置又产生了Jank

三重缓存(Triple Buffer) - 了解

如何解决双重缓存的问题了?

    在第二个A展示,Vsync信号发出后,直接绘制C Buffer

    在第一个B展示,Vsync信号发出后,绘制A Buffer

    因为C已经在缓存中,可以直接从缓存中取出C Buff来进行展示,依次类推

    其实本质是在每次Vsync信号发出后,多缓存一个Buffer作为备用 

    现在你可以回头再看Flutter绘制原理图了

这也是flutter区别于React Native的本质区别:

    React Native 之类的框架,只是通过 JavaScript 虚拟机扩展调用系统组件,由 Android 和 iOS 系统进行组件的渲染; 

    Flutter 是自己完成了组件渲染的闭环

渲染引擎skia


    Skia就是 Flutter向 GPU提供数据的途径。

    Skia(全称Skia Graphics Library(SGL))是一个由C++编写的开源图形库

    能在低端设备如手机上呈现高质量的2D图形,最初由Skia公司开发,后被 Google收购

    应用于Android、Google Chrome、Chrome OS等等当中。

    目前,Skia 已然是 Android 官方的图像渲染引擎了,因此 Flutter AndroidSDK 无需内嵌 Skia 引擎就可以获得天然的 Skia 支持;

    而对于 iOS 平台来说,由于 Skia 是跨平台的,因此它作为 Flutter iOS 渲染引 擎被嵌入到 Flutter 的 iOS SDK 中,替代了 iOS 闭源的 Core Graphics/Core Animation/Core Text,这也正是 Flutter iOS SDK 打包的 App 包体积比 Android 要大一些的原因。

    底层渲染能力统一了,上层开发接口和功能体验也就随即统一了,开发者再也不 用操心平台相关的渲染特性了。也就是说,Skia 保证了同一套代码调用在 Android 和 iOS 平台上的渲染效果是完全一致的。

大前端生存技术

    很多人看到Google的flutter框架的时候,第一反应就是:别出新东西了,实在学不动了。

    客户端开发者:从Android到iOS,或者从iOS到Android,到RN,甚至现在越来越多的客户端开发者接触前端相关知识(Vue、React、Angular、小程序)

    前端开发者:从jQuery到AngularJS,到三大框架并行:Vue、React、Angular,还有小程序,甚至现在也要接触客户端开发 (比如RN、Flutter),包括TypeScript、Webpack、uniapp、Nodejs。

    大前端开发就是,不像服务器一样可能几年甚至几十年还是那一套的东西,新技术会层出不穷。

    但是每一样技术的出现都会让惊喜,因为他必然是解决了之前技术的某一个痛点的,所以我们要学会拥抱这种变化。

    并且很多知识在学习的过程中,你会发现他们都是相同的,并不是说都要从头再来,最重要的是建立属于自己的知识体系。

环境搭建整个流程


操作系统选择

    操作系统的选择?

    学习阶段: Windows或者macOS(苹果操作系统)都是可以的

    开发阶段: 一般需要使用macOS,因为我们需要针对iOS进行调试,通常方便起见还是选择macOS p疑问: 如果以后做Flutter开发没有macOS怎么办? p这个可以完全放心,使用Flutter开发的公司必然会给你配备macOS的(黑苹果或者Mac Mini)

    Flutter可以在Windows上学习,也可以在macOS上,因为我之后的课程要进行Android和iOS的调试,所以我当前使用的环境 是macOS的。

    这里我再次强调,学习阶段使用Windows是没有任何问题,我之前也在Windows上写过很多Flutter的东西!

    在安装的过程中,我也会说到很多Windows安装的注意事项,大家按照步骤一步步完成即可。

安装Flutter SDK

    Flutter SDK下载地址:

    https://flutter.dev/docs/development/tools/sdk/releases p 选择自己的操作系统和最新稳定的版本(Stable版本)

环境变量配置:

    MacOS环境变量配置

        export FLUTTER_HOME=/Applications/flutter

        export PATH=$PATH:$FLUTTER_HOME/bin

        export PATH=$PATH:$FLUTTER_HOME/bin/cache/dart-sdk/bin

    Window环境变量配置

        Windows环境变量修改:点击计算机图标 - 属性 - 高级系统设置 - 高级 - 环境变量 

        找到Path,在其中添加Flutter SDK目录下bin目录以及Dart的目录

配置镜像

    flutter项目会依赖一些东西,在国内下载这些依赖会有一些慢,所以我们可以将它们的安装源换成国内的(也就是设置国内的镜 像)

macOS或者Linux操作系统,依然是编辑~/.bash_profile文件 

        export PUB_HOSTED_URL=https://pub.flutter-io.cn

        export FLUTTER_STORAGE_BASE_URL= https://storage.flutter-io.cn

Windows用户还是需要修改环境变量

    Windows环境变量修改:点击计算机图标 - 属性 - 高级系统设置 - 高级 - 环境变量 

        新建 变量 PUB_HOSTED_URL,其值为https://pub.flutter-io.cn

        新建 变量 FLUTTER_STORAGE_BASE_URL, 其值为https://storage.flutter-io.cn

配置iOS环境

    如果想为Flutter配置iOS开发环境,需要在我们的电脑上安装一个Xcode(此部分Windows电脑忽略) p Xcode是苹果公司的iOS和macOS的IDE,进行过iOS开发的童鞋应该都非常熟悉

如何安装Xcode呢?

    第一种方式:直接在App Store上搜索Xcode,找到安装即可

    第二种方式:安装自己想要的Xcode的版本,需要手动去下载 p https://developer.apple.com/download/more

 选择自己的iOS模拟器

配置Android环境

    如果想为Flutter配置Android开发环境,需要在我们的电脑上安装一个Android Studio pAndroid Studio是基于IntelliJ IDEA的、Google 官方的 Android 应用集成开发环境 (IDE)。

    Android Studio的下载

        官网地址:https://developer.android.com/studio/?utm_source=android-studio

    Android的环境配置

        打开Android Studio,会问我们是否要设置代理,这是因为下载Android SDK等在国内不好下载 

        创建Android模拟器

开发工具选择

    官方推荐两个工具来开发Flutter:Android Studio 和 VSCode

 VSCode的优缺点

    VSCode是最近非常非常流行的开发工具,并且非常好用!VSCode最近已经有取代WebStorm作为前端首选开发工具的趋势了

VSCode的优点:

    VSCode其实并不能称之为是一个IDE,它只是一个编辑器而已。

    所以它非常的轻量级,不会占用你非常大的内存消耗,而且启动速度等都非常快,对于电脑配置不是特别高的同学,肯定是一个非常好的 选择。

    并且你可以在VSCode上安装各种各样的插件来满足自己的开发需求。

VSCode的缺点:

    很多Android Studio包括的方便操作没有,比如点击启动、热更新点击等; p 而且在某些情况下会出现一些问题;

    比如之前我在使用的过程中,有时候热更新不及时常常看不到效果,必须重启; 

    比如某些情况下,没有代码提示不够灵敏;

Android Studio

    对于进行过Android开发或者使用过Webstorm、IDEA、PHPStorm等的同学,使用Android Studio肯定是没有任何问题的 n Android Studio的优点:

    集成开发环境(IDE)不用多说,你需要的功能基本都有

    而且上面说的VSCode存在的问题,在Android Studio中基本不会出现

Android Studio的缺点:

    一个字:重

    无论是IDE本身,还是使用Android Studio启动项目,都会相对慢一些

    占据的计算机资源也很多,所以电脑配置较低是会出现卡顿

使用须知:

    使用Android Studio开发Flutter我们需要安装两个插件:Flutter和Dart

    课堂的选择:

    Dart学习过程中使用VSCode pFlutter学习使用Android Studio

创建Flutter项目

    有两种方式创建Flutter应用:通过终端,通过编辑器。

    这里我先选择通过终端(Windows和macOS都是一样的命令)

          flutter create helloflutter

    将代码运行到模拟器中: flutter run –d 模拟器id

    多个模拟器可以通过id选择运行到哪里一个模拟器上

你可能感兴趣的:(Flutter开发(0)- 简介与安装)