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

4
lib/controller/overlay_controller.dart

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

2
lib/im/im_manager.dart

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

1
lib/main.dart

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

1
lib/pages/message/video_call_page.dart

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

Loading…
Cancel
Save