在 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)
來找到不正確的呼叫。
時間軸
#請參閱追蹤問題中的進度和狀態。
除非另有說明,本網站上的文件反映了 Flutter 的最新穩定版本。頁面最後更新於 2024-04-04。 檢視原始碼 或 回報問題。