Flutter获取Build完成状态监听 及每一帧绘制完成的监听

Flutter 在 Build完成后的监听和每一帧绘制完成后的监听

这个是我们监听要用的重要的类------->WidgetsBinding

官方是这么描述它的

The glue between the widgets layer and the Flutter engine.

中文的意思是 控件层和Flutter引擎之间的粘合剂。就是这个类 它能监听到第一帧绘制完成,第一帧绘制完成标志着已经Build完成,并交由引擎绘制结束;我们看下是哪个方法肩负此重任

1//Schedule a callback for the end of this frame 2addPostFrameCallback(FrameCallback callback)void

这个方法的意思是此帧结束时的回调,应该不局限于开始的第一帧(触发待研究),如果我们在initState里面加入此监听,那就美妙了,等Build结束,你的回调就会执行

想想应该和 Android 的 onResume 效果差不多哈,下面是我写的例子

1@override 2 void initState() { 3 super.initState(); 4 widgetsBinding=WidgetsBinding.instance; 5 widgetsBinding.addPostFrameCallback((callback){ 6 print("addPostFrameCallback be invoke"); 7 }); 8 }

2 . 监听每一帧结束

这个监听感觉都能做游戏了,充分利用CPU绘制来达到高帧率,举个栗子,我在画泡泡上升的动画,我可以用Timer来画,但是我手机性能好的话,一帧结束了。还有等待一段时间才绘制下一帧;手机性能差的话,我前一帧都没画完呢,你就开始下一帧了,这不是要卡死的节奏吗?  

好了,看下怎么监听的!类还是那个类---->WidgetsBinding,方法却不再是那个方法了,我们来认识下他

1//Adds a persistent frame callback 2//持久帧的回调 3addPersistentFrameCallback(FrameCallback callback)void

还是InitState,我们初始化的时候,加上这个监听那就无敌了,看下例子

1@override 2void initState() { 3 super.initState(); 4 widgetsBinding=WidgetsBinding.instance; 5 widgetsBinding.addPostFrameCallback((callback){ 6 widgetsBinding.addPersistentFrameCallback((callback){ 7 print("addPersistentFrameCallback be invoke"); 8 //触发一帧的绘制 9 widgetsBinding.scheduleFrame(); 10 }); 11 }); 12}

是不是很简单,是不是解决了Build完成的监听,是不是离高性能游戏又迈进了一步,贴一张我写的例子

点赞
收藏

评论区

加载中...

相关推荐

React - Fiber原理

浏览器渲染屏幕刷新率(FPS)浏览器的正常绘制频率是60次/秒,小于这个值时,用户会感觉到卡顿绘制一次的称为一帧,平均每帧16.6ms帧每个帧的开头包括样式计算、布局和绘制js的执行是单线程,js引擎和页面渲染引擎都占用主线程,GUI渲染和Javascript执行两者是互斥的如果某个js任务执行时间过长,浏览器会推迟渲染,每

vue的watch监听

vue的watch监听函数watch用来响应数据的变化,watch的用法大致有以下三种:1.监听某个变量watch:{name(newName,oldName){console.log(newName)//改变前的值console.log(oldName)//改变后的值

SpringBoot的事件监听

事件监听的流程分为三步:1、自定义事件,一般是继承ApplicationEvent抽象类。2、定义事件监听器,一般是实现ApplicationListener接口。3、a、启动的时候,需要将监听器加入到Spring容器中。b、或者将监听器加入到容器中。@Componentc、使用@EventLis

Flutter 中的组件绘制完成监听、组件生命周期和APP生命周期

Flutter的生命周期说到Flutter的生命周期,其实就是说StatefulWidget的生命周期,因为StatelessWidget是静态控件。StatefulWidget,通过借助于State对象,处理状态变化,并体现在UI上。这些阶段,就涵盖了一个组件从加载到卸载的全过程,即生命周期。

SpringBoot整合多个RabbitMQ

一、背景​最近项目中需要用到了RabbitMQ来监听消息队列,监听的消息队列的虚拟主机(virtualHost)和队列名(queueName)是不一致的,但是接收到的消息格式相同的。而且可能还存在程序不停机的情况下,动态的增加新的队列(queue)的监听,因此就需要我们自己在程序中实现一种方法实现动态配置RabbitMQ

Python骚操作:利用Python获取摄像头并实时控制人脸!

实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样)程序启动后,根据监听器信息,使用一个while循环,不断的加载视频图像,然后返回给opencv工具呈现图像信息。创建一个键盘事件监听,按下"d"键,则开始执行面部匹配,并进行面具加