Flutter 实现dispose探测控件

文章目录

  • 前言
  • 一、什么是dispose探测控件?
    • 1、通常情况
    • 2、使用dispose探测控件
  • 二、如何实现
    • 1、继承StatefulWidget
    • 2、定义dipose回调
    • 3、定义child
    • 4、重载Dispose方法
    • 5、build child
  • 三、完整代码
  • 四、使用示例
    • 1、基本用法
    • 2、设置定义数据
  • 总结


前言

开发flutter一般会用状态管理工具,用了状态管理后大部分控件都会是StatelessWidget,StatefulWidget有dispose重载获取控件销毁时机,但StatelessWidget则没有,此时我们要获取控件销毁的时机就需要另寻他法了。


一、什么是dispose探测控件?

这是一个控件用于帮助探测无状态控件的销毁时机,有点类似visibility_detector用于探测控件的显示和隐藏。

1、通常情况

通常情况下想要知道一个页面是否销毁或切换了,需要通过StatefulWidget的dispose方法获取。代码如下:

class Page extends StatefulWidget {
  const Page({
    super.key,
  });
  
  _Page createState() => _Page();
}

class _Page<T extends Widget, S> extends State<Page> {
  
  void dispose() {
    super.dispose();
    //此处获取到dispose时机
    
  }
  
  
  void didUpdateWidget(covariant Page oldWidget) {
    super.didUpdateWidget(oldWidget);
    //此处获取到控价刷新时机

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

2、使用dispose探测控件

在使用使用状态管理的情况下,通常都是StatelessWidget页面,将其改成StatefulWidget,分成两个类显然是麻烦的。如果有了DisposeDetector(dispose探测控件),作为一个控件放入StatelessWidget页面中,就可以直接获取到dispose时机了。

class Page2 extends StatelessWidget {
  const Page2({
    super.key,
  });
  
  Widget build(BuildContext context) {
    return DisposeDetector(
      child: const SizedBox(),
      onDispose: () {
        //此处获取到dispose时机
      },
      onDidUpdateWidget: (DisposeDetector<SizedBox, dynamic> oldWidget) {
        //此处获取到控价刷新时机
      },
    );
  }
}

二、如何实现

1、继承StatefulWidget

在这里插入图片描述
在这里插入图片描述

2、定义dipose回调

在这里插入图片描述

3、定义child

在这里插入图片描述

4、重载Dispose方法

在这里插入图片描述

5、build child

在这里插入图片描述

三、完整代码

dispose_detector.dart

import 'package:flutter/material.dart';

/// 创建人:  xin
/// 创建时间: 2023/6/15 13:44
/// 注释: 销毁探测控件
class DisposeDetector<T extends Widget, S> extends StatefulWidget {
  final Function onDispose;
  final Function(DisposeDetector<T, S> oldWidget) onDidUpdateWidget;
  final T child;
  final S? tag; //自定义数据
  const DisposeDetector({super.key, 
    required this.child,
    required this.onDispose,
    required this.onDidUpdateWidget,
    this.tag,
  });
  
  _DisposeDetector<T, S> createState() => _DisposeDetector<T, S>();
}

class _DisposeDetector<T extends Widget, S> extends State<DisposeDetector<T, S>>
    with TickerProviderStateMixin {
  
  void dispose() {
    super.dispose();
    widget.onDispose();
  }

  
  void didUpdateWidget(covariant DisposeDetector<T, S> oldWidget) {
    super.didUpdateWidget(oldWidget);
    widget.onDidUpdateWidget(oldWidget);
  }

  
  Widget build(BuildContext context) {
    return widget.child;
  }
}

四、使用示例

1、基本用法

class Page2 extends StatelessWidget {
  const Page2({
    super.key,
  });
  
  Widget build(BuildContext context) {
    return DisposeDetector(
      child: const SizedBox(),
      onDispose: () {
        //此处获取到dispose时机
      },
      onDidUpdateWidget: (DisposeDetector<SizedBox, dynamic> oldWidget) {
        //此处获取到控价刷新时机
      },
    );
  }
}

2、设置定义数据

class Page2Controller {
  void dispose() {
    //销毁逻辑
  }
}

class Page2 extends StatelessWidget {
  final _ctrl = Page2Controller();
  Page2({
    super.key,
  });
  
  Widget build(BuildContext context) {
    return DisposeDetector(
      tag: _ctrl, //自定义数据,记录当前的controller
      onDispose: () {
        //此处获取到dispose时机
        _ctrl.dispose();
      },
      onDidUpdateWidget:
          (DisposeDetector<SizedBox, Page2Controller> oldWidget) {
        //此处获取到控价刷新时机
        if (oldWidget.tag != _ctrl)
        //如果刷新控件时controller改变了,则销毁旧controller
        {
          oldWidget.tag!.dispose();
        }
      },
      child: const SizedBox(),
    );
  }
}

总结

以上就是今天要讲的内容,本文提供的控件是比较有用的,尤其是业务逻辑有数据释放的需求,比如播放器之类的,控件销毁后需要结束播放,将播放资源销毁,如果是用StatelessWidget则没办法实现,用StatefulWidget又会使得页面实现变得麻烦或者复杂,最好的方法则是使用本文提供的dispose探测控件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机多个中断源时的设计思路,(51为例)工作寄存器R0-R7

51单片机中四组工作寄存器&#xff08;R0-R7&#xff09; 参考 可以看出每个工作寄存器区有8个字节即为R0-R7&#xff0c;当不指定使用哪个工作寄存器区的时候默认0区。其他工作区作为普通的RAM使用。特殊功能寄存器中有可以位寻址和不能位寻址的区域 下面文字引用 通过修改…

晶泰科技即将登陆港交所:三年亏近55亿,二级市场信心待考

《港湾商业观察》黄懿 有着“AI制药”之称的深圳晶泰科技有限公司&#xff08;以下简称&#xff0c;晶泰科技&#xff1b;02228.HK&#xff09;即将登陆港交所。 据日前消息&#xff0c;晶泰科技于2024年6月4日至6月7日招股&#xff0c;拟全球发售股份1.87373亿股&#xff0c…

ES8.13 _bulk报错Malformed content, found extra data after parsing: START_OBJECT解决

在使用elaticsearch8.13.0使用批量创建索引时&#xff0c;根据谷粒中说的es7.9方法去批量操作请求&#xff1a; http://127.0.0.1:9200/shop/_doc/_bulk 注意1&#xff1a;设置header为Content-Type:application/x-ndjson,否则请求报错&#xff1a; {"error": &qu…

LeetCode | 2022.将一维数组转变为二维数组

这道题思路比较简单&#xff0c;比较容易想到的是先判断m和n构成的二维数组在形式上是否可以由原来的数组转变而成&#xff0c;若不可以返回空数组&#xff0c;若可以直接用一个二重循环遍历一遍即可&#xff0c;时间复杂度 O ( n 2 ) O(n^2) O(n2) class Solution(object):de…

史上最全,呕心沥血总结oracle推进SCN方法(六)

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享。前面介…

tmux 移植到ARM板端运行环境搭建

tmux源码下载&#xff1a; Home tmux/tmux Wiki GitHub 依赖的库代码下载&#xff1a; libevent&#xff1a; ncurses: 第一步&#xff1a;将以上三个代码解压放在同一个目录下&#xff0c;逐个编译 1. cd ./libevent-2.1.12-stable ./configure --host"arm-nextvp…

北斗位置服务管理平台

平台简介 一直想做一款后台管理系统&#xff0c;同时可以管理人&#xff0c;车&#xff0c;物品&#xff0c;猫&#xff0c;狗&#xff0c;牛羊等一切可以移动的室外事物进行集中化管理&#xff0c;最初的需求聚焦——谁在哪儿&#xff01; 系统框架是基于当前最常用的RuoYi框架…

68页 | 2024体育赛事网络安全保障实践蓝皮书(免费下载)

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;

短剧片源火爆,千金难求好剧源

前言 在当今快节奏的生活中&#xff0c;短剧以其精悍的篇幅、吸睛的剧情和便捷的观看方式&#xff0c;异军突起&#xff0c;吸引了大量观众的关注和喜爱。这些短剧不仅让人们在忙碌的间隙轻松娱乐&#xff0c;更以其高潮迭起的情节设计&#xff0c;让观众在短时间内便能体验到…

“百变换装师”之证照之星

拍证件照是一件很麻烦的事吗&#xff1f;证件照编辑是一件复杂的事吗&#xff1f;只有专业人员才能对证件照进行编辑吗&#xff1f;以前可能是&#xff0c;但今天小编将给大家分享一个证件照编辑软件证照之星&#xff0c;它将使每一个人都能具备简单的证件照编辑技能。 证照之星…

Failed to start gdm.servide - GNOME Display manager

启动虚拟机时&#xff0c;卡在Failed to start gdm.servide - GNOME Display manager不动。 解决方法: 1.重新启动Ubuntu&#xff0c;在进度条未结束之前&#xff0c;长按shift直到界面跳转到选项菜单。 2.选择第二个&#xff0c;按enter进入 3.选择最新版本&#xff08;后面…

使用charles做域名代理

目的&#xff1a;访问http://abcdefg:8099/时&#xff0c;指向本地http://localhost:8090/ 1、tools > Map Remote 2、tools > Rewrite 3、help > SSL Proxying > Install Charles Root Certificate 全部信任

基于Ascend C的FlashAttention算子性能优化最佳实践

LLM的Attention部分处理给计算系统带来巨大的计算和访存压力。业界先后出现FlashAttention、FlashAttention2等算法&#xff0c;通过计算等价和切分有效降低HBM数据访问量。 昇腾异构计算架构CANN针对昇腾AI处理器的片上内存和缓存大小&#xff0c;以及数据搬运通路&#xff0…

xLua(一) 环境安装笔记

为了方便查阅记录一下xLua的安装地址及方法 1.登录地址下载: https://github.com/Tencent/xLua 2.解压文件 将文件中的这些内容拷贝到项目中的Asset文件夹中 注意 : 工程项目路径不得含有中文 3.将Tools复制到Asset同级目录下 4.导入后会发现有Bug,需要导入工程 5.还有另…

AI科普 | 什么是人工智能的本质?

我们将以科普的角度深入探讨AI的本质&#xff0c;揭示其内在的基本逻辑。 我希望能够为读者提供一个简单清晰的认识&#xff0c;所以我摒弃晦涩的专用名词&#xff0c;用大白话的方式让小白也能轻松看懂&#xff0c;让大家更加了解这位改变世界的“魔法师”。 通过这篇文章&a…

Fyndiq买家号下单:自养号测评如何打造本土物理环境系统?

Fyndiq 是一个瑞典电子商务平台&#xff0c;我们通过该平台为渴望讨价还价的购物者提供一系列产品。该公司为希望以可访问的方式提高销售额的所有类型的零售商提供销售渠道。Fyndiq几乎是瑞典家喻户晓的存在&#xff0c;是瑞典折扣促销平台。以销售质优价廉的商品吸引了大量忠实…

14年后 苹果终于推出iPad原生计算器应用

迄今为止&#xff0c;在WWDC 2024大会上&#xff0c;新增的计算器应用获得了最热烈的掌声。iOS 官方计算器应用程序终于要登陆大屏幕了。该功能利用额外的屏幕空间带来了公司无法在 iPhone 上实现的新功能。其中最大的亮点是新增了"数学笔记"功能。新增的功能可以帮你…

迈向『闭环』| PlanAgent:基于MLLM的自动驾驶闭环规划新SOTA!

中科院自动化所深度强化学习团队联合理想汽车等提出了一种新的基于多模态大语言模型MLLM的自动驾驶闭环规划框架—PlanAgent。该方法以场景的鸟瞰图和基于图的文本提示为输入&#xff0c;利用多模态大语言模型的多模态理解和常识推理能力&#xff0c;进行从场景理解到横向和纵向…

黑豹程序员 堆和栈

简单变量及作用域 main()   int x1; show ()   int x2 执行步骤&#xff1a; 第1步&#xff1a;main()函数是程序入口&#xff0c;JVM先执行&#xff0c;在栈内存中开辟一个空间&#xff0c;存放int类型变量x&#xff0c;同时附值1。 第2步&#xff1a;JVM执行show()函…

轻兔推荐 —— Snipaste

via&#xff1a;轻兔推荐 - https://app.lighttools.net/ 简介 Snipaste 是一个简单但强大的截图工具&#xff0c;支持Windows和Mac&#xff0c;允许用户快速截图并进行编辑&#xff0c;如添加标注、文字和马赛克。 - 它还具有贴图功能&#xff0c;可以将截图或剪贴板内容固定…