flutter使用getx实现路由跳转,页面没有执行dispose

我们看一下flutter的StatefulWidget组件的生命周期:

createState:

当一个StatefulWidget插入到渲染树结构、或者从渲染树结构移除时,都会调用StatefulWidget.createState方法,从而达到更新UI的效果;

initState:

initState是StatefulWidget创建后调用的第一个方法,而且只执行一次。在执行initState时,View没有渲染,但是StatefulWidget 已经被加载到渲染树里了;

didChangeDependencies:

didChangeDependencies会在initState后立即调用,当StatefulWidget依赖的InheritedWidget发生变化之后,didChangeDependencies会调用,所以didChangeDependencies可以调用多次;

build:

build方法会在didChangeDeoendencies之后立即调用,在之后setState()刷新时,会重新调用build绘制页面,所以build方法可以调用多次。一般不在build中创建除了创建Widget的方法,否则会影响渲染效率。

setState:

State\] 对象可以通过调用它们的 \[setState\]方法自发地请求重建其子树,这表明它们的某些内部状态已经改变,可能会影响该子树中的用户界面,setState方法会被多次调用。 didUpdateWidget: 1、当调用setState更新UI的时候,都会调用didUpdateWidget; 2、框架在调用\[didUpdateWidget\]之后总是调用\[build\],在\[didUpdateWidget\]中对\[setState\]的任何调用都是多余的。 deactivate: 1、当框架从树中移除此 State 对象时将会调用此方法; 2、在某些情况下,框架将重新插入State 对象到树的其他位置(例如,如果包含该树的子树State 对象从树中的一个位置移植到另一位置),框架将会调用 build 方法来提供 State 对象适应其在树中的新位置。 dispose: 当框架从树中永久移除此 State对象时将会调用此方法,与deactivate的区别是,deactivate 还可以重新插入到树中,而 dispose 表示此 State对象永远不会在 build。调用完 dispose后,mounted 属性被设置为false,也代表组件生命周期的结束,此时再调用setState方法将会抛出异常。子类重写此方法,释放相关资源,比如动画等。 ### 路由跳转时的`initState`,`deactivate`,`dispose` 我们的有状态组件生命周期原本是这么写的: ```Dart @override void initState() { super.initState(); print('------initstate--------'); } void deactivate() { super.deactivate(); print('-----deactivate----'); } void dispose() { super.dispose(); print('----dispose--------'); } ``` > 当我们通过pushNamed(Get.toNamed)跳转到其他路由,发现deactivate触发了,但是dispose并没有触发,并且再次通过pushNamed回到本页的时候,initstate也并没有再次执行。 写多了Vue单页面应用的同学,应该知道这其实很让人困扰。我们很多时候需要像Vue一样,在created的时候初始化数据,在beforeDestroy的时候移除页面一些监听事件或者销毁定时器,防止内存泄露。 让我们回到生命周期说明那里: deactivate() 当 State 被暂时从视图树中移除时,会调用这个函数。 dispose()当 State 被永久的从视图树中移除,Framework 会调用该函数。 此时是不是恍然大悟!pushNamed(Get.toNamed)只是暂时把视图移除了,并没有彻底移除,所以导致了一些奇怪的问题(前提是你跟我一样,业务上需要控制页面的初始化和销毁) 那怎么办。此时popAndPushNamed(Get.offAndToNamed)闪亮登场!用它替代pushNamed(Get.toNamed),你就会发现该触发的事件都触发了\~ popAndPushNamed(Get.offAndToNamed)将当前路由弹出并跳转到新的路由,彻底移除旧路由。还有类似的方法pushReplacementNamed,pushNamedAndRemoveUntil等 ![](https://file.jishuzhan.net/article/1762832562746560514/abd77e5791ea34e36ac4cc1b3b4b2cb7.webp)

相关推荐
程序员老刘2 小时前
Kotlin vs Dart:当“优雅”变成心智负担,我选择了更简单的 Dart
flutter·kotlin·dart
徐安安ye2 小时前
Flutter 车载系统开发:打造符合 Automotive Grade Linux 标准的 HMI 应用
linux·flutter·车载系统
恋猫de小郭4 小时前
2025 年终醒悟,AI 让我误以为自己很强,未来程序员的转型之路
android·前端·flutter
_大学牲4 小时前
Flutter 勇闯2D像素游戏之路(五):像元气骑士一样的设计随机地牢
flutter·游戏·游戏开发
音浪豆豆_Rachel7 小时前
Flutter鸿蒙化之深入解析Pigeon非空字段设计:non_null_fields.dart全解
flutter·harmonyos
Zender Han7 小时前
Flutter 图片裁剪插件 image_cropper 最新版介绍与使用教程
android·flutter·ios
子榆.8 小时前
Flutter 与开源鸿蒙(OpenHarmony)实时音视频通话实战:基于 AVSession 与 Native 音视频栈构建安全通信应用
flutter·开源·harmonyos
xianjixiance_8 小时前
Flutter跨平台向量数学库vector_math鸿蒙化使用指南
flutter·华为·harmonyos
消失的旧时光-19439 小时前
从命令式跳转到声明式路由:前端、Android、Flutter 的一次统一演进
android·前端·flutter·状态模式
xianjixiance_9 小时前
Flutter跨平台UUID生成工具uuid_test鸿蒙化使用指南
flutter·elasticsearch·harmonyos