Flutter 是 Google 开源的跨平台移动开发框架。 用一套代码为 iOS 和 Android 构建高性能,美观的应用程序。它也是 Google 即将推出的 Fuchsia 操作系统的开发平台。此外,它的架构可以通过定制的 Flutter 引擎将其引入其他平台。
Flutter 试图使移动开发更友好, 它为开发人员提供应用程序框架和可移植的运行时引擎。该框架建立在 Skia 图形库上,提供实际呈现的部件,而不仅仅是原生控件的包装。
Flutter 做跨平台开发能够像 web 一样灵活,但同时提供流畅的性能。Flutter 附带的部件库以及开源部件使其成为一个功能丰富的平台。简单地说,Flutter 是最接近移动开发人员用于跨平台开发的理想平台,灵活性、性能几乎毫无妥协。
Flutter 使用谷歌开发的 Dart 语言进行开发。 Google给出了选择Dart开发Flutter的理由:
Flutter 分为 Framework和 Engine,我们是基于运行在 Engine 上的Framework进行开发App。下面分别对各个模块进行介绍:
Flutter提供了一套丰富的Material widget,可帮助您构建遵循Material Design的应用程序。
Flutter也提供了一套丰富的Cupertino(iOS)风格的widget
Flutter Widget采用现代响应式框架构建,据说是从 React 中获得的灵感。widget的主要工作是实现一个build函数,用以构建自身。一个widget通常由一些较低级别widget组成。Flutter框架将依次构建这些widget,直到构建到最底层的子widget时,这些最低层的widget通常为RenderObject,它会计算并描述widget的几何形状。
widget分为无状态的StatelessWidget和有状态的StatefulWidget, 具体的选择取决于widget是否需要管理一些状态。
在StatefulWidget调用createState之后,框架将新的状态对象插入树中,然后调用状态对象的initState。 子类化State可以重写initState,以完成仅需要执行一次的工作。 例如,您可以重写initState以配置动画或订阅platform services。initState的实现中需要调用super.initState。初始化之后,调用setState或者收到dUpdateConfig来改变更新UI。当一个状态对象不再需要时,框架调用状态对象的dispose。 您可以覆盖该dispose方法来执行清理工作。例如,您可以覆盖dispose取消定时器或取消订阅platform services。 dispose典型的实现是直接调用super.dispose。
Rendering
Flutter Widgets库使用RenderObject层次结构来实现其布局和绘制后端。 可以在应用程序中使用自定义RenderBox类来处理特定效果。但大多数情况下,都只是使用RenderObject层次调试布局问题。
如果直接在Rendering库上开发自己的库或应用程序,需要进行绑定(BindingBase)。默认的Widgets已经有Flutter完成绑定。 也可以使用RenderingFlutterBinding,创建自己的绑定。至少需要导入ServicesBinding,GestureBinding,SchedulerBinding,PaintingBinding和RendererBinding。
Animation
Flutter 动画库,提供两种动画类型tween和physics-based。
Painting
该库包含Flutter引擎的绘制API,用于更专业的目的,例如绘制缩放图像,在阴影之间插值,在框周围绘制边框等。
Gestures
Gesture提供了手势识别相关的功能,包括触摸事件类定义和多种内置的手势识别器。
Engine
Flutter 引擎全部使用C++实现,提供Dart运行时和文字排版引擎(libtxt)和绘图引擎Skia。SKia是一个 2D的绘图引擎库,可以直接将数据通过OpenGL或者 Vulkan,传给GPU进行绘制。Chrome和 Android均采用 Skia作为绘图引擎。Skia提供了非常友好的 API,并且在图形转换、文字渲染、位图渲染方面都提供了友好、高效的表现。Skia是跨平台的,所以可以被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS闭源的 Core Graphics / Core Animation。
Flutter 环境搭建
Flutter 安装
IDE
Flutter原生间通信
消息在client(Flutter测)和 host(Native测)之间通过平台通道进行传递。
Flutter调用原生,使用MethodChannel
消息和响应以异步方式传递,在客户端,MethodChannel(API)允许发送与方法调用相对应的消息。 在平台方面,Android(API)为MethodChannel和iOS(API)为FlutterMethodChannel启用接收方法将回调注入。
原生调用Flutter,使用EventChannel
使用EventChannel时,client和host 身份互换,即Flutter变为host,原生端变为client。使用EventChannel进行消息传递。