【发布时间】: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 提供的解决方案编辑了我的答案,它没有抛出该错误。但另一个问题出现了。