hun*_*ter 7 memory-leaks weak-references circular-reference dart flutter
我正处于学习Dart和Flutter的早期阶段。我正在研究如何实现eventbus,它工作正常,但我注意到小部件(和/或它们的关联状态)持有对(全局) eventbus 的强引用,导致内存泄漏。解决方案是在小部件状态的 dispose 方法中取消订阅,但我想知道是否有更好的方法(我来自 Swift,它允许将变量声明为“弱”)。
编辑
我最终将状态子类化如下......还有更好的建议吗?
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}');
}
}
Run Code Online (Sandbox Code Playgroud)
Dart 不提供弱引用功能。
不过 Expando 的引用行为较弱。不确定这是否适用于您的用例。
我有时使用 Mixin,它提供了一个列表,我可以在其中添加订阅,以及一个 dispose 方法,该方法取消所有订阅并将其添加到我需要的小部件和其他类中。
从 dart 2.17开始,你可以使用WeakReference。
包装在其中的任何对象都WeakReference(obj)不会被垃圾收集。
您可以通过对象被垃圾收集时target的属性来访问该对象null。
final myWeakRef = WeakReference(ExampleObj());
// access obj, may be null
print(myWeakRef.target);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3693 次 |
| 最近记录: |