为 Flutter 中的一些可处置对象添加了缺失的 `dispose()`
概述
#已为一些可处置对象添加了缺失的 'dispose()' 调用。例如,ContextMenuController 未处置 OverlayEntry,EditableTextState 未处置 TextSelectionOverlay。
如果其他代码也调用了对象的 'dispose()',并且该对象已防止二次处置,则第二次 'dispose()' 调用将因以下错误消息而失败:
一旦你对 <class name> 调用了 dispose(),它将无法再被使用。
背景
#约定是对象的拥有者应该处置它。
这一约定在某些地方被打破了:拥有者没有处置可处置对象。通过添加 `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)` 来定位不正确的调用。
时间线
#在 跟踪 issue 中查看进度和状态。