flutter_01_认识flutter

flutter

认识flutter

  • flutter是一个UI SDK(Software Development Kit)
  • 可以进行移动端(ios,Android),web端(Beta),桌面,跨平台(technical preview)解决方案
  • 移动端目前已经很多公司在用了,Google,阿里,腾讯
  • 特别是阿里的咸鱼团队,为flutter做了非常多的贡献
  • flutter它是有一统大一统大前端的野心的,并且它正在侵蚀ios,Android这些原生开发

flutter的特点

  • Google公司在国内做过很多宣讲,其中多次提到flutter的几个特点:美观,快速,高效,开放
  • 美观:使用Flutter内置美丽的Material Design和Cupertion widget( 什么是widge,不着急t),丰富的motion API,平滑而自然的滑动效果和平台感知,为您的用户体验带来全新体验
  • 快速:Flutter的UI渲染性能很好,在生成环境下,Flutter将代码编译程机器码执行,并充分利用GPU的图形加速能力,因为使用Flutter开发的移动应用即使在低配手机上也能实现每秒60帧UI渲染速度,Flutter引擎使用c++编写,包括高效的Skia 2D渲染引擎,Dart运行时和文本渲染库
  • 高效:Hot Reload(热重载),在前端已经不是什么新鲜的东西,但在移动端之前一直是没有的
  • 开放:Flutter是开放的,是一个完全开源的项目

跨平台历史

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

平台独立开发

最初

  • 完整的软件系统需要移动端
  • IOS端和Android和IOS端需要使用Java,Kotlin来进行开发,使用java开发Android会更多一些;(Android开发工程师)
  • 对于公司来说成本其实是非常高的

解决方案一:webview

  • 基于javascript会webview是跨平台解决方案,代表框架有PhoneGap,Apache,Cordova,lonic等等,自主要是通过HTLM来构建自己的页面,再将其显示在各个平台的webview中;
  • 但是它默认是不能调用本地的一些服务的(比如相机,蓝牙等),所有需要通过javascript进行桥接调用Native的一些代码来完成某些功能;但是它本身的体验,性能并不理想,而且在开发过程中的坑是非常多的
    出现了;

解决方案二:React Native

  • 在寻求最佳跨平台解决方案的时候,无疑是React Native是之前最优秀的一个,React Native(简称RN)是Fackbook于2015年4月开源的跨平台移动应用开发框架,是FaceBook早先开源的JS框架React在原生移动应有平台的衍生产物,目前支持ios和安卓两大平台
  • RN使用javascript语言,类似于HTML的JSX,以及CSS来开发移动应用,因此熟悉web前端开发的技术人员只需要很少的学习就可以进入移动应用开发领域
  • 并且在保留基本渲染能力的基础上,用原生自带的ui组件来实现核心的渲染引擎,从而保证了良好的渲染性能
  • 但是,由于RN的本质是通过javascript VM调用原生接口,通信是相对毕竟低效,而且框架本身不负责渲染,而是间接通过原生进行渲染

    在这里插入图片描述

跨平台的终极解决方案三:Flutter

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

    在这里插入图片描述

Flutter绘制原理图
  • GPU将信号同步到 UI 线程
  • UI 线程用Dart来构建图层树
  • 图层树在GPU 线程进行合成
  • 合成后的视图数据提供给Skia 引擎
  • Skia 引擎通过OpenGL 或者 Vulkan将显示内容提供给GPU

    在这里插入图片描述

图像显示
  • 首先,你需要知道,我们在屏幕上可以看见的所有内容都是计算机绘制出来的图像,包括GIF图片,还是操作系统给我们看见的图形化界面中的画面,都是图像
  • 但是为什么我们看见的不是一幅幅图像,这是因为它播放的速度非常快,研究表明;当图片的播放频率超过16帧时,人眼就会感觉很流畅,低于16帧时,会感觉到卡顿
  • 图片间隔越小,帧数越大,我们给会感觉越流程
  • 还要区分两个概念:
  • 1.帧率(fps):Framles Per Second
  • 刷新率:显示器的频率,比如ipone的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;
    p 绿色代表 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绘制原理图了

    在这里插入图片描述

渲染引擎skia
  • Skia就是 Flutter向 GPU提供数据的途径。
  • Skia(全称Skia Graphics Library(SGL))是一个由C++编写的开源图形库
  • 能在低端设备如手机上呈现高质量的2D图形,最初由Skia公司开发,后被Google收购
  • 应用于Android、Google Chrome、Chrome OS等等当中。
  • 目前,Skia 已然是 Android 官方的图像渲染引擎了,因此 Flutter Android SDK 无需内嵌 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。
  • 大前端开发就是,不像服务器一样可能几年甚至几十年还是那一套的东西,新技术会层出不穷。
  • 但是每一样技术的出现都会让惊喜,因为他必然是解决了之前技术的某一个痛点的,所以我们要学会拥抱这种变化。
  • 并且很多知识在学习的过程中,你会发现他们都是相同的,并不是说都要从头再来,最重要的是建立属于自己的知识体系。

flutter环境搭建

在这里插入图片描述

操作系统选择

  • 学习阶段: Windows或者macOS(苹果操作系统)都是可以的
  • 开发阶段: 一般需要使用macOS,因为我们需要针对iOS进行调试,通常方便起见还是选择macOS

安装Flutter SDK

  • Flutter SDK下载地址: https://flutter.dev/docs/development/tools/sdk/releases 选择自己的操作系统和最新稳定的版本(Stable版本)

原文地址:https://blog.csdn.net/qq_43808599/article/details/109572374

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


