|
|
|
@ -23,6 +23,7 @@ class VideoCallPage extends StatefulWidget { |
|
|
|
final String? channelId; |
|
|
|
final MarriageData? userData; |
|
|
|
final bool isInitiator; // 是否是发起方 |
|
|
|
final EMMessage? callMessage; // 通话消息(用于接听通话时更新消息状态) |
|
|
|
|
|
|
|
const VideoCallPage({ |
|
|
|
super.key, |
|
|
|
@ -31,6 +32,7 @@ class VideoCallPage extends StatefulWidget { |
|
|
|
this.channelId, |
|
|
|
this.userData, |
|
|
|
this.isInitiator = true, |
|
|
|
this.callMessage, |
|
|
|
}); |
|
|
|
|
|
|
|
@override |
|
|
|
@ -564,46 +566,24 @@ class _VideoCallPageState extends State<VideoCallPage> { |
|
|
|
/// 接听通话 |
|
|
|
Future<void> _acceptCall() async { |
|
|
|
try { |
|
|
|
// 尝试从 ChatController 获取最近的通话消息 |
|
|
|
if (widget.callMessage == null) { |
|
|
|
SmartDialog.showToast('未找到通话邀请消息'); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// 尝试获取 ChatController |
|
|
|
ChatController? chatController; |
|
|
|
EMMessage? callMessage; |
|
|
|
|
|
|
|
try { |
|
|
|
final tag = 'chat_${widget.targetUserId}'; |
|
|
|
if (Get.isRegistered<ChatController>(tag: tag)) { |
|
|
|
chatController = Get.find<ChatController>(tag: tag); |
|
|
|
// 查找最近的通话邀请消息(从后往前找,找到第一条通话消息) |
|
|
|
final messages = chatController.messages; |
|
|
|
for (var i = messages.length - 1; i >= 0; i--) { |
|
|
|
final msg = messages[i]; |
|
|
|
if (msg.body.type == MessageType.CUSTOM) { |
|
|
|
final customBody = msg.body as EMCustomMessageBody; |
|
|
|
// 检查 event 是否为 'call' |
|
|
|
if (customBody.event == 'call') { |
|
|
|
final params = customBody.params; |
|
|
|
// 检查通话状态是否为未接听状态(missed 或 calling) |
|
|
|
if (params != null) { |
|
|
|
final callStatus = params['callStatus']; |
|
|
|
if (callStatus == 'missed' || callStatus == 'calling') { |
|
|
|
callMessage = msg; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
print('⚠️ [VideoCallPage] 获取ChatController失败: $e'); |
|
|
|
} |
|
|
|
|
|
|
|
if (callMessage == null) { |
|
|
|
SmartDialog.showToast('未找到通话邀请消息'); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
final accepted = await _callController.acceptCall( |
|
|
|
message: callMessage, |
|
|
|
message: widget.callMessage!, |
|
|
|
chatController: chatController, |
|
|
|
); |
|
|
|
|
|
|
|
@ -622,48 +602,26 @@ class _VideoCallPageState extends State<VideoCallPage> { |
|
|
|
/// 拒绝通话 |
|
|
|
Future<void> _rejectCall() async { |
|
|
|
try { |
|
|
|
// 尝试从 ChatController 获取最近的通话消息 |
|
|
|
// 尝试获取 ChatController |
|
|
|
ChatController? chatController; |
|
|
|
EMMessage? callMessage; |
|
|
|
|
|
|
|
try { |
|
|
|
final tag = 'chat_${widget.targetUserId}'; |
|
|
|
if (Get.isRegistered<ChatController>(tag: tag)) { |
|
|
|
chatController = Get.find<ChatController>(tag: tag); |
|
|
|
// 查找最近的通话邀请消息(从后往前找,找到第一条通话消息) |
|
|
|
final messages = chatController.messages; |
|
|
|
for (var i = messages.length - 1; i >= 0; i--) { |
|
|
|
final msg = messages[i]; |
|
|
|
if (msg.body.type == MessageType.CUSTOM) { |
|
|
|
final customBody = msg.body as EMCustomMessageBody; |
|
|
|
// 检查 event 是否为 'call' |
|
|
|
if (customBody.event == 'call') { |
|
|
|
final params = customBody.params; |
|
|
|
// 检查通话状态是否为未接听状态(missed 或 calling) |
|
|
|
if (params != null) { |
|
|
|
final callStatus = params['callStatus']; |
|
|
|
if (callStatus == 'missed' || callStatus == 'calling') { |
|
|
|
callMessage = msg; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
print('⚠️ [VideoCallPage] 获取ChatController失败: $e'); |
|
|
|
} |
|
|
|
|
|
|
|
if (callMessage == null) { |
|
|
|
// 即使没有找到消息,也执行拒绝操作(关闭页面) |
|
|
|
if (widget.callMessage == null) { |
|
|
|
// 即使没有消息,也执行拒绝操作(关闭页面) |
|
|
|
await _callController.endCall(callDuration: 0); |
|
|
|
Get.back(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
final rejected = await _callController.rejectCall( |
|
|
|
message: callMessage, |
|
|
|
message: widget.callMessage!, |
|
|
|
chatController: chatController, |
|
|
|
); |
|
|
|
|
|
|
|
|