工作需要,因客户端有部分页面要使用flutter编写,需要QA了解一下flutter相关知识,因此,做了flutter调研,包含安装,基础知识与demo编写,第二部分是安装与环境配置。

——

Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能

想要更全面的了解Flutter,首先我们需要了解什么是跨平台框架

一、跨平台技术以及其他的跨平台框架

原生应用程序:指某一个移动平台(比如iOS或安卓)所特有的应用,使用相应平台支持的开发工具和语言,并直接调用系统提供的SDK API。

优点可访问平台全部功能,如GPS、摄像头;性能高,可实现复杂动画,用户体验好。

缺点动态化更新难度大,需要升级发版更新(或者hotfix);由于双平台,开发测试成本大。

针对原生开发这两个缺点,诞生了一些跨平台的动态化框架

目前主要有三类

  • H5+原生(混合开发框架:Cordova、Ionic、微信小程序)
  • JavaScript开发+原生渲染 (React Native、Weex、快应用)
  • 自绘UI+原生(QT for mobile、Flutter)

1、H5+原生

也被称为hybrid开发,这类在各大app很常见,我们app当然也有使用

主要原理:将APP内的部分内容通过H5来实现,通过原生的网页加载控件WebView 来加载,由h5实现动态更新

H5代码是运行在WebView中,而WebView实质上就是一个浏览器内核,像位于一个权限受限的沙箱中,所以对于大多数系统能力没有访问权限,

混合框架一般都会在原生代码中预先实现一些访问系统能力的API, 然后暴露给WebView以供JavaScript调用。

缺点是性能不好,复杂用户界面或者动画实现上会困难

2、JavaScript开发+原生渲染

React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,RN使用Javascript语言
RN和React原理相通,并且Flutter也是受React启发,思想相通

React Native是原生控件渲染,所以性能会比混合应用中H5好很多,但是受限于js是脚本语言,执行效率有待提高,而且渲染依赖于原生控件,也依赖于系统更新,会受原生UI系统限制

3、自绘UI+原生

Flutter属于这种类型的跨平台框架,通过在不同平台实现一个统一接口的渲染引擎来绘制UI,而不依赖系统原生控件,所以可以做到不同平台UI的一致性。

自绘引擎解决的是UI的跨平台问题,如果涉及其它系统能力调用,依然要涉及原生开发

(我们测试时,可以注意下假如要调取原生的权限应用时的场景)

优点是性能高,灵活易维护;缺点是无法进行动态化更新,还是要升级更新

综上:

H5+原生WebView渲染一般支持Cordova、Ionic
JavaScript+原生渲染原生控件渲染支持RN、Weex
自绘UI+原生调用系统API渲染Flutter高, QT低默认不支持QT、Flutter

二、Flutter

总结上一节,Flutter的优点是

  • 一套代码双平台运行,节约成本
  • 热重载功能提高开发效率(后续会通过demo具体展示热重载)
  • 采用自带的引擎进行渲染绘制,性能高

Flutter调研(1)-Flutter基础知识-LMLPHP

Flutter框架图

(核心只有一层轻量的C/C++代码。Flutter在Dart中实现了其它大部分系统(组合、手势、动画、框架、widget等), 开发人员可以轻松地进行读取、更改、替换或移除)

Flutter的一些基础知识

1、Flutter使用的开发语言:Dart

Dart是面向对象的语言,有垃圾回收机制,借鉴了Java和JavaScript,静态语法方面和Java非常相似,如类型定义、函数声明、泛型等,而在动态特性方面又和JavaScript很像,如函数式特性、异步支持等。

(具体在Dart语言里展开细说)

2、热重载(demo演示)

  • 运行后更改代码,不要按“停止”按钮;,让应用继续运行;

  • 调用 Save (cmd-s / ctrl-s),或者点击 热重载按钮 (带有闪电⚡️图标的按钮),此时查看设备已经即时更改为新代码

3、一切都是widget

在Android和iOS上,部件所对应的就是各种View类。
Flutter采用了不同的概念,部件不仅仅是结构化的元素。Flutter的部件架构更多地使用了组合,而不是继承,所以部件架构更加强大和灵活。Flutter官方文档写道:
在Flutter里,行为也是部件(如GestureDetector)。InheritedWidget可用于进行状态管理,AnimatedWidget可用于构建动画。

三、Dart单线程模型

在Java中,如果程序发生异常且没有被捕获,那么程序将会终止,但是这在Dart或JavaScript中则不会;

Java是多线程模型的编程语言,任意一个线程触发异常且该异常未被捕获时,就会导致整个进程退出。但Dart和JavaScript不会,它们都是单线程模型。

在Dart中,所有的外部事件任务都在事件队列中,如IO、计时器、点击、以及绘制事件等,而微任务通常来源于Dart内部,并且微任务非常少,之所以如此,是因为微任务队列优先级高,如果微任务太多,执行时间总和就越久,事件队列任务的延迟也就越久,对于GUI应用来说最直观的表现就是比较卡,所以必须得保证微任务队列不会太长。值得注意的是,我们可以通过Future.microtask(…)方法向微任务队列插入一个任务。

在事件循环中,当某个任务发生异常并没有被捕获时,程序并不会退出,而直接导致的结果是当前任务的后续代码就不会被执行了,也就是说一个任务中的异常是不会影响其它任务执行的。

四、State的生命周期

Flutter调研(1)-Flutter基础知识-LMLPHP

State初始化时会依次执行 : 构造函数 > initState > didChangeDependencies > Widget build , 此时页面加载完成

05-16 08:55