简介 java中使用jar包来封装有用的功能,然后将其分发到maven仓库中,供其他人使用。同样的在dart中也有类似的概念叫做packages。packages就是可以用来共享的软件包,可以包含libraries和tools。 你可以在pub.dev网站中查到dart中所有的共享packages的
简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可以非常方便的编译成运行在原始android,ios,web等移动平台上的移动应用。 flutter是使用dart来编写的,最新的flutter版本是2.5.3,而最新的Dart语言
简介 dart作为一种面向对象的语言,class是必不可少的。dart中所有的class,除了Null都继承自Object class。 要想使用dart中的类就要构造类的实例,在dart中,一个类的构造函数有两种方式,一起来看看吧。 传统的构造函数 和JAVA一样,dart中可以使用和class名
简介 Exception是程序中的异常情况,在JAVA中exception有checked Exception和unchecked Exception。那么在dart中的情况是不是一样的呢?一起来看看吧。 Exception和Error Dart中表示异常的类有两个,分别是Exception和Err
简介 虽然dart中的类只能有一个父类,也就是单继承的,但是dart提供了mixin语法来绕过这样限制。 今天,和大家一起来探讨一下dart类中的继承。 使用extends 和JAVA一样,dart中可以定义一个父类,然后使用extends来继承他,得到一个子类,如下所示: class Studen
简介 pubspec.yaml是所有dart项目的灵魂,它包含了所有dart项目的依赖信息和其他元信息,所以pubspec.yaml就是dart项目的meta! pubspec.yaml支持的字段 根据dart的定义,pubspec.yaml中可以包含下面的字段: 字段名 是否必须字段 描述 nam
dart系列之:dart语言中的特殊操作符 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还有自定义的非常特殊的操作符,今天带大家一起来探索一下dart中的特殊操作符。 普通操作符 普通操作符就很好解释了,就是加减乘除,逻辑运算符,比较运算符和位运算符等。 这些操作符和其他语言的
简介 在dart系统中,有pubspec.yaml文件的应用就可以被成为一个package。而Libray package是一类特殊的package,这种包可以被其他的项目所依赖. 也就是通常所说的库。 如果你也想你写的dart程序可以上传到pub.dev上,或者提供给别人使用,则来看看这篇文章吧。
简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌握了这些内置类型才能够在使用dart语言的时候得心应手。 今天就给大家讲解一下dart语言的内置类型。 Null 在dart中用null来表示空。那么null和Nul
简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分。dart中的函数和java中的函数有什么区别呢? dart作为一种面向对象的编程语言,它的函数也是一个对象,用Function来表示。先看下函数的定义: abstract class Function { ex
简介 熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念。什么是泛型呢?泛型就是一种通用的类型格式,一般用在集合中,用来指定该集合中应该存储的对象格式。 有了泛型可以简化我们的编程,并且可以减少错误的产生,非常的方便。 dart语言中也有泛型。一起来看看吧。 为什么要用泛型 使用泛型的主要目
简介 熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方便的进行异步编程,从而摆脱了回调地狱。dart作为一种新生的语言,没有理由不继承这种优秀的品质。很自然的,dart中也有await和async语言,一起来看看吧。 为什么要用异步编程 那么为什么要用异步
简介 要想熟悉一种语言,最简单的做法就是熟悉dart提供的各种核心库。dart为我们提供了包括dart:core,dart:async,dart:math,dart:convert,dart:html和dart:io这几种常用的库。 今天给大家介绍一下dart:core中的数字和字符串的使用。 数字
简介 ES6中在引入异步编程的同时,也引入了Generators,通过yield关键词来生成对应的数据。同样的dart也有yield关键词和生成器的概念。 什么时候生成器呢?所谓生成器就是一个能够持续产生某些数据的装置,也叫做generator。 两种返回类型的generator 根据是同步生成还是
简介 Flutter的基础是widget,根据是否需要跟用户进行交互,widget则可以分为StatelessWidget和StatefulWidget。StatelessWidget只能根据传入的状态进行简单的初始化widget,如果要实现跟用户交互这种复杂的功能,则需要用到StatefulWid
简介 时间和日期是我们经常会在程序中使用到的对象。但是对时间和日期的处理因为有不同时区的原因,所以一直以来都不是很好用。就像在java中,为时间和日期修改和新增了多次API,那么作为新生的语言dart而言,会有什么不一样的地方吗? dart中关于日期和时间的两个非常重要的类是DateTime和Dur
简介 Library是dart用来组织代码的一种非常有用的方式,通过定义不同的Library,可以将非常有用的dart代码进行封装,从而提供给其他的项目使用。虽然我们可以自由使用import或者export来对library进行导入和导入。但是什么样的用法才是最合适的用法呢? 一起来看看吧。 使用p
简介 dart中的集合有三个,分别是list,set和map。dart在dart:core包中提供了对于这三种集合非常有用的方法,一起来看看吧。 List的使用 首先是list的创建,可以创建空的list或者带值的list: var emptyList =[]; var nameList = [&#
简介 dart:html包为dart提供了构建浏览器客户端的一些必须的组件,之前我们提到了HTML和DOM的操作,除了这些之外,我们在浏览器端另一个常用的操作就是使用XMLHttpRequest去做异步HTTP资源的请求,也就是AJAX请求。 dart同样提供了类似JS中XMLHttpRequest
简介 Flutter是google开发的一个跨平台的UI构建工具,flutter目前最新的版本是3.0.5。使用flutter你可以使用一套代码搭建android,IOS,web和desktop等不同平台的应用。做到一次编写到处运行的目的。 说到一次编写处处运行,大家可能会想到java。那么flut