当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。