为什么在飞镖代码中使用dispose()方法?

时间:2020-01-02 05:21:35

标签: flutter dart

我们为什么使用dispose()方法?我对此不太困惑。 如果我们不使用它,会发生什么问题?使用它的好处是什么?

@override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

6 个答案:

答案 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()方法(如果未定义)从有状态自动调用。

在某些情况下,例如在CameraPreviewTimer等中需要进行处置。您必须关闭流。

需要关闭流时,必须在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 treenavigation stack中相关的那个。

当您在widget state上调用dispose时,关联的小部件应该为unmounted,这意味着该小部件将永远无法重建。

从树中永久删除该对象时调用。

当此State对象不再建立时,框架将调用此方法。

在框架调用处理之后,将State对象视为已卸载并已安装 属性为假。此时调用setState是错误的。

生命周期的这一阶段已经结束:无法重新挂载已经 处置。

当您在bloc上调用dispose时,该块应该关闭eventstate流。 更新:新集团没有dispose,而是close

所以,这就是dispose的基本含义。

TL; DR 通常,这意味着释放关联的实例/对象所拥有的资源。

dispose的具体含义随调用此方法的对象的类型而变化。

答案 5 :(得分:0)

您不仅应该重写 dispose 方法以释放一些内存,而且还应该处理那些在屏幕上可见的对象,如 BannerAd

假设您有一个 BannerAd 并且您没有处理 bannerAd 的实例并导航回上一页,您的广告仍然会出现在您不希望的屏幕上.所以,你必须像这样处理它:

@override
void dispose() {
  bannerAd?.dispose();
  super.dispose();
}