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

eeq64g8w  于 2022-12-14  发布在  Flutter
关注(0)|答案(9)|浏览(505)

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

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

h4cxqtbf1#

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

例如,如果您在应用中使用流,则必须释放分配给流控制器的内存。否则,您的应用可能会从PlayStore和AppStore收到有关内存泄漏的警告。

9jyewag0

9jyewag02#

dispose()方法如果未定义,则会自动从有状态调用。
在某些情况下需要dispose,例如在CameraPreviewTimer等中。您必须关闭流。
当需要关闭流时,必须在dispose方法中使用它。
dispose()用于在屏幕释放时执行代码,相当于Android的onDestroy()
示例:

@override
void dispose() {
  cameraController?.dispose();
  timer.cancel();
  super.dispose();
}
nqwrtyyt

nqwrtyyt3#

  • 主要目的是获得回调,以便释放所有资源。*

如果您已初始化某个状态中的任何资源,则在处置该状态时关闭或销毁该资源是非常重要的。
例如:如果你在StatefullWidget的initState中创建一个流,那么在该状态的dispose方法中关闭该流是很重要的,否则会导致内存泄漏。
有关更多详细信息,您可以参考以下注解,这些注解来自StatefulWidgetdispose方法的源代码:
当此对象从树中永久移除时调用。当此[State]对象将不再生成时,框架将调用此方法。在框架调用[dispose]后,[State]对象将被视为未装入,并且[mounted]属性为false。此时调用[setState]是错误的。生命周期的此阶段是终结阶段:无法重新挂载已释放的[State]对象。子类应该覆盖此方法以释放此对象保留的所有资源(例如,停止任何活动动画)。{@macro flutter.widgets.subscriptions}如果覆盖此方法,请确保以super.dispose()调用结束方法。另请参阅:* [deactivate],它在[dispose]之前被调用。
或者您可以参考以下文档:https://api.flutter.dev/flutter/widgets/State/dispose.html
所以基本上,dispose是在当前状态不再被使用时调用的,所以,如果你有任何监听器在那个状态下是活动的,那么它们可能会导致内存泄漏,所以你应该关闭它们。

jw5wzhpr

jw5wzhpr4#

dispose()方法在此对象从树中永久删除时被调用。
更多信息,请参考官方文件:https://api.flutter.dev/flutter/widgets/State/dispose.html
实施示例:

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

hzbexzde5#

一般来说,dispose意味着在相关对象从焦点中移除之前释放资源。
当您在widget state上调用dispose时,关联的小部件应该是unmounted,这意味着小部件将永远不会重建。
当从树中永久移除此对象时调用。
当这个State对象永远不会再次建置时,架构会呼叫这个方法。
框架调用dispose后,State对象被视为未装入,mounted属性为false。此时调用setState是错误的。
生命周期的这一阶段是最终阶段:无法重新装入已释放的State对象。
当您在bloc上呼叫dispose时,区块应该会关闭eventstate数据流。**更新:**新区块没有dispose,而是有close
这就是dispose的基本含义。

TL;DR通常,它表示释放关联示例/对象所占用的资源。

然而,dispose的特定意义会随着呼叫这个方法的对象型别而变更。

gwbalxhn

gwbalxhn6#

好吧,答案就在dispose of这个词里。想象一下你在一个聚会上,有一张table,上面放着几杯水,都是塑料杯。现在你会得到一个杯子,用它来处理掉(把它扔进垃圾箱)。如果你不这样做,你把同样的玻璃杯放在table上,那么就没有地方放其他新的玻璃杯(记忆错误)。因为table现在满了。第二件事是如果你把一个杯子放在table上,可能会有一些饮料剩下。所以如果别人用那个杯子,那么里面已经有东西了。(如果不释放同一屏幕上的同一窗体或动画控制器,则控制器已经具有某些值)。
快乐的场景:-所有人都拿着饮料杯,把它们扔到垃圾箱里,这样所有的table也会得到空间,每个人都会得到新的饮料,而不是某人的旧饮料。
实用的地方,我得到了知道准确的使用-我做了一个屏幕,其中需要内联编辑意味着你点击按钮所有文本转换为文本形式字段,你改变所需的值,并按下该按钮再次提交(图标改变相同的按钮上编辑),
所以dispose这个词暴露了它的所有用法,我希望这个现实生活中的例子能帮上一点忙。谢谢

void dispose() {
    super.dispose();
    _editButtonAnimationController.dispose();
    _ageController.dispose();
  }
xmq68pz9

xmq68pz97#

您不仅应该重写dispose方法以释放一些内存,还应该处理那些在屏幕上可见的对象,如BannerAd
比如说,你有一个BannerAd,如果你不处理这个bannerAd的示例并返回到上一页,你的广告仍然会出现在屏幕上,这是你不想看到的。所以,你必须这样处理它:

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

nafvub8i8#

考虑到上面关于垃圾收集的所有答案以及在dispose()中放置什么的示例,似乎总的想法是处置/取消任何有未来或与硬件访问绑定的东西,因为您不想返回到不存在的对象或阻止其他应用使用该资源(例如相机、文件系统、麦克风等)。

but5z9lq

but5z9lq9#

我们使用dispose()方法,以便在从部件树中删除状态对象时停止/避免内存链接。

相关问题