flutter - 如何在颤动中正确处理 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 时不必处理流的论点,因为小部件不会创建主题。多少是真的?这不会导致内存泄漏吗?
解决方案
为了防止您的数据丢失,您可以使用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
}
推荐阅读
- python - 如何在 Python 中创建一个圆形字母,以便 z 之后的字母是 a,a 之前的字母是 z
- c# - 在 PictureBox 处于“缩放”模式时裁剪图像的正确部分
- excel - Vba Excel 代码不读取第三个工作表
- javascript - 数组对象的集合被推入同一索引中的现有数组
- angular - 当我尝试从自定义确认对话框组件执行角度功能时出现问题
- html - 用波浪制作复杂 div 的最简单方法
- c - 如何在 C 中解决冲突类型问题
- excel - 无法将工作表复制到另一个工作簿
- sql - 计算共享相同 FK id 的重复值
- javascript - 表行onclick字符串值在jquery中显示错误