当前位置: 首页 > news >正文

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, //自定义数据,记录当前的controlleronDispose: () {//此处获取到dispose时机_ctrl.dispose();},onDidUpdateWidget:(DisposeDetector<SizedBox, Page2Controller> oldWidget) {//此处获取到控价刷新时机if (oldWidget.tag != _ctrl)//如果刷新控件时controller改变了,则销毁旧controller{oldWidget.tag!.dispose();}},child: const SizedBox(),);}
}

总结

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

相关文章:

  • 图像处理:Python使用OpenCV进行图像锐化 (非锐化掩模、拉普拉斯滤波器)
  • R调用Taxonkit展示系统发育信息
  • c++_0基础_讲解7 练习
  • C++中的中介者模式
  • 2.linux下的文件系统结构、磁盘管理以及常规操作
  • Excel中多条件判断公式怎么写?
  • Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)
  • Ubuntu安装部署
  • [渗透测试学习] Runner-HackTheBox
  • 【Netty】ByteBuffer原理与使用
  • Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
  • C/C++ Adaline自适应线性神经网络算法详解及源码
  • 自学前端第一天
  • Android14音频进阶之CarAudioManager::getOutputDeviceForUsage流程分析(七十七)
  • Mybatis做批量操作
  • __proto__ 和 prototype的关系
  • Druid 在有赞的实践
  • IndexedDB
  • Java读取Properties文件的六种方法
  • Java-详解HashMap
  • MYSQL 的 IF 函数
  • oldjun 检测网站的经验
  • React as a UI Runtime(五、列表)
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Spring Boot MyBatis配置多种数据库
  • Vue ES6 Jade Scss Webpack Gulp
  • webpack入门学习手记(二)
  • web标准化(下)
  • zookeeper系列(七)实战分布式命名服务
  • 产品三维模型在线预览
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 讲清楚之javascript作用域
  • 聊聊redis的数据结构的应用
  • 入手阿里云新服务器的部署NODE
  • 使用putty远程连接linux
  • 算法-插入排序
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • %@ page import=%的用法
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (篇九)MySQL常用内置函数
  • (十八)三元表达式和列表解析
  • (十六)Flask之蓝图
  • (十六)串口UART
  • (四)React组件、useState、组件样式
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net Web窗口页属性