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

Stella981
• 阅读 955

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

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

官方是这么描述它的

The glue between the widgets layer and the Flutter engine.

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

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

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

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

@override
  void initState() {
    super.initState();
    widgetsBinding=WidgetsBinding.instance;
    widgetsBinding.addPostFrameCallback((callback){
      print("addPostFrameCallback be invoke");
    });
  }

2 . 监听每一帧结束

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

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

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

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

@override
void initState() {
  super.initState();
  widgetsBinding=WidgetsBinding.instance;
  widgetsBinding.addPostFrameCallback((callback){
    widgetsBinding.addPersistentFrameCallback((callback){
      print("addPersistentFrameCallback be invoke");
      //触发一帧的绘制
      widgetsBinding.scheduleFrame();
    });
  });
}

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

点赞
收藏
评论区
推荐文章
凯特林 凯特林
3年前
React - Fiber原理
浏览器渲染屏幕刷新率(FPS)浏览器的正常绘制频率是60次/秒,小于这个值时,用户会感觉到卡顿绘制一次的称为一帧,平均每帧16.6ms帧每个帧的开头包括样式计算、布局和绘制js的执行是单线程,js引擎和页面渲染引擎都占用主线程,GUI渲染和Javascript执行两者是互斥的如果某个js任务执行时间过长,浏览器会推迟渲染,每
LinMeng LinMeng
3年前
vue的watch监听
vue的watch监听函数watch用来响应数据的变化,watch的用法大致有以下三种:1.监听某个变量watch:{name(newName,oldName){console.log(newName)//改变前的值console.log(oldName)//改变后的值
Easter79 Easter79
2年前
SpringBoot的事件监听
事件监听的流程分为三步:1、自定义事件,一般是继承ApplicationEvent抽象类。2、定义事件监听器,一般是实现ApplicationListener接口。3、a、启动的时候,需要将监听器加入到Spring容器中。b、或者将监听器加入到容器中。@Componentc、使用@EventLis
Stella981 Stella981
2年前
Flutter 中的组件绘制完成监听、组件生命周期和APP生命周期
Flutter的生命周期说到Flutter的生命周期,其实就是说StatefulWidget的生命周期,因为StatelessWidget是静态控件。StatefulWidget,通过借助于State对象,处理状态变化,并体现在UI上。这些阶段,就涵盖了一个组件从加载到卸载的全过程,即生命周期。
Stella981 Stella981
2年前
SpringBoot整合多个RabbitMQ
一、背景​最近项目中需要用到了RabbitMQ来监听消息队列,监听的消息队列的虚拟主机(virtualHost)和队列名(queueName)是不一致的,但是接收到的消息格式相同的。而且可能还存在程序不停机的情况下,动态的增加新的队列(queue)的监听,因此就需要我们自己在程序中实现一种方法实现动态配置RabbitMQ
Wesley13 Wesley13
2年前
Java定时器(实现每月1号、每日、每15分钟自动执行任务) (转载 csdn 大脑补丁 用户 )
需求:在tomcat中,每月一号、每日、每分钟自动执行指定的任务。开发环境:java1.7 tomcat实现思路:在tomcat中,添加监听器,在监听器中设置定时任务。1.监听:新建监听类implents ServletContextListener,实现其中的方法即可。讲解:1.1:创建一个基准时间de
Wesley13 Wesley13
2年前
Java Web(九)
Listener&FilterListener  监听器1、能做什么事?  监听某一个事件的发生。状态的改变。2、监听器的内部机制  其实就是接口回调.接口回调1、需求:  A在执行循环,当循环到5的时候,通知B。 
Stella981 Stella981
2年前
Python骚操作:利用Python获取摄像头并实时控制人脸!
实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样)程序启动后,根据监听器信息,使用一个while循环,不断的加载视频图像,然后返回给opencv工具呈现图像信息。创建一个键盘事件监听,按下"d"键,则开始执行面部匹配,并进行面具加
Stella981 Stella981
2年前
SpringBoot的事件监听
事件监听的流程分为三步:1、自定义事件,一般是继承ApplicationEvent抽象类。2、定义事件监听器,一般是实现ApplicationListener接口。3、a、启动的时候,需要将监听器加入到Spring容器中。b、或者将监听器加入到容器中。@Componentc、使用@EventLis
Easter79 Easter79
2年前
SpringBoot整合多个RabbitMQ
一、背景​最近项目中需要用到了RabbitMQ来监听消息队列,监听的消息队列的虚拟主机(virtualHost)和队列名(queueName)是不一致的,但是接收到的消息格式相同的。而且可能还存在程序不停机的情况下,动态的增加新的队列(queue)的监听,因此就需要我们自己在程序中实现一种方法实现动态配置RabbitMQ