為 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 中檢視進度和狀態。