我知道 C# 的一次性模式。
但是,我有点想知道它在 Dart 和 Flutter 中是如何实现和使用的。我看到它在 Flutter 中是这样使用的:
@override
void dispose() {
// dispose own stuff here
super.dispose();
}
现在这是我第一次想在没有小部件基类的类中自己实现它。在一些库中,我发现了一个 Disposable 基类和 dispose() 方法。
但是方法签名不同
@override
Future<Null> dispose() async {
}
在 C# 中,需要实现一个接口才能满足一次性模式。 Dart 是否存在这样的接口(基类)?或者只是每个人都实现了具有任意签名的 dispose 方法,而使用该类的人必须足够聪明才能找到该方法并弄清楚如何调用它?
没有任何方法在对象被“处置”时总是被调用。根据您使用的状态管理系统,处理方式有所不同。 我(个人)推荐带有
Provider
和/或 Bloc
的状态管理系统。在这里您可以使用例如当从部件树中删除 close
时,使用 Bloc
方法释放资源。
https://pub.dev/packages/provider其他状态管理系统: https://docs.flutter.dev/data-and-backend/state-mgmt/options
如果您只是使用
StatefulWidget
进行状态管理(不推荐),则可以使用 dispose
方法来释放资源。
编辑: 正如@RandalSchwartz 所说,我的答案并不完全正确。 Dart 中有一个 Finalizer 类,允许您在对象变得无法访问时将其释放。 然而,这不是 Flutter 中的最佳实践,不应该用作通用模式。
这里有一个更具体的答案,因为人们可能不熟悉 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();
});