概述

#

已為一些可處置物件添加了缺失的 '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 中檢視進度和狀態。