我正在尝试将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方法吗?如果没有,我应该如何处置?
解决方案
将final eventBloc=EventBloc();
从bloc中移出并在UI中初始化bloc。
以前,在不关闭主题的情况下,我的UI会保留数据,当我导航至事件页面时,该数据将一直显示在此处,直到api调用成功为止;如果这样做,它将仅使用新数据重建listview。但是现在,每次我导航到事件页面时,所有进度都将丢失。 Streambuilder从api调用的最开始开始,直到快照,它显示进度指示器,然后显示数据。就像使用PublishSubject。
此外,我听到一个论点,关于在块内初始化块时不必丢弃流的问题,因为窗口小部件不会创建主题。那是多少?那不是导致内存泄漏吗?
答案 0 :(得分:0)
为防止数据丢失,可以使用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
}