首先我们先来看看Flutter 启动流程以及Flutter 和 Native 通信的原理
参考:Flutter Platform Channels、FLUTTER and native interaction
这边先另外介绍一下Flutter 的启动流程,我们从main.dart
的main
函式开始
void main() => runApp(MyApp());
其中main
函式呼叫的runApp
函式:
void runApp(Widget app) {
WidgetsFlutterBinding.ensureInitialized()
..scheduleAttachRootWidget(app)
..scheduleWarmUpFrame();
}
函式中有用到Dart 语法中的级联运算子(..),代表的含义是WidgetsFlutterBinding.ensureInitialized()
生成的物件分别呼叫了scheduleAttachRootWidget
和scheduleWarmUpFrame
这两个方法
runApp
主要作用为:
这边简介分析一下runApp
流程
WidgetsFlutterBinding 中的所有程序码如下:
class WidgetsFlutterBinding extends BindingBase with GestureBinding, SchedulerBinding, ServicesBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {
// 初始化方法
static WidgetsBinding ensureInitialized() {
if (WidgetsBinding.instance == null)
// 建构方法呼叫
WidgetsFlutterBinding();
// 返回WidgetsBinding 物件
return WidgetsBinding.instance!;
}
}
WidgetsFlutterBinding
继承自BindingBase
,混入了GestureBinding
,SchedulerBinding
,ServicesBinding
,PaintingBinding
,SemanticsBinding
,RendererBinding
和WidgetsBinding
,这7个mixin(之後会在Flutter 和 Native 通讯的原理对ServicesBinding
做简介,其他内容可自行研究),而ensureInitialized
方法就是获取WidgetsBinding.instance
单例的过程
这边我们先从FlutterView 开始介绍
FlutterView 是Flutter Engine 给Flutter Framework 开放处理UI 和事件的介面,可以把Flutter Framework理解为围绕FlutterView的一个处理框架,上面WidgetsFlutterBinding 混入的多个mixin 主要就是处理window 物件(即FlutterView 物件)的回拨事件和提交渲染内容
其中window 物件是BindingBase 的变数:
ui.SingletonFlutterWindow get window => ui.window;
ui.window
是PlatformDispatcher.instance
中windowId
为0 的主window:
final SingletonFlutterWindow window = SingletonFlutterWindow._(0, PlatformDispatcher.instance);
SingletonFlutterWindow
的继承关系如下
abstract class FlutterView {}
class FlutterWindow extends FlutterView {}
class SingletonFlutterWindow extends FlutterWindow {}
FlutterView有几个重要的属性和方法:
PlatformDispatcher
是FlutterView 的核心,FlutterView是对它的一层封装,是真正向Flutter Engine 传送讯息和得到回拨的类别
ViewConfiguration
是对Platform View 的配置资讯的描述
render
方法是将Flutter 程序码生成的渲染内容(Layer Tree生成的Scene)传递给Flutter Engine,让GPU去渲染
总结:FlutterView 物件window
本质上是对PlatformDispatcher 的封装,从PlatformDispatcher 获取一些介面相关资讯,获取从Flutter Engine 传送来的事件,然後触发和转发相应的回拨方法
本篇章主要是先从技术层面来解释 URI 与 URL 及比较少使用到却与生活息息相关的 URN,让读者...
Nnọọ,我是Charlie! 在Day23当中我们完成了订单资料的後端API,而今天我们将完成订单...
昨天我们已经能成功将JSON格式的资料print出来了,接着就来实作天气预报App吧! 首先,我们要...
前言 最近因为上班进度缓慢,所以内容比较慢,但应该也只能这样了哈哈,我们今天也一样会用到 Oncli...
ParseInt() 直到我在写这篇之前,parseInt 在我心中都还是一个很简单的概念,一个可以...