如何正确地将rxsubject正确摆放?

时间:2020-07-22 02:53:07

标签: flutter dart rxdart

我正在尝试将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。

此外,我听到一个论点,关于在块内初始化块时不必丢弃流的问题,因为窗口小部件不会创建主题。那是多少?那不是导致内存泄漏吗?

1 个答案:

答案 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
  }