mars/VIDEO_CALL_FIX.md

2.6 KiB

VideoCall 功能修复总结

问题描述

用户在使用视频通话功能时遇到 TypeError 错误,具体表现为 roomName 属性为 undefined,导致视频通话无法正常启动。

根本原因分析

  1. 参数传递不一致: 在某些情况下,导航到 VideoCall 屏幕时没有传递必要的参数
  2. 缺少参数验证: VideoCallScreen 组件没有对传入参数进行验证和默认值处理
  3. 缓存问题: 开发环境中存在旧版本的缓存代码,可能包含不正确的导航调用

修复内容

1. 参数验证和默认值处理

src/screens/VideoCallScreen.tsx 中添加了:

// 添加参数验证和默认值
const params = route.params || {};
const roomName = params.roomName || `room_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
const identity = params.identity || `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
const isTranslationCall = params.isTranslationCall || false;

2. 改进的日志记录

添加了详细的日志记录以帮助调试:

console.log('VideoCallScreen 参数:', { 
  originalParams: route.params,
  roomName, 
  identity, 
  isTranslationCall,
  hasParams: !!route.params
});

3. 清理开发缓存

清理了 .expo/web/cache 目录,确保使用最新的代码版本。

4. 测试功能增强

TestVideoCallScreen 中添加了测试按钮:

  • 测试无参数导航
  • 测试有参数导航

导航调用检查

验证了所有导航到 VideoCall 的调用都正确传递了参数:

  1. ChatDetailScreen.tsx - 正确传递参数
  2. FloatingCallWindow.tsx - 正确传递参数
  3. CallNavigationHandler.tsx - 正确传递参数
  4. HomeScreen.tsx - 正确传递参数

类型安全

确保 src/types/navigation.ts 中的类型定义正确:

VideoCall: {
  roomName: string;
  identity: string;
  isTranslationCall?: boolean;
};

测试建议

  1. 测试正常的视频通话流程
  2. 测试从聊天详情页面发起视频通话
  3. 测试浮动通话窗口的恢复功能
  4. 测试从主页发起视频通话
  5. 使用 TestVideoCallScreen 测试边界情况

预期结果

  • 不再出现 roomNameundefined 的错误
  • 即使在参数缺失的情况下,也能使用默认值正常工作
  • 提供更好的错误处理和用户体验
  • 增强的调试和日志记录功能

后续建议

  1. 考虑在生产环境中添加错误监控
  2. 定期清理开发缓存
  3. 添加更多的单元测试覆盖边界情况
  4. 考虑添加参数验证的通用工具函数