【问题标题】:How to dispose rxsubject correctly in flutter?如何在颤动中正确处理 rxsubject?
【发布时间】:2020-11-11 12:24:17
【问题描述】:

我正在尝试在集团中处置 rxsubject。但是当我在 UI 部分调用 dispose 方法时,它会抛出错误:

Bad state: Cannot add new events after calling close

这是我的集团。

class EventBloc {
  final EventRepository _repository = EventRepository();
  final BehaviorSubject<EventResponse> _subject =
      BehaviorSubject<EventResponse>();
  getEvents() async {
    EventResponse response = await _repository.getEvents();
    _subject.sink.add(response);
  }

  dispose() {
    _subject?.close();
  }

  BehaviorSubject<EventResponse> get subject => _subject;
}

final eventBloc = EventBloc();

UI 中的 dispose 方法:

void dispose() {
    super.dispose();
    eventBloc.dispose();
  }

当我不在 UI 上调用 dispose 方法时,它可以工作。我不应该调用 dispose 方法吗?如果没有,我应该如何处理?

解决方案

从 bloc 中移动 final eventBloc=EventBloc(); 并在 UI 中初始化 bloc。

以前,在不关闭主题的情况下,我的 UI 将保留数据,当我导航到事件页面时,数据已经显示在那里,直到 api 调用成功,当它成功时,它会简单地用新数据重建列表视图。但是现在,每次我导航到事件页面时,所有的进度都会丢失。 Streambuilder 从 api 调用的最开始开始,直到快照,它显示进度指示器,然后显示数据。这就像使用 PublishSubject。

另外,我听到一个关于在 bloc 中初始化 bloc 时不必处理流的论点,因为小部件不会创建主题。多少是真的?这不会导致内存泄漏吗?

【问题讨论】:

  • 请在 UI 中发布 dispose 方法。
  • 编辑了问题。
  • 错误很冗长 - 在 _subject 关闭后您调用 sink.add 的地方。在您调用 getEvents() 的位置显示代码并处理 bloc
  • 我已经根据@VictorEronmosele 提供的解决方案编辑了我的答案,它没有抛出该错误。但另一个问题出现了。

标签: flutter dart rxdart


【解决方案1】:

为防止您的数据丢失,您可以使用provider。 您需要创建比使用它的小部件更高的级别,最好是在应用程序的顶层。像这样:

  runApp(
    Provider<EventBloc>(
      create: (_) => EventBloc(),
      dispose: (context, value) => value.dispose(),
      child: MyApp(),
    ),
  );

然后您的小部件可以在需要时访问它。喜欢:

  @override
  build(context) {
    final EventBloc eventBloc = Provider.of<EventBloc>(context);

    //Rest of your code
  }

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多