當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Dart Finalizer用法及代碼示例

dart:core 庫中Finalizer 類的用法介紹如下。

可以附加到 Dart 對象的終結器。

終結器可以在終結器和任意數量的 Dart 值之間創建附件,方法是使用該值調用 attach 以及作為附件一部分的 finalization token 和可選的 attach key

當程序無法訪問 Dart 值時,任何當前具有值 may 的附件的終結器都會使用附件的終結令牌調用其回調函數。

例子:

// Keep the finalizer itself reachable, otherwise might not do anything.
final Finalizer<DBConnection> _finalizer = Finalizer((connection) {
  connection.close();
});

/// Access the database.
Database connect() {
  // Wraps the connection in a nicer user-facing API,
  // *and* closes connection if the user forgets to.
  var connection = _connectToDatabase();
  var wrapper = Database._fromConnection(connection, _finalizer);
  // Get finalizer callback when `wrapper` is no longer reachable.
  _finalizer.attach(wrapper, connection, detach: wrapper);
  return wrapper;
}

class Database {
  final DBConnection _connection;
  final Finalizer<Connection> _finalizer;
  Database._fromConnection(this._connection, this._finalizer);

  // Some useful methods.

  void close() {
    // User requested close.
    _connection.close();
    // Detach from finalizer, no longer needed.
    _finalizer.detach(this);
  }
}

這個例子有一個需要清理的外部資源的例子。當 API 的用戶不再有權訪問該連接時,終結器用於清理外部連接。該示例使用與附加對象相同的對象和分離鍵,當每個附加對象都可以單獨分離時,這是一種有用的方法。作為一個分離鍵並不能讓一個對象保持活力。

沒有承諾回調將被調用。唯一可以保證的是,如果使用特定的終結標記作為參數調用終結器的回調,那麽程序將無法再訪問具有該終結標記的終結器的至少一個附加值。

如果 finalzier itself 變得無法訪問,則允許對其進行垃圾收集,然後不會觸發任何進一步的回調。始終確保在需要時保持終結器本身可訪問。

如果多個終結器附加到單個對象,或者同一個終結器多次附加到一個對象,並且程序無法訪問該對象,則這些附件的任何數量(包括零)都可能觸發其關聯終結器的回調。不一定是全部或全部。

完成回調將作為 events 發生。它們不會在其他代碼執行期間發生,也不是作為微任務,而是作為類似於計時器事件的高級事件。

終結回調不能拋出。

注釋

@Since("2.17")

相關用法


注:本文由純淨天空篩選整理自dart.dev大神的英文原創作品 Finalizer<T> class。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。