【问题标题】:Does Dart/Flutter have the concept of weak references?Dart/Flutter 有弱引用的概念吗?
【发布时间】:2018-09-24 16:07:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    Dart 不提供弱引用功能。

    虽然 Expando 具有弱引用行为。 不确定这是否适用于您的用例。

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

    【讨论】:

      【解决方案2】:

      截至 2020 年,我想在 Günter 的回答中补充一点,我刚刚发布了一个包,该包通过实现 weak-mapweak-container,以及利用弱引用的缓存函数

      它比 Expando 更容易使用(它在内部使用 Expando)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        • 1970-01-01
        相关资源
        最近更新 更多