Flutter 类似onResume 监听,解决入场动画卡顿

news/2024/7/7 19:32:17

在Flutter 实际开发过程中,页面数据往往是异步加载,接口请求回来后,数据刷新显示到界面上。

由于Flutter性能原因,也可能因为获取数据量比较大,在新页面路由进场动画执行过程中,接口请求结果回来了,很可能在进场动画执行过程中,刷新界面,导致进场动画卡顿。

那可不可以实现在路由进场完成后,再去请求数据,刷新界面呢,很遗憾官方没有类似的监听,官方提供的路由状态监听,是在调用push切换路由时,立即生效,和我们的期望不一致。

在查看了Flutter 源码,发现了一个取巧的方案,提供给大家。

直接上源码

/// @author bawomingtian
/// @date 2023/10/16
/// @desc 通过监听路由入场动画完成,判断路由完全进入,可以用来优化在进场动画执行过程中
/// 异步请求数据刷新界面,导致进场动画卡顿的问题
class AsyncState<T extends StatefulWidget> extends State<T> {
  Completer<bool> resumeCompleter = Completer();
  @override
  void didChangeDependencies() {
    ModalRoute.of(context)!.controller?.addStatusListener((status) {
      if(status==AnimationStatus.completed){
        initAsyncLoad();
      }
    });
    super.didChangeDependencies();
  }

  ///子类可以在initState 请求接口
  ///该方法主要目的为:路由动画执行结束后,再返回结果
  ///可以提前预加载数据,加快内容显示
  Future<dynamic> asyncWaitResume(Future<dynamic> future) async {
    var value = await Future.wait([future,resumeCompleter.future]);
    return value.first;
  }

  ///入场路由动画执行完成,新入场页面完全进入
  void initAsyncLoad(){
    resumeCompleter.complete(true);
  }

  @override
  Widget build(BuildContext context) {
    return const SizedBox();
  }
}

原理很简单,通过监听入场动画的状态来判断路由状态

下面贴一下使用方法

class _TestState extends AsyncState<Object> {

 ......

  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
      asyncWaitResume(loadUserList()).then((value){
        ......
      });
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    ......
  }

这样可以很方便的请求接口刷新界面,不用担心入场动画卡顿


http://lihuaxi.xjx100.cn/news/1703942.html

相关文章

搞个微信小程序001

一&#xff0c;申请账号 开始 | 微信开放文档 二&#xff0c;安装开发者工具 开始 | 微信开放文档 我这里搞了个稳定版的。 三&#xff0c;第一个小程序 1&#xff0c;打开工具&#xff0c;扫码登录 2&#xff0c;新建以小程序 选择&#xff0c;不使用云服务&#xff0c…

TensorRT学习笔记--常用卷积、激活、池化和FC层算子API

目录 1--Tensor算子API 1-1--卷积算子 1-2--激活算子 1-3--池化算子 1-4--FC层算子 2--代码实例 3--编译运行 1--Tensor算子API TensorRT提供了卷积层、激活函数和池化层三种最常用算子的API&#xff1a; // 创建一个空的网络 nvinfer1::INetworkDefinition* network …

【C++11】列表初始化

在C98中&#xff0c;标准允许使用花括号“{}”对数组元素进行统一的集合&#xff08;列表&#xff09;初始值设定&#xff0c;比如&#xff1a; int arr[5]{0}; int arr[]{1,2,3}; 这些都是合法的表达式。不过一些自定义类型&#xff0c;却无法享受这样便利的初始化。通常&…

java泛型场景补充注意事项

前言 本文不是对泛型的系统介绍&#xff0c;也不打算对其进行入门讲解&#xff0c;只是对遇到的一些泛型场景的补充。看过宋红康和韩顺平的javase课程可以花几分钟看看。 1.&符号在泛型中的使用&#xff0c;用来描述有边界的受约束泛型 class A{} interface B{} public …

OpenStack云计算平台实战-----创建空白虚拟机

1、创建空白虚拟机 需要注意的步骤会截图一下&#xff0c;其它的基本都是下一步&#xff0c;默认的即可 建议将虚拟机命名为自己的名字加后缀 将处理器数量和每个处理器的内核量都修改为2 将虚拟机的内存设置为8G&#xff0c;不然不够用 将指定磁盘大小设置为200G&#xff0c;…

『C语言进阶』字符函数和内存函数(2)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f516;系列专栏&#xff1a; C语言、Linux、Cpolar ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、strtok函数1.1 函数认识1.2 注意事项 二、strerror函数2.1 函数认识2.2 注意事项 三、memcpy函数3.1 函数…

Linux查看日志命令

首先cd 进入服务容器里文件所在目录 1. cat 命令 适合查看简短的文件,如配置文件 application.properties,当然也可以看日志 #看配置文件 cat application.properties#看运行日志文件 cat xxx.out#配合检索命令 cat application.properties | grep xxx 2. tail -f 命令 #-1…

HttpClient / Http客户端

HttpClient / Http客户端: HttpClient的定义HttpClient的作用HttpClient的常用核心APIHttpClient要导入的依赖HttpClient发送请求的步骤HttpClient入门案例&#xff1a;HttpClient(Http客户端)发送get请求HttpClient(Http客户端)发送post请求 HttpClient工具类 (代码) HttpCli…