当你启动了Flutter Windows平台支持的时候,创建的项目列表就会多出一个windows文件夹,文件夹内部是Cmake工程文件,当你执行flutter run的时候,如果打开Vs2019,就会在下面的控制台看到Cmake的工作内容。
出于好奇,对文件夹的内容做了梳理,总结了下列流程图:
不多说,开始一步一步分析!
main.cpp
20-33行就是Flutter的启动逻辑,剩下的头和尾对应流程图的头和尾,我们这里不关心。
如果你想更深入了解DartProject和FlutterWindow的内部逻辑,下面这篇文章详细梳理了内部过程,因为篇幅太多,就单独抽离出来。
Windows 下 Flutter Engine 是如何启动的?(还没开始写)
这里只对FlutterWindow的CreateAndShow进行梳理
CreateAndShow(FlutterWindow.cpp)
FlutterWindow的父类是Win32Window,Win32Window并不复杂,CreateAndShow函数实际上是Win32Window实现的,内容如下。
CreateAndShow的参数很简单,title就是标题栏名称,origin就是相对屏幕左上方的坐标,和移动端一样逻辑,size为窗口大小。
在Oncreate函数调用之前,熟悉Win32 MFC的同学已经知道了,就设置了DPI,创建了一个空白窗口,用Win32的HWND标识符储存该窗口信息,目前这个窗口是一片空白。
到这里,还是没有看到任何flutter engine的启动代码,所以到这里,flutter engine还没有启动。
OnCreate(FlutterWindow.cpp)
前方高能
父类Win32Window的OnCreate就是个打酱油的,FlutterWindow的OnCreate才是重量级选手。
-
19-26行,
flutter_controller_是FlutterViewController类型,构造参数是窗口大小和DartProject,也就是说我们一开始创建的project在这边就被使用了。这个controller帮我们处理了很多内部逻辑,总之就是它帮我们启动了引擎,想深入研究?下面请...(和上面是同一篇文章) -
24-26行,判断是否初始化成功。
- 一般我们写
Platform Channel的配置也是在这个函数内的,因为它可以确保引擎初始化成功。 Flutter 与Windows平台交互(Method&Event Channel) - 掘金 (juejin.cn)
- 一般我们写
-
FlutterViewController持有显示画面的view和flutter engine,view的GetNativeWindow方法会返回一个HWND标识符,这个标识符对应的内容就是Flutter渲染好的界面。 -
最后调用
Win32 MFC的SetChildContent把原来的空白内容替换成我们要的Flutter界面。
回到main.cpp
CreateAndShow返回true,就有画面出来了。
写点感想
应该没什么人会研究这个,但我就是头铁要研究,因为拨云见日,让我看到了共享纹理的可行性,吃通一个平台,其他的逻辑也是类似的,嘻嘻。