im_cubit.dart 1.93 KB
import 'package:appframe/config/locator.dart';
import 'package:appframe/config/routes.dart';
import 'package:appframe/services/im_service.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';

class ImState extends Equatable {
  final List<String> messages;

  const ImState({this.messages = const []});

  ImState copyWith({List<String>? messages}) {
    return ImState(
      messages: messages ?? this.messages,
    );
  }

  @override
  List<Object?> get props => [messages];
}

class ImCubit extends Cubit<ImState> {
  late ImService imService;
  late V2TimAdvancedMsgListener _msgListener;

  ImCubit() : super(const ImState()) {
    imService = getIt.get<ImService>();

    _msgListener = V2TimAdvancedMsgListener(
      onRecvNewMessage: _onMessageReceived,
    );

    init();
  }

  void init() async {
    await imService.removeMsgListener(imService.msgListener);
    await imService.addMsgListener(_msgListener);
  }

  void addMessage(String message) {
    emit(state.copyWith(messages: [...state.messages, message]));
  }

  void goWeb() {
    router.go('/web');
  }

  Future<void> _onMessageReceived(V2TimMessage message) async {
    // 处理文本消息
    if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT) {
      print("page 收到IM消息-------- ${message.textElem?.text}");

      // 处理接收到的消息
      emit(state.copyWith(messages: [...state.messages, message.textElem?.text ?? '']));
    } else {
      print("page 忽略非文本消息-------- ${message.textElem?.text}");
    }
  }

  @override
  Future<void> close() async {
    await imService.removeMsgListener(_msgListener);
    await imService.addMsgListener(imService.msgListener);
    super.close();
  }
}