为什么我们在 dart 代码中使用 dispose() 方法?

Shr*_*rma 32 dart flutter

我们为什么要使用dispose()方法?我对此有点困惑。如果我们不使用它会出现什么问题,使用它有什么好处?

@override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }
Run Code Online (Sandbox Code Playgroud)

Vir*_*iya 29

dispose方法用于在移除状态对象时释放分配给变量的内存。

例如,如果您在应用程序中使用流,则必须释放分配给 streamController 的内存。否则,您的应用可能会从 Playstore 和 Appstore 收到有关内存泄漏的警告。

  • 恕我直言,这个答案令人困惑。Dart 是一种垃圾收集语言,这通常意味着不需要手动释放内存。与手动内存管理相比,您不必在“dispose”中释放字符串的内存。我认为只有当某些东西阻止引用计数达到零时才需要一个不平凡的“dispose”,这是感知内存泄漏的真正原因。我仍然不清楚具体在什么情况下会发生这种情况。 (12认同)
  • 内存泄漏是一种资源泄漏,当计算机程序错误地管理内存分配,导致不再需要的内存未被释放时,就会发生这种情况。 (7认同)
  • 内存泄漏可能会导致内存不足错误,在最好的情况下,1)您的应用程序将被操作系统意外终止,并带来糟糕的用户体验。在最坏的情况下,2)它还可能导致整个系统性能不佳,因为您的应用程序正在慢慢“吃掉”所有可用内存,而操作系统必须处理如此大量的虚拟内存,因此必须不断地页面以使您的程序满意,同时保持一切正常运行。长话短说 -> 您的整个系统变得马虎且反应迟钝。 (2认同)

Kal*_*ani 8

主要目的是获得一个回调,您可以在其中释放所有资源。

如果您已初始化状态中的任何资源,则在处理该状态时关闭或销毁该资源非常重要。

例如:如果您在 initState 中创建流StatefullWidget,那么在dispose该状态的方法中关闭该流很重要,否则会导致内存泄漏。

欲了解更多详细信息,您可以参考以下意见这是我从源代码得到dispose的方法StatefulWidget

当此对象从树中永久移除时调用。当此 [State] 对象永远不会再次构建时,框架会调用此方法。框架调用[dispose]后,[State]对象被认为是unmounted,[mounted]属性为false。此时调用 [setState] 是错误的。生命周期的这个阶段是终端:没有办法重新挂载已经被释放的 [State] 对象。子类应覆盖此方法以释放此对象保留的任何资源(例如,停止任何活动动画)。{@macro flutter.widgets.subscriptions} 如果您覆盖它,请确保以调用 super.dispose() 结束您的方法。另请参阅:* [deactivate],在 [dispose] 之​​前调用。

或者你可以参考文档:https : //api.flutter.dev/flutter/widgets/State/dispose.html

所以基本上 dispose 在当前状态不会被再次使用时被调用。因此,如果您有任何处于该状态的活动侦听器,那么它们可能会导致内存泄漏,因此您应该关闭它们。


Par*_*tel 7

dispose() 如果未定义,则从有状态自动调用方法。

在某些情况下处置需要例如CameraPreviewTimer等等。你必须关闭流。

当需要关闭流时,您必须在 dispose 方法中使用它。

dispose()用于在释放屏幕时执行代码。相当于onDestroy()安卓的。

例子:

@override
void dispose() {
  cameraController?.dispose();
  timer.cancel();
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*har 6

嗯,答案就在“处置”这个词中。想象一下你在一个聚会上,有一张桌子,上面放着水杯,这些水杯是塑料杯。现在您将得到一个玻璃杯,使用它并处理(将其扔进垃圾箱)。如果你不这样做,你将同一个玻璃杯放在桌子上,那么就没有地方可以放置其他新玻璃杯(内存错误)。因为现在桌子已经满了。第二件事是,如果你把一个玻璃杯放在桌子上,可能会剩下一些饮料。所以如果其他人使用那个玻璃杯,那么里面已经有东西了。(如果您不在同一屏幕上处理相同的表单或动画控制器,则控制器已经具有一些价值)。

快乐的场景:-所有人都拿起饮料杯并将它们扔进垃圾箱,这样所有桌子也会有空间,每个人都会得到新饮料,而不是某人的旧饮料。

实用的地方我了解了准确的用法-我制作了一个需要内联编辑的屏幕,这意味着您单击按钮将所有文本转换为文本表单字段,然后更改所需的值,然后再次按该按钮提交(相同的图标更改)编辑按钮),

因此,“处置”一词暴露了有关其使用的所有信息,我希望这个现实生活中的示例能有所帮助。谢谢

  void dispose() {
    super.dispose();
    _editButtonAnimationController.dispose();
    _ageController.dispose();
  }
Run Code Online (Sandbox Code Playgroud)


小智 5

当该对象从树中永久删除时,将调用 dispose() 方法。

更多信息可以参考官方文档:https ://api.flutter.dev/flutter/widgets/State/dispose.html

实施例:

@protected
@mustCallSuper
void dispose() {
  assert(_debugLifecycleState == _StateLifecycle.ready);
  assert(() {
    _debugLifecycleState = _StateLifecycle.defunct;
    return true;
  }());
}

Run Code Online (Sandbox Code Playgroud)


Har*_*shi 5

一般来说,dispose意味着在相关对象从焦点中移除之前释放资源。我所说的焦点,是指从widget treenavigation stack相关的。

当您在 a 上调​​用 dispose 时widget state,关联的小部件应该是unmounted,这意味着该小部件永远不会重建。

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

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

框架调用 dispose 后,State 对象被认为已卸载,mounted 属性为 false。此时调用setState是错误的。

生命周期的这个阶段是终结阶段:无法重新挂载已释放的 State 对象。

当您对 a 调用 dispose 时bloc,该块应该关闭eventandstate流。 更新: New Bloc 没有dispose,而是有close

所以,这dispose基本上就是这个意思。

TL;DR 一般来说,这意味着释放关联实例/对象所持有的资源。

然而,的具体含义dispose随着调用该方法的对象的类型而变化。