入坑 Flutter 前你需要知道的一些 XXX

扳指一算,这已经是 Flutter 出道的第三个年头了。这两年来,用它写过几个类似计算器、手电筒、罗盘之类小到不能再小的应用,也算是对其有一点点拙见,本文纯属爽完后的瞎掰,不涉及过多的代码,只对准备入坑或者想要入坑的童鞋简单地聊一聊 Flutter,包括它的基础架构、设计原理、应用场景以及未来发展等等。

What is Flutter?

Flutter 是什么?套用目前 Flutter 官网的原话来讲就是:

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

这句话有几个关键点:“UI toolkit”、“natively compiled” 和 “single codebase”。

首先,Google 将 Flutter 定义为 UIToolkit,即偏向于 UI 的工具;其次,Flutter 可以提供近似于原生的效果,最最最重要的是可以将一份代码用作于 mobile、web 以及 desktop”,这几乎是所有前端开发者梦寐以求的功能。想象一下,你只需编写一份代码就可以将其运行于移动端、网页以及桌面端,这相当于直接打通目前流行的几大前端:Web、Android、IOS、Linux、MacOS、Windows,想想都炒鸡美好!截止本文发布为止,Flutter 已经更新至 1.7,其在移动端的两大平台 Android 和 IOS 上的表现非常好,目前 Web 端也处于测试阶段,相信很快就可以发布,而桌面端相信在不远的将来也很快就可以看到。

官方给出的 Flutter 整体架构图如下:

入坑 Flutter 前你需要知道的一些 XXX_第1张图片

主要将其分为三部分,最底下的 Platform Specific 用于兼容不同的平台特性,在可预见的将来,这一块的逻辑将会随着支持的平台增多而有所改动。其次是处于中间的 Engine,由 C/C++ 实现,主要分为两个功能:一是用于与上层和下层通信;二是用于图形图像的 Render 渲染。最后是最上层的 Framenwork,由 Dart 实现,主要是一些 UI 相关的封装实现,这一块几乎都是在造 Dart Related 的轮子没什么好说的。

Flutter 的设计原理其实并不复杂,特别是对于做过手游或地图类需要大量绘制场景的童鞋来说,Flutter 与这些手游的原理几乎没区别。Android 手机的开发者选项里有一个叫做“显示布局边界”的选项:

入坑 Flutter 前你需要知道的一些 XXX_第2张图片

所谓布局边界,就是 Android 应用界面布局上每一个 View 的边界,首先我们需要知道的是在 Android 中所有的 View 都是“矩形”的,即便在界面上它呈现的是不同的图像,比如一个圆、一颗星。不管这些 View 显示的是何种图形,它都有一个矩形的边界,你可以把 Android 的 UI 界面看做是一面墙,而这些一个个的 View 就像是墙上挂着的相框,每个相框都是矩形的,尽管它们装裱着各不相同的图片。

打开“显示布局边界”,你就可以在屏幕上看到界面上一个个 View 的“边框”:

入坑 Flutter 前你需要知道的一些 XXX_第3张图片

大部分情况下,我们使用这个功能来查看界面的布局状况以便查找一些布局上的问题。同样,我们也可以用该功能查看任意安装在手机上的应用当前界面布局状态,比如像闲鱼这样的:

但是,你并不是总能查看到某些应用界面的布局边界,比如高德地图的界面:

即便在该地图界面上有很多元素,但是它们并不是像上面的闲鱼 APP 那样由许多 View 堆砌成。再举个栗子,比如王者荣耀这样的游戏:

除了 SystemUI 的边界外,你更是看不到任何 View 的边界存在。

这里爱哥将上述两种类型的应用统称为“绘制”类应用,为什么这类绘制类应用不使用系统 Framework 提供的 View 组件呢?因为需求不符,既不符合技术上的需求,也不符合产品上的需求。技术上你可以尝试下在某个布局里添加几百个 Button 并频繁更新看看什么效果;至于产品上嘛,emmmmmmm……你可以想象下 ImageView 上设置各个角度的鲁班一号序列帧(当然实际上是用 U3D)在地图界面上跑的效果。所以,这些对绘制要求极高的应用大多会采用自己绘制的方式来实现界面。而像 Andriod 或 IOS 这些平台原生提供的 UI 控件本质上也不过是一堆绘制封装好便于重复使用的元素而已,像一些 GL 实现的游戏,就有大量封装的界面元素组件可以直接进行移植使用。如果我们把某一平台设备所展示的界面看成是一张画布,那么界面上的元素也就是这张画布上的图像而已,假如我们提供一种可能,将这张画布从一个平台设备“撕”下来放置到另一个平台设备上,那么我们至少可以在用户的角度实现跨平台。刚才我们说过,像 Andriod 或 IOS 这些平台原生提供的 UI 控件本质上也不过是一堆绘制封装好便于重复使用的元素而已。一种理想的状况是将其中之一的这些元素移植到另一方,那么到底是 Android to IOS 还是 IOS to Android 呢?显然两者都不可能,两者发展至今都于各自平台上积累了大量的原生逻辑,且与各自平台的耦合度都很高,强行实现无异于对整个 UI 层面的重写,如果重写,那又何必只局限于两个平台而不兼容更多平台呢?

软件架构一大光辉照耀的主体思想是提取共性,有共性才有被设计的可能,以不同平台的按钮控件为例,我们是否能在 Button(Android)、UIButton(Apple)、

你可能感兴趣的:(flutter,dart,android,ios,web)