如何在Dart中实现一次性模式?

问题描述 投票:0回答:2

我知道 C# 的一次性模式。

但是,我有点想知道它在 Dart 和 Flutter 中是如何实现和使用的。我看到它在 Flutter 中是这样使用的:

@override
void dispose() {
    // dispose own stuff here
    super.dispose();
}

现在这是我第一次想在没有小部件基类的类中自己实现它。在一些库中,我发现了一个 Disposable 基类和 dispose() 方法。

但是方法签名不同

@override
Future<Null> dispose() async {

}

在 C# 中,需要实现一个接口才能满足一次性模式。 Dart 是否存在这样的接口(基类)?或者只是每个人都实现了具有任意签名的 dispose 方法,而使用该类的人必须足够聪明才能找到该方法并弄清楚如何调用它?

flutter dart
2个回答
2
投票

没有任何方法在对象被“处置”时总是被调用。根据您使用的状态管理系统,处理方式有所不同。 我(个人)推荐带有

Provider
和/或
Bloc
的状态管理系统。在这里您可以使用例如当从部件树中删除
close
时,使用
Bloc
方法释放资源。 https://pub.dev/packages/provider
https://pub.dev/packages/flutter_bloc

其他状态管理系统: https://docs.flutter.dev/data-and-backend/state-mgmt/options

如果您只是使用

StatefulWidget
进行状态管理(不推荐),则可以使用
dispose
方法来释放资源。

编辑: 正如@RandalSchwartz 所说,我的答案并不完全正确。 Dart 中有一个 Finalizer 类,允许您在对象变得无法访问时将其释放。 然而,这不是 Flutter 中的最佳实践,不应该用作通用模式。


0
投票

这里有一个更具体的答案,因为人们可能不熟悉 C# IDisposable 模式。最重要的是,它与对象生命周期、可达性或终结器无关。

相反,它添加了一个语言功能来提供变量的范围使用,在该变量的末尾将调用 Dispose() -

using
语句。

using (var thing=new DisposableThing()) 
{
  thing.Use();
}

\\ thing has been disposed here

Dart 中没有直接的等效项。

在 flutter 中,当小部件从树中完全删除时,将调用 dispose() 。同样,它不等同于 C# 模式。

然而,C# 一次性和语法糖

using
提供的可以在 dart 中实现(对于单个变量
using
)as


interface Disposable {
  void dispose();
}

Void using<T extends Disposable>(T instance, Void Function(T thing) action) {
  try {
     action(instance);
  } finally {
     t.dispose();
  }
}

例如

using(DisposableThing(), (thing) {
  thing.use();
});

或者如果您想使用实际的 dart 接口并提供异步等效接口:


Future<Void> using<T extends Disposable>(T instance, Future<Void> Function(T thing) action) async {
  try {
     await action(instance);
  } finally {
     await t.dispose();
  }
}

例如

await using(DisposableThing(), (thing) async {
  await thing.use();
});
© www.soinside.com 2019 - 2024. All rights reserved.