1

我有一个监听消息流的肘部,并发出一个保存消息的状态。在屏幕中,我使用 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());
    }
  }
}
4

1 回答 1

4

不需要关闭订阅,但您应该尽量避免潜在的内存泄漏。因为它是如此简单,所以没有任何牺牲。

  1. 创建一个类型为 的类变量StreamSubscription<your type>。假设它被命名为sub.
  2. 在听之前的 getMessages 中:await sub?.cancel()
  3. 然后sub = messagesStreamData.listen(...
  4. 覆盖 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();
  }
}
于 2021-02-23T22:06:58.210 回答