这篇文章是对Flutter for Windows 启动流程解析 - 掘金 (juejin.cn)的一些内容补充,也就是针对FlutterViewController
内部的代码逻辑进行梳理,了解Flutter Engine
在Windows平台下的启动机制。
本篇最好配合官方Flutter Engine的源码食用!
前情提要
在FlutterWindow
的OnCreate
的函数内,我们创建了一个FlutterViewController
,其构造方法如下。
源码在官方Engine库的位置:src\flutter\shell\platform\windows\client_wrapper\flutter_view_controller.cc
进入正题
我们看到了许多以FlutterDesktop
开头命名的函数,也就是引擎创建和启动的关键,顺着头文件寻找,发现了它们的定义和实现文件:
- 声明文件路径:src\flutter\shell\platform\windows\public\flutter_windows.h
- 实现文件路径:src\flutter\shell\platform\windows\flutter_windows.cc
记住,这个文件是桌面平台和引擎底层交互的一个接口!大多数情况下是调用embedder
的函数。
Engine的创建
朴实无华的一串代码,直接转到FlutterEngine
的实现路径src\flutter\shell\platform\windows\client_wrapper\flutter_engine.cc
,发现了和官方GLFW Example
相似的代码。
-
首先,16-18行,把
DartProject
的路径地址拷贝到c_engine_properties
里。- 好奇这些路径的具体含义?DartProjet 参数解析(还没写)
-
20-31行,是对命令行传入的参数个数和参数内容进行处理。
- 如果你在
Flutter
看到过@vm-entrypoint
的注解,你就明白他的意思。如果你不传递参数,那么默认入口为dart端的main
。
- 如果你在
- 33-35行就是创建一个引擎,然后获得引擎创建的
Messenger
,我们深入看看FlutterDesktopEngineCreate
做了什么
FlutterDesktopEngineCreate
这个部分的源码都在src\flutter\shell\platform\windows
下,可自行查阅。
FlutterProjectBundle
没做什么,就是把一些路径属性转换成内部读得懂的。
HandleForEngine
也没做什么,就是一个类型转换。(flutter_project_bundle.cc
)
flutter_winddows.cc
里面的Handle
开头的大多数是做这个工作。
FlutterWindowsEngine
,也就是我们所创建的Engine
类型了。
这些代码想知道含义看命名即可,不难理解,我感兴趣的是164-168行的内部逻辑,它也就是我的下一篇共享纹理文章猜想的来源。
Flutter for Windows共享纹理的猜想 - 掘金 (juejin.cn)
flutter_windows_engine.cc
至此,WIN平台的引擎构建好了,但是还没有启动!!
回到起点
创建好引擎后,我们又创建了FlutterDesktopViewControllerCreate
,通过注释,得知,它里面包含了启动的逻辑,至于实现,这里就不贴了。
至此,引擎跑起来了,芜湖!
小尾巴:也许你会看到这个Run
函数
但是直接调用是失败的,因为还没有设置引擎的渲染方式等等属性,这就是FlutterDesktopViewControllerCreate
内部帮我们处理的任务。
好奇怎么失败的?下面这篇文章告诉你答案
-Flutter 使用VS2019和Cmake启动Flutter Engine(还没写)
END
再深入研究,Flutter都不会写了,等这几篇相关的文章写完,好好学习算法和原生了,毕竟下半学期要找个班上了。