我们为什么使用dispose()
方法?我对此不太困惑。
如果我们不使用它,会发生什么问题?使用它的好处是什么?
@override
void dispose() {
// TODO: implement dispose
super.dispose();
}
答案 0 :(得分:6)
dispose 方法用于在删除状态对象时释放分配给变量的内存。
例如,如果您在应用程序中使用流,则必须释放分配给streamController的内存。否则,您的应用可能会从playstore和appstore收到有关内存泄漏的警告。
答案 1 :(得分:4)
主要目的是获得一个回调,您可以在其中释放所有资源。
如果您已初始化某个状态中的任何资源,那么在处置该状态时关闭或销毁该资源非常重要。
例如:如果要在StatefullWidget
的initState中创建流,那么以该状态的dispose
方法关闭该流很重要,否则会导致内存泄漏。 / p>
有关更多详细信息,您可以参考以下我从dispose
的{{1}}方法的源代码获得的注释:
从树中永久删除该对象时调用。的 当此[State]对象永不构建时,框架将调用此方法 再次。框架调用[dispose]之后,[State]对象为 认为已卸载,并且[mount]属性为false。它是一个 此时调用[setState]的错误。生命周期的这一阶段是 终端:无法重新挂载已经被挂载的[State]对象 处置。子类应重写此方法以释放任何 此对象保留的资源(例如,停止任何活动的动画)。 {@macro flutter.widgets.subscriptions}如果您覆盖此设置,请确保 以调用super.dispose()结束您的方法。也可以看看: * [停用],它在[处置]之前被调用。
或者您可以参考文档:https://api.flutter.dev/flutter/widgets/State/dispose.html
因此,当该当前状态将不再使用时,基本上调用dispose。因此,如果您有处于该状态的处于活动状态的侦听器,则它们可能会导致内存泄漏,因此您应该关闭它们。
答案 2 :(得分:3)
dispose()
方法(如果未定义)从有状态自动调用。
在某些情况下,例如在CameraPreview
,Timer
等中需要进行处置。您必须关闭流。
需要关闭流时,必须在dispose方法中使用它。
dispose()
用于在放置屏幕时执行代码。等于Android的onDestroy()
。
示例:
@override
void dispose() {
cameraController?.dispose();
timer.cancel();
super.dispose();
}
答案 3 :(得分:3)
dispose()方法。
有关更多信息,您可以参考官方文档:https://api.flutter.dev/flutter/widgets/State/dispose.html
实施示例:
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
答案 4 :(得分:1)
一般而言,dispose
意味着在将相关对象从焦点移出之前释放资源。重点是指widget tree
或navigation stack
中相关的那个。
当您在widget state
上调用dispose时,关联的小部件应该为unmounted
,这意味着该小部件将永远无法重建。
从树中永久删除该对象时调用。
当此State对象不再建立时,框架将调用此方法。
在框架调用处理之后,将State对象视为已卸载并已安装 属性为假。此时调用setState是错误的。
生命周期的这一阶段已经结束:无法重新挂载已经 处置。
当您在bloc
上调用dispose时,该块应该关闭event
和state
流。
更新:新集团没有dispose
,而是close
。
所以,这就是dispose
的基本含义。
TL; DR 通常,这意味着释放关联的实例/对象所拥有的资源。
dispose
的具体含义随调用此方法的对象的类型而变化。
答案 5 :(得分:0)
您不仅应该重写 dispose
方法以释放一些内存,而且还应该处理那些在屏幕上可见的对象,如 BannerAd
。
假设您有一个 BannerAd
并且您没有处理 bannerAd
的实例并导航回上一页,您的广告仍然会出现在您不希望的屏幕上.所以,你必须像这样处理它:
@override
void dispose() {
bannerAd?.dispose();
super.dispose();
}