// 1. 确保WidgetsFlutterBinding被初始化。

WidgetsFlutterBinding.ensureInitialized()

// 2. 将传递过来的根widget app attach到某个地方

…scheduleAttachRootWidget(app)

// 3. 调度一个‘热身’帧

…scheduleWarmUpFrame();

}

接下来我们就继续对着runApp内三行代码进行逐一突破:

1、WidgetsFlutterBinding初始化

直接看ensureInitialized()源码:

// WidgetsFlutterBinding可以理解为是widget框架和Flutter引擎的桥梁

class WidgetsFlutterBinding extends BindingBase with GestureBinding, SchedulerBinding, ServicesBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {

static WidgetsBinding ensureInitialized() {

if (WidgetsBinding.instance == null)

WidgetsFlutterBinding();

return WidgetsBinding.instance!;

}

}

WidgetsFlutterBinding类继承自BindingBase并且混入[mixin]了很多其他Binding类,看名称都是绑定各种不同的功能;

BindingBase,上面的各个mixin Binding类都是继承自它,各个mixin类都重写了initInstances()方法,并且调用了super.initInstances(),所以他们所有的initInstans()方法都会被串行顺序执行。如果对mixin机制不是很理解可以先看看”小白都能看懂的关于Mixins机制的理解“。最终FlutterWidgetBinding()初始化的逻辑为:

WidgetsFlutterBinding经过mixin依赖,实现了所有的Binding类的功能,下面逐一大概介绍一下每个Binding的作用:

GestureBinding:提供了window.onPointerDataPacket的回调,绑定Fragmework子系统,是Framework事件模型与底层事件的绑定入口。

ServicesBinding:提供了window.onPlatformMessage回调,用于绑定平台消息通道(messagechannel),主要处理原生和Flutter之间的通信。

SchedulerBinding:提供了window.onBeginFrame和window.onDrawFrame回调,监听刷新事件,绑定Framework绘制调度子系统

PaintingBinding:绑定绘制库,主要用于处理图片缓存。

SematicsBinding:语义化层与Flutter engine的桥梁,主要是辅助功能的底层支持。

RenderBinding:提供了window.onMetricsChange、window.onTextScaleFactorChanged等回调。它是渲染树与Flutter engine的桥梁。

WidgetsBinding:提供了window.onLocaleChanged,onBuildScheduled等回调。它是Flutter widget层与engine的桥梁。

很明显,可以看到Window类提供了各种平台的回调方法,正是我们Flutter Framework连接宿主操作系统的接口。我们来大致看下源码:

class Window {

// 当前设备的DPI,即一个逻辑像素显示多少物理像素,数字越大,显示效果就越精细保真。

// DPI是设备屏幕的固件属性,如Nexus 6的屏幕DPI为3.5

double get devicePixelRatio => _devicePixelRatio;

// Flutter UI绘制区域的大小

Size get physicalSize => _physicalSize;

// 当前系统默认的语言Locale

Locale get locale;

// 当前系统字体缩放比例。

double get textScaleFactor => _textScaleFactor;

// 当绘制区域大小改变回调

VoidCallback get onMetricsChanged => _onMetricsChanged;

// Locale发生变化回调

VoidCallback get onLocaleChanged => _onLocaleChanged;

// 系统字体缩放变化回调

VoidCallback get onTextScaleFactorChanged => _onTextScaleFactorChanged;

// 绘制前回调,一般会受显示器的垂直同步信号VSync驱动,当屏幕刷新时就会被调用

FrameCallback get onBeginFrame => _onBeginFrame;

// 绘制回调

VoidCallback get onDrawFrame => _onDrawFrame;

// 点击或指针事件回调

PointerDataPacketCallback get onPointerDataPacket => _onPointerDataPacket;

// 调度Frame,该方法执行后,onBeginFrame和onDrawFrame将紧接着会在合适时机被调用,

// 此方法会直接调用Flutter engine的Window_scheduleFrame方法

void scheduleFrame() native ‘Window_scheduleFrame’;

// 更新应用在GPU上的渲染,此方法会直接调用Flutter engine的Window_render方法

void render(Scene scene) native ‘Window_render’;

// 发送平台消息

void sendPlatformMessage(String name,

ByteData data,

PlatformMessageResponseCallback callback) ;

// 平台通道消息处理回调

PlatformMessageCallback get onPlatformMessage => _onPlatformMessage;

… //其它属性及回调

}

Window类包含了当前设备和系统的一些信息以及Flutter Engine的一些回调。通过这些Binding 监听Window对象的一些事件,然后将这些事件按照Framework的模型包装,抽象再分发。

2、scheduleAttachRootWidget

WidgetsFlutterBinding初始化之后,接着会调用WidgetsBinding.attachRootWidget方法,该方法负责将根Widget添加到RenderView上,

void attachRootWidget(Widget rootWidget) {

_readyToProduceFrames = true;

_renderViewElement = RenderObjectToWidgetAdapter(

container: renderView,

debugShortDescription: ‘[root]’,

child: rootWidget,

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频 如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)

最后

答应大伙的备战金三银四,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。 节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。 给文章留个小赞,就可以免费领取啦~

戳我领取:3000页Android开发者架构师核心知识笔记

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它? 1.可以通过目录索引直接翻看需要的知识点,查漏补缺。 2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-24FkRBQP-1710659623875)]

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

[外链图片转存中…(img-6dofY4mE-1710659623875)]

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: