From dcd4634a4dc6b5b971d6ce8d81b26f13e168288a Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Tue, 13 Jan 2026 23:35:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(call):=20=E6=B7=BB=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E8=AF=9D=E8=A7=92=E8=89=B2=E7=AE=A1=E7=90=86=E5=92=8C=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E4=BC=A0=E9=80=92=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 CallRole 枚举定义主叫和被叫角色 - 在 CallController 中添加 callRole 属性并初始化为 caller - 在 IMManager 中设置被叫角色标识 - 扩展 OverlayController 以支持消息传递 - 更新 VideoCallOverlayWidget 以接收和处理通话消息 - 修改 VideoCallPage 接收并传递消息参数 - 优化通话发起判断逻辑基于角色配置 --- lib/controller/message/call_controller.dart | 9 +++++++-- lib/controller/overlay_controller.dart | 4 ++++ lib/im/im_manager.dart | 2 +- lib/main.dart | 1 + lib/pages/message/video_call_page.dart | 1 + lib/widget/message/video_call_overlay_widget.dart | 7 ++++++- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/controller/message/call_controller.dart b/lib/controller/message/call_controller.dart index 9fc8f32..52e3c5c 100644 --- a/lib/controller/message/call_controller.dart +++ b/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(); final NetworkService _networkService; - + CallRole callRole = CallRole.caller; /// 当前频道信息 final Rxn rtcChannel = Rxn(); @@ -167,7 +172,7 @@ class CallController extends GetxController { print('❌ [CallController] 权限检查失败,无法创建通话频道'); return null; } - + callRole = CallRole.caller; isCreatingChannel.value = true; final response = await _networkService.rtcApi.createOneOnOneRtcChannel({ diff --git a/lib/controller/overlay_controller.dart b/lib/controller/overlay_controller.dart index f6e8d28..638e362 100644 --- a/lib/controller/overlay_controller.dart +++ b/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 diff --git a/lib/im/im_manager.dart b/lib/im/im_manager.dart index 5d9e24f..72d59c0 100644 --- a/lib/im/im_manager.dart +++ b/lib/im/im_manager.dart @@ -1961,7 +1961,7 @@ class IMManager { // 停止播放来电铃声 callController.stopCallAudio(); - + callController.callRole = CallRole.callee; // 只跳转到视频通话页面,不自动接通 Get.to( () => VideoCallPage( diff --git a/lib/main.dart b/lib/main.dart index dc6a5af..fc2e84e 100644 --- a/lib/main.dart +++ b/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(); }, diff --git a/lib/pages/message/video_call_page.dart b/lib/pages/message/video_call_page.dart index 541f614..9c6d777 100644 --- a/lib/pages/message/video_call_page.dart +++ b/lib/pages/message/video_call_page.dart @@ -297,6 +297,7 @@ class _VideoCallPageState extends State { targetUserId: widget.targetUserId, targetUserName: _targetUserName, targetAvatarUrl: _targetAvatarUrl, + message: widget.callMessage, ); } // 返回上一页 diff --git a/lib/widget/message/video_call_overlay_widget.dart b/lib/widget/message/video_call_overlay_widget.dart index 2ca2a10..352a9f5 100644 --- a/lib/widget/message/video_call_overlay_widget.dart +++ b/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 { ), ), ).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(); });