Browse Source

feat(call): 添加通话角色管理和消息传递功能

- 新增 CallRole 枚举定义主叫和被叫角色
- 在 CallController 中添加 callRole 属性并初始化为 caller
- 在 IMManager 中设置被叫角色标识
- 扩展 OverlayController 以支持消息传递
- 更新 VideoCallOverlayWidget 以接收和处理通话消息
- 修改 VideoCallPage 接收并传递消息参数
- 优化通话发起判断逻辑基于角色配置
master
Jolie 2 months ago
parent
commit
dcd4634a4d
6 changed files with 20 additions and 4 deletions
  1. 9
      lib/controller/message/call_controller.dart
  2. 4
      lib/controller/overlay_controller.dart
  3. 2
      lib/im/im_manager.dart
  4. 1
      lib/main.dart
  5. 1
      lib/pages/message/video_call_page.dart
  6. 7
      lib/widget/message/video_call_overlay_widget.dart

9
lib/controller/message/call_controller.dart

@ -25,6 +25,11 @@ enum CallType {
video, //
}
enum CallRole {
caller, //
callee, //
}
///
enum CallStatus {
waitCalling, //
@ -86,7 +91,7 @@ class CallController extends GetxController {
: _networkService = networkService ?? Get.find<NetworkService>();
final NetworkService _networkService;
CallRole callRole = CallRole.caller;
///
final Rxn<RtcChannelData> rtcChannel = Rxn<RtcChannelData>();
@ -167,7 +172,7 @@ class CallController extends GetxController {
print('❌ [CallController] 权限检查失败,无法创建通话频道');
return null;
}
callRole = CallRole.caller;
isCreatingChannel.value = true;
final response = await _networkService.rtcApi.createOneOnOneRtcChannel({

4
lib/controller/overlay_controller.dart

@ -1,4 +1,5 @@
import 'package:get/get.dart';
import 'package:im_flutter_sdk/im_flutter_sdk.dart';
/// Overlay
class OverlayController extends GetxController {
@ -12,6 +13,7 @@ class OverlayController extends GetxController {
String? videoCallTargetUserId;
String? videoCallTargetUserName;
String? videoCallTargetAvatarUrl;
EMMessage? videoCallTargetMessage;
/// overlay
void show() {
@ -33,11 +35,13 @@ class OverlayController extends GetxController {
required String targetUserId,
String? targetUserName,
String? targetAvatarUrl,
EMMessage? message,
}) {
videoCallTargetUserId = targetUserId;
videoCallTargetUserName = targetUserName;
videoCallTargetAvatarUrl = targetAvatarUrl;
showVideoCallOverlay.value = true;
videoCallTargetMessage = message;
}
/// overlay

2
lib/im/im_manager.dart

@ -1961,7 +1961,7 @@ class IMManager {
//
callController.stopCallAudio();
callController.callRole = CallRole.callee;
//
Get.to(
() => VideoCallPage(

1
lib/main.dart

@ -132,6 +132,7 @@ void main() async {
targetUserId: overlayController.videoCallTargetUserId ?? '',
targetUserName: overlayController.videoCallTargetUserName,
targetAvatarUrl: overlayController.videoCallTargetAvatarUrl,
message: overlayController.videoCallTargetMessage,
onClose: () {
overlayController.hideVideoCall();
},

1
lib/pages/message/video_call_page.dart

@ -297,6 +297,7 @@ class _VideoCallPageState extends State<VideoCallPage> {
targetUserId: widget.targetUserId,
targetUserName: _targetUserName,
targetAvatarUrl: _targetAvatarUrl,
message: widget.callMessage,
);
}
//

7
lib/widget/message/video_call_overlay_widget.dart

@ -8,6 +8,7 @@ import 'package:dating_touchme_app/rtc/rtc_manager.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:im_flutter_sdk/im_flutter_sdk.dart';
///
class VideoCallOverlayWidget extends StatefulWidget {
@ -15,6 +16,7 @@ class VideoCallOverlayWidget extends StatefulWidget {
final String targetUserId;
final String? targetUserName;
final String? targetAvatarUrl;
final EMMessage? message;
const VideoCallOverlayWidget({
super.key,
@ -22,6 +24,7 @@ class VideoCallOverlayWidget extends StatefulWidget {
required this.targetUserId,
this.targetUserName,
this.targetAvatarUrl,
this.message,
});
@override
@ -237,10 +240,12 @@ class _VideoCallOverlayWidgetState extends State<VideoCallOverlayWidget> {
),
),
).onTap(() {
Get.log("点击小窗${widget.message}");
//
Get.to(() => VideoCallPage(
targetUserId: widget.targetUserId,
isInitiator: callSession?.isInitiator ?? true,
callMessage: widget.message,
isInitiator: callSession?.isInitiator ?? CallController.instance.callRole == CallRole.caller ? true : false,
));
widget.onClose?.call();
});

Loading…
Cancel
Save