首页 > 解决方案 > 如何在颤动中正确处理 rxsubject?

问题描述

我正在尝试在集团中处置 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 调用成功,当它成功时,它会简单地用新数据重建列表视图。但是现在,每次我导航到事件页面时,所有的进度都会丢失。Streambuilder 从 api 调用的最开始开始,直到快照,它显示进度指示器,然后显示数据。这就像使用 PublishSubject。

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

标签: flutterdartrxdart

解决方案


为了防止您的数据丢失,您可以使用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
  }

推荐阅读