做网站怎么制作,wordpress智能表单,网站开发前台代码和后台代码,有没有专业做盐的网站文章目录 前言一、什么是dispose探测控件#xff1f;1、通常情况2、使用dispose探测控件 二、如何实现1、继承StatefulWidget2、定义dipose回调3、定义child4、重载Dispose方法5、build child 三、完整代码四、使用示例1、基本用法2、设置定义数据 总结 前言
开发flutter一般… 文章目录 前言一、什么是dispose探测控件1、通常情况2、使用dispose探测控件 二、如何实现1、继承StatefulWidget2、定义dipose回调3、定义child4、重载Dispose方法5、build child 三、完整代码四、使用示例1、基本用法2、设置定义数据 总结 前言
开发flutter一般会用状态管理工具用了状态管理后大部分控件都会是StatelessWidgetStatefulWidget有dispose重载获取控件销毁时机但StatelessWidget则没有此时我们要获取控件销毁的时机就需要另寻他法了。 一、什么是dispose探测控件
这是一个控件用于帮助探测无状态控件的销毁时机有点类似visibility_detector用于探测控件的显示和隐藏。
1、通常情况
通常情况下想要知道一个页面是否销毁或切换了需要通过StatefulWidget的dispose方法获取。代码如下
class Page extends StatefulWidget {const Page({super.key,});override_Page createState() _Page();
}class _PageT extends Widget, S extends StatePage {overridevoid dispose() {super.dispose();//此处获取到dispose时机}overridevoid didUpdateWidget(covariant Page oldWidget) {super.didUpdateWidget(oldWidget);//此处获取到控价刷新时机}overrideWidget build(BuildContext context) {return const SizedBox();}
}2、使用dispose探测控件
在使用使用状态管理的情况下通常都是StatelessWidget页面将其改成StatefulWidget分成两个类显然是麻烦的。如果有了DisposeDetectordispose探测控件作为一个控件放入StatelessWidget页面中就可以直接获取到dispose时机了。
class Page2 extends StatelessWidget {const Page2({super.key,});overrideWidget build(BuildContext context) {return DisposeDetector(child: const SizedBox(),onDispose: () {//此处获取到dispose时机},onDidUpdateWidget: (DisposeDetectorSizedBox, 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 DisposeDetectorT extends Widget, S extends StatefulWidget {final Function onDispose;final Function(DisposeDetectorT, S oldWidget) onDidUpdateWidget;final T child;final S? tag; //自定义数据const DisposeDetector({super.key, required this.child,required this.onDispose,required this.onDidUpdateWidget,this.tag,});override_DisposeDetectorT, S createState() _DisposeDetectorT, S();
}class _DisposeDetectorT extends Widget, S extends StateDisposeDetectorT, Swith TickerProviderStateMixin {overridevoid dispose() {super.dispose();widget.onDispose();}overridevoid didUpdateWidget(covariant DisposeDetectorT, S oldWidget) {super.didUpdateWidget(oldWidget);widget.onDidUpdateWidget(oldWidget);}overrideWidget build(BuildContext context) {return widget.child;}
}四、使用示例
1、基本用法
class Page2 extends StatelessWidget {const Page2({super.key,});overrideWidget build(BuildContext context) {return DisposeDetector(child: const SizedBox(),onDispose: () {//此处获取到dispose时机},onDidUpdateWidget: (DisposeDetectorSizedBox, dynamic oldWidget) {//此处获取到控价刷新时机},);}
}2、设置定义数据
class Page2Controller {void dispose() {//销毁逻辑}
}class Page2 extends StatelessWidget {final _ctrl Page2Controller();Page2({super.key,});overrideWidget build(BuildContext context) {return DisposeDetector(tag: _ctrl, //自定义数据记录当前的controlleronDispose: () {//此处获取到dispose时机_ctrl.dispose();},onDidUpdateWidget:(DisposeDetectorSizedBox, Page2Controller oldWidget) {//此处获取到控价刷新时机if (oldWidget.tag ! _ctrl)//如果刷新控件时controller改变了则销毁旧controller{oldWidget.tag!.dispose();}},child: const SizedBox(),);}
}总结
以上就是今天要讲的内容本文提供的控件是比较有用的尤其是业务逻辑有数据释放的需求比如播放器之类的控件销毁后需要结束播放将播放资源销毁如果是用StatelessWidget则没办法实现用StatefulWidget又会使得页面实现变得麻烦或者复杂最好的方法则是使用本文提供的dispose探测控件。