为什么我们要使用dispose()方法?我对此有点困惑。如果我们不使用它,会发生什么问题?使用它的好处是什么?
dispose()
@override void dispose() { // TODO: implement dispose super.dispose(); }
h4cxqtbf1#
dispose方法用于在状态对象被删除时释放分配给变量的内存。
例如,如果您在应用中使用流,则必须释放分配给流控制器的内存。否则,您的应用可能会从PlayStore和AppStore收到有关内存泄漏的警告。
9jyewag02#
dispose()方法如果未定义,则会自动从有状态调用。在某些情况下需要dispose,例如在CameraPreview、Timer等中。您必须关闭流。当需要关闭流时,必须在dispose方法中使用它。dispose()用于在屏幕释放时执行代码,相当于Android的onDestroy()。示例:
CameraPreview
Timer
onDestroy()
@override void dispose() { cameraController?.dispose(); timer.cancel(); super.dispose(); }
nqwrtyyt3#
如果您已初始化某个状态中的任何资源,则在处置该状态时关闭或销毁该资源是非常重要的。例如:如果你在StatefullWidget的initState中创建一个流,那么在该状态的dispose方法中关闭该流是很重要的,否则会导致内存泄漏。有关更多详细信息,您可以参考以下注解,这些注解来自StatefulWidget的dispose方法的源代码:当此对象从树中永久移除时调用。当此[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是在当前状态不再被使用时调用的,所以,如果你有任何监听器在那个状态下是活动的,那么它们可能会导致内存泄漏,所以你应该关闭它们。
StatefullWidget
dispose
StatefulWidget
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; }()); }
hzbexzde5#
一般来说,dispose意味着在相关对象从焦点中移除之前释放资源。当您在widget state上调用dispose时,关联的小部件应该是unmounted,这意味着小部件将永远不会重建。当从树中永久移除此对象时调用。当这个State对象永远不会再次建置时,架构会呼叫这个方法。框架调用dispose后,State对象被视为未装入,mounted属性为false。此时调用setState是错误的。生命周期的这一阶段是最终阶段:无法重新装入已释放的State对象。当您在bloc上呼叫dispose时,区块应该会关闭event和state数据流。**更新:**新区块没有dispose,而是有close。这就是dispose的基本含义。
widget state
unmounted
bloc
event
state
close
TL;DR通常,它表示释放关联示例/对象所占用的资源。
然而,dispose的特定意义会随着呼叫这个方法的对象型别而变更。
gwbalxhn6#
好吧,答案就在dispose of这个词里。想象一下你在一个聚会上,有一张table,上面放着几杯水,都是塑料杯。现在你会得到一个杯子,用它来处理掉(把它扔进垃圾箱)。如果你不这样做,你把同样的玻璃杯放在table上,那么就没有地方放其他新的玻璃杯(记忆错误)。因为table现在满了。第二件事是如果你把一个杯子放在table上,可能会有一些饮料剩下。所以如果别人用那个杯子,那么里面已经有东西了。(如果不释放同一屏幕上的同一窗体或动画控制器,则控制器已经具有某些值)。快乐的场景:-所有人都拿着饮料杯,把它们扔到垃圾箱里,这样所有的table也会得到空间,每个人都会得到新的饮料,而不是某人的旧饮料。实用的地方,我得到了知道准确的使用-我做了一个屏幕,其中需要内联编辑意味着你点击按钮所有文本转换为文本形式字段,你改变所需的值,并按下该按钮再次提交(图标改变相同的按钮上编辑),所以dispose这个词暴露了它的所有用法,我希望这个现实生活中的例子能帮上一点忙。谢谢
void dispose() { super.dispose(); _editButtonAnimationController.dispose(); _ageController.dispose(); }
xmq68pz97#
您不仅应该重写dispose方法以释放一些内存,还应该处理那些在屏幕上可见的对象,如BannerAd。比如说,你有一个BannerAd,如果你不处理这个bannerAd的示例并返回到上一页,你的广告仍然会出现在屏幕上,这是你不想看到的。所以,你必须这样处理它:
BannerAd
bannerAd
@override void dispose() { bannerAd?.dispose(); super.dispose(); }
nafvub8i8#
考虑到上面关于垃圾收集的所有答案以及在dispose()中放置什么的示例,似乎总的想法是处置/取消任何有未来或与硬件访问绑定的东西,因为您不想返回到不存在的对象或阻止其他应用使用该资源(例如相机、文件系统、麦克风等)。
but5z9lq9#
我们使用dispose()方法,以便在从部件树中删除状态对象时停止/避免内存链接。
9条答案
按热度按时间h4cxqtbf1#
dispose方法用于在状态对象被删除时释放分配给变量的内存。
例如,如果您在应用中使用流,则必须释放分配给流控制器的内存。否则,您的应用可能会从PlayStore和AppStore收到有关内存泄漏的警告。
9jyewag02#
dispose()
方法如果未定义,则会自动从有状态调用。在某些情况下需要dispose,例如在
CameraPreview
、Timer
等中。您必须关闭流。当需要关闭流时,必须在dispose方法中使用它。
dispose()
用于在屏幕释放时执行代码,相当于Android的onDestroy()
。示例:
nqwrtyyt3#
如果您已初始化某个状态中的任何资源,则在处置该状态时关闭或销毁该资源是非常重要的。
例如:如果你在
StatefullWidget
的initState中创建一个流,那么在该状态的dispose
方法中关闭该流是很重要的,否则会导致内存泄漏。有关更多详细信息,您可以参考以下注解,这些注解来自
StatefulWidget
的dispose
方法的源代码:当此对象从树中永久移除时调用。当此[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是在当前状态不再被使用时调用的,所以,如果你有任何监听器在那个状态下是活动的,那么它们可能会导致内存泄漏,所以你应该关闭它们。
jw5wzhpr4#
dispose()方法在此对象从树中永久删除时被调用。
更多信息,请参考官方文件:https://api.flutter.dev/flutter/widgets/State/dispose.html
实施示例:
hzbexzde5#
一般来说,
dispose
意味着在相关对象从焦点中移除之前释放资源。当您在
widget state
上调用dispose时,关联的小部件应该是unmounted
,这意味着小部件将永远不会重建。当从树中永久移除此对象时调用。
当这个State对象永远不会再次建置时,架构会呼叫这个方法。
框架调用dispose后,State对象被视为未装入,mounted属性为false。此时调用setState是错误的。
生命周期的这一阶段是最终阶段:无法重新装入已释放的State对象。
当您在
bloc
上呼叫dispose时,区块应该会关闭event
和state
数据流。**更新:**新区块没有dispose
,而是有close
。这就是
dispose
的基本含义。TL;DR通常,它表示释放关联示例/对象所占用的资源。
然而,
dispose
的特定意义会随着呼叫这个方法的对象型别而变更。gwbalxhn6#
好吧,答案就在dispose of这个词里。想象一下你在一个聚会上,有一张table,上面放着几杯水,都是塑料杯。现在你会得到一个杯子,用它来处理掉(把它扔进垃圾箱)。如果你不这样做,你把同样的玻璃杯放在table上,那么就没有地方放其他新的玻璃杯(记忆错误)。因为table现在满了。第二件事是如果你把一个杯子放在table上,可能会有一些饮料剩下。所以如果别人用那个杯子,那么里面已经有东西了。(如果不释放同一屏幕上的同一窗体或动画控制器,则控制器已经具有某些值)。
快乐的场景:-所有人都拿着饮料杯,把它们扔到垃圾箱里,这样所有的table也会得到空间,每个人都会得到新的饮料,而不是某人的旧饮料。
实用的地方,我得到了知道准确的使用-我做了一个屏幕,其中需要内联编辑意味着你点击按钮所有文本转换为文本形式字段,你改变所需的值,并按下该按钮再次提交(图标改变相同的按钮上编辑),
所以dispose这个词暴露了它的所有用法,我希望这个现实生活中的例子能帮上一点忙。谢谢
xmq68pz97#
您不仅应该重写
dispose
方法以释放一些内存,还应该处理那些在屏幕上可见的对象,如BannerAd
。比如说,你有一个
BannerAd
,如果你不处理这个bannerAd
的示例并返回到上一页,你的广告仍然会出现在屏幕上,这是你不想看到的。所以,你必须这样处理它:nafvub8i8#
考虑到上面关于垃圾收集的所有答案以及在dispose()中放置什么的示例,似乎总的想法是处置/取消任何有未来或与硬件访问绑定的东西,因为您不想返回到不存在的对象或阻止其他应用使用该资源(例如相机、文件系统、麦克风等)。
but5z9lq9#
我们使用
dispose()
方法,以便在从部件树中删除状态对象时停止/避免内存链接。