【问题标题】:How do I cancel a StreamSubscription inside a Cubit?如何取消 Cubit 内的 StreamSubscription?
【发布时间】:2021-05-26 05:15:45
【问题描述】:

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

【问题讨论】:

    标签: flutter bloc cubit


    【解决方案1】:

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

    1. 创建StreamSubscription&lt;your type&gt; 类型的类变量。假设它被命名为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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多