Dart/Flutter 有弱引用的概念吗?

hun*_*ter 7 memory-leaks weak-references circular-reference dart flutter

我正处于学习DartFlutter的早期阶段。我正在研究如何实现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)

Gün*_*uer 6

Dart 不提供弱引用功能。

不过 Expando 的引用行为较弱。不确定这是否适用于您的用例。

我有时使用 Mixin,它提供了一个列表,我可以在其中添加订阅,以及一个 dispose 方法,该方法取消所有订阅并将其添加到我需要的小部件和其他类中。


Rob*_*ene 5

从 dart 2.17开始,你可以使用Wea​​kReference

包装在其中的任何对象都WeakReference(obj)不会被垃圾收集。

您可以通过对象被垃圾收集时target的属性来访问该对象null

final myWeakRef = WeakReference(ExampleObj());
// access obj, may be null
print(myWeakRef.target);
Run Code Online (Sandbox Code Playgroud)