在 Flutter 中为一些可释放对象补充了缺失的 `dispose()`
概述
#为一些可释放对象补充了缺失的 'dispose()' 调用。例如,ContextMenuController 未释放 OverlayEntry,EditableTextState 未释放 TextSelectionOverlay。
如果其他代码也为该对象调用了 'dispose()',并且该对象受到双重释放保护,则第二次 'dispose()' 会因以下错误消息而失败
一旦您对 <class name> 调用了 dispose(),它就无法再使用了。
背景
#惯例是对象的所有者应该释放它。
此惯例在某些地方被打破:所有者没有释放可释放对象。通过添加对 dispose()
的调用修复了此问题。但是,如果对象受到双重释放保护,则在调试模式下运行并且 dispose()
在其他地方被调用时,这可能会导致失败。
迁移指南
#如果您遇到以下错误,请更新您的代码,仅在您的代码创建了对象的情况下才调用 dispose()
。
Once you have called dispose() on a <class name>, it can no longer be used.
迁移前的代码
dart
x.dispose();
迁移后的代码
dart
if (xIsCreatedByMe) {
x.dispose();
}
要定位不正确的释放,请检查错误的调用堆栈。如果调用堆栈指向您代码中的 dispose
,则此释放不正确,应进行修复。
如果错误发生在 Flutter 代码中,则第一次调用 dispose()
不正确。
您可以通过在失败的 dispose
方法体中临时调用 print(StackTrace.current)
来定位不正确的调用。
时间线
#查看进度和状态 在跟踪问题中。