Dart / Flutter是否具有弱引用的概念?

时间:2018-04-14 12:37:51

标签: memory-leaks dart flutter weak-references circular-reference

我正处于学习的早期阶段Dart& Flutter。我正在研究如何实现eventbus,它工作正常,但我注意到Widgets(和/或它们的关联状态)拥有对(全局)事件总线的强引用,导致内存泄漏。解决方案是在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}');
  }
}

2 个答案:

答案 0 :(得分:2)

Dart不提供弱参考功能。

然而,Expando的参考行为很弱。 不确定这是否适用于您的用例。

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

答案 1 :(得分:2)

自2020年起,我想补充一下昆特的答案,即我刚刚发布了一个通过实施弱图弱容器

使用它比Expando容易得多(内部使用Expando)。