跳至主要內容

在 Flutter 中為某些可處置物件新增遺失的 `dispose()`

摘要

#

為某些可處置物件新增了遺失的 'dispose()' 呼叫。例如,ContextMenuController 沒有處置 OverlayEntry,而 EditableTextState 沒有處置 TextSelectionOverlay。

如果其他程式碼也對該物件調用 'dispose()',且該物件受到保護以防止重複處置,則第二次 '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) 來找到不正確的呼叫。

時間軸

#

請參閱追蹤問題中的進度和狀態。