flutter - 如何取消 Cubit 内的 StreamSubscription?
问题描述
我有一个监听消息流的肘部,并发出一个保存消息的状态。在屏幕中,我使用 BlocProvider 来访问 cubit,并使用 BlocBuilder 来显示消息。
在以下情况下,我是否需要关闭在 listen() 上创建的 StreamSubscription?有干净的方法吗?
class MessageCubit extends Cubit<MessageState> {
final GetMessagesUseCase getMessagesUseCase;
MessageCubit({this.getMessagesUseCase}) : super(MessageInitial());
Future<void> getMessages({String senderId, String recipientId}) async {
emit(MessageLoading());
try {
final messagesStreamData = getMessagesUseCase.call();
//This is where I listen to a stream
messagesStreamData.listen((messages) {
emit(MessageLoaded(messages: messages));
});
} on SocketException catch (_) {
emit(MessageFailure());
} catch (_) {
emit(MessageFailure());
}
}
}
解决方案
您不需要关闭订阅,但您应该尽量避免潜在的内存泄漏。因为它是如此简单,所以没有任何牺牲。
- 创建一个类型为 的类变量
StreamSubscription<your type>
。假设它被命名为sub
. - 在听之前的 getMessages 中:
await sub?.cancel()
- 然后
sub = messagesStreamData.listen(...
- 覆盖 Cubit 的
close
方法并运行与项目符号 2 中相同的命令。
完整代码:
class MessageCubit extends Cubit<MessageState> {
final GetMessagesUseCase getMessagesUseCase;
// Added
StreamSubscription<YOUR_MESSAGES_TYPE> sub;
MessageCubit({this.getMessagesUseCase}) : super(MessageInitial());
Future<void> getMessages({String senderId, String recipientId}) async {
emit(MessageLoading());
try {
final messagesStreamData = getMessagesUseCase.call();
// Added
await sub?.cancel();
//This is where I listen to a stream
sub = messagesStreamData.listen((messages) {
emit(MessageLoaded(messages: messages));
});
} on SocketException catch (_) {
emit(MessageFailure());
} catch (_) {
emit(MessageFailure());
}
}
// Added
@override
Future<void> close() async {
await sub?.cancel();
return super.close();
}
}
推荐阅读
- sql - TSQL - 父子(1 到零/多个)分组/聚合
- c++ - 如何通过引用创建和传递字符串以发挥作用
- python - 如何在乌龟中创建一个按钮?
- python-3.x - Tkinter 无法从 entryy 解码表情符号
- python - 如何确定 pandas 列中值的“稳定性”?
- android-studio - Dart/Flutter 防止格式化程序将方法调用压缩到一行
- python - Python find 方法无法按预期工作
- ruby - Ruby:如何从文档文本中删除重复的行?
- django - Django 副本数据保存到多个数据库
- angular - RxJS 不能将 Observable 中的数据放在另一个 Observable 中