Flutter for Windows 启动流程解析
当你启动了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
帮我们处理了很多内部逻辑,总之就是它帮我们启动了引擎,想深入研究?下面请...(和上面是同一篇文章)Windows 下 Flutter Engine 是如何启动的?(还没开始写)
24-26行,判断是否初始化成功。
Flutter 与Windows平台交互(Method&Event Channel) - 掘金 (juejin.cn)
一般我们写
Platform Channel
的配置也是在这个函数内的,因为它可以确保引擎初始化成功。FlutterViewController
持有显示画面的view
和flutter engine
,view
的GetNativeWindow
方法会返回一个HWND
标识符,这个标识符对应的内容就是Flutter
渲染好的界面。最后调用
Win32 MFC
的SetChildContent
把原来的空白内容替换成我们要的Flutter
界面。
回到main.cpp
CreateAndShow
返回true
,就有画面出来了。
写点感想
应该没什么人会研究这个,但我就是头铁要研究,因为拨云见日,让我看到了共享纹理的可行性,吃通一个平台,其他的逻辑也是类似的,嘻嘻。
作者:Chinouo
链接:https://juejin.cn/post/7023659473193402398