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

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,

).attachToRenderTree(buildOwner!, renderViewElement as RenderObjectToWidgetElement?);

}

注意:

代码中的renderView是一个RenderObject,它渲染树的根

renderViewElement是renderView对应的Element对象,可见该方法主要完成根widget到根RenderObject再到跟Element的整个关联过程。

再来看看attachToRenderTree源码实现:

/// Inflate this widget and actually set the resulting [RenderObject] as the

/// child of [container].

///

/// If element is null, this function will create a new element. Otherwise,

/// the given element will have an update scheduled to switch to this widget.

///

/// Used by [runApp] to bootstrap applications.

RenderObjectToWidgetElement attachToRenderTree(BuildOwner owner, [ RenderObjectToWidgetElement? element ]) {

if (element == null) {

owner.lockState(() {

element = createElement();

assert(element != null);

element!.assignOwner(owner);

});

owner.buildScope(element!, () {

element!.mount(null, null);

});

// This is most likely the first time the framework is ready to produce

// a frame. Ensure that we are asked for one.

SchedulerBinding.instance!.ensureVisualUpdate();

} else {

element._newWidget = this;

element.markNeedsBuild();

}

return element!;

}

该方法负责创建根element,即:RenderObjectToWidgetElement,并且将element于widget进行关联,即创建出widget数对对应的element树。如果element已经创建过了,则将根element中关联的widget设为新的,由此可以看出element只会创建一次,后面会进行复用。那么BuildOwner是什么呢?其实它就是widget fragment的管理类,它跟踪哪些widget需要重新构建。

3、热身帧绘制

​ 组件数在构建(build)完成以后,回到runApp实现中,当attachRootWidget后,最后一行调用WidgetsFlutterBinding实例的scheduleWarmUpFrame()方法,该方法在实例SchedulerBinding中,它被调用后会立即进行一次绘制,在此次绘制结束之前,该方法会锁定事件分发,也就是说在本次绘制结束完成之前Flutter将不会响应各个事件,这可以保证在绘制过程中不会被再出发新的绘制。

scheduleWarmUpFrame()源码

void scheduleWarmUpFrame() {

if (_warmUpFrame || schedulerPhase != SchedulerPhase.idle)

return;

_warmUpFrame = true;

Timeline.startSync(‘Warm-up frame’);

final bool hadScheduledFrame = _hasScheduledFrame;

// We use timers here to ensure that microtasks flush in between.

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

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

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

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

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

《379页Android开发面试宝典》

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

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

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

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

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

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

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

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
T大厂 2020-2021面试真题解析**

[外链图片转存中…(img-p5PraRdu-1712787888945)]

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

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-fT47arPF-1712787888945)]

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