Dart/Flutter有弱引用的概念吗?
Does Dart/Flutter have the concept of weak references?
我正处于学习的早期阶段 Dart & Flutter. I'm looking at how to implement an eventbus,效果很好,但我注意到小部件(and/or 它们的关联状态)对(全局)有很强的参考事件总线,导致内存泄漏。解决方案是在widget-state的dispose方法中取消订阅,但是我想知道有没有更好的方法(我来自Swift允许变量声明为'weak' ).
编辑
我最终将状态子类化如下...有更好的建议吗?
abstract class CustomState<T extends StatefulWidget> extends State {
List<StreamSubscription> eventSubscriptions = [];
void subscribeToEvent(Object eventClass, Function callback) {
StreamSubscription subscription = eventBus.on(eventClass).listen(callback);
eventSubscriptions.add(subscription);
}
void dispose() {
super.dispose();
eventSubscriptions.forEach((subscription) => subscription.cancel());
eventSubscriptions = null;
}
}
class MyEvent {
String text;
MyEvent(this.text);
}
class _MyHomePageState extends CustomState<MyHomePage> {
@override
void initState() {
super.initState();
subscribeToEvent(MyEvent, onEventFired);
}
void onEventFired(event) {
print('event fired: ${event.runtimeType} ${event.text}');
}
}
Dart 不提供弱引用功能。
不过,Expando 的引用行为较弱。
不确定这在您的用例中是否有用。
- https://api.dartlang.org/stable/1.24.3/dart-core/Expando-class.html
- https://groups.google.com/a/dartlang.org/forum/m/#!topic/misc/S7GGxegtJe4
- What is the Dart "Expando" feature about, what does it do?
https://github.com/dart-lang/sdk/issues/16172
我有时会使用一个 Mixin,它提供了一个列表,我可以在其中添加订阅,并使用一个 dispose 方法来取消所有订阅并将其添加到小部件和其他 类 我需要的地方。
截至 2020 年,我想在 Günter 的回答中补充一点,我刚刚发布了一个包,该包通过实施 weak-map 和一个 弱容器 ,以及 利用弱引用的缓存函数 。
它比 Expando 更容易使用(它在内部使用 Expando)。
我正处于学习的早期阶段 Dart & Flutter. I'm looking at how to implement an eventbus,效果很好,但我注意到小部件(and/or 它们的关联状态)对(全局)有很强的参考事件总线,导致内存泄漏。解决方案是在widget-state的dispose方法中取消订阅,但是我想知道有没有更好的方法(我来自Swift允许变量声明为'weak' ).
编辑
我最终将状态子类化如下...有更好的建议吗?
abstract class CustomState<T extends StatefulWidget> extends State {
List<StreamSubscription> eventSubscriptions = [];
void subscribeToEvent(Object eventClass, Function callback) {
StreamSubscription subscription = eventBus.on(eventClass).listen(callback);
eventSubscriptions.add(subscription);
}
void dispose() {
super.dispose();
eventSubscriptions.forEach((subscription) => subscription.cancel());
eventSubscriptions = null;
}
}
class MyEvent {
String text;
MyEvent(this.text);
}
class _MyHomePageState extends CustomState<MyHomePage> {
@override
void initState() {
super.initState();
subscribeToEvent(MyEvent, onEventFired);
}
void onEventFired(event) {
print('event fired: ${event.runtimeType} ${event.text}');
}
}
Dart 不提供弱引用功能。
不过,Expando 的引用行为较弱。 不确定这在您的用例中是否有用。
- https://api.dartlang.org/stable/1.24.3/dart-core/Expando-class.html
- https://groups.google.com/a/dartlang.org/forum/m/#!topic/misc/S7GGxegtJe4
- What is the Dart "Expando" feature about, what does it do?
https://github.com/dart-lang/sdk/issues/16172
我有时会使用一个 Mixin,它提供了一个列表,我可以在其中添加订阅,并使用一个 dispose 方法来取消所有订阅并将其添加到小部件和其他 类 我需要的地方。
截至 2020 年,我想在 Günter 的回答中补充一点,我刚刚发布了一个包,该包通过实施 weak-map 和一个 弱容器 ,以及 利用弱引用的缓存函数 。
它比 Expando 更容易使用(它在内部使用 Expando)。