2.6 KiB
2.6 KiB
VideoCall 功能修复总结
问题描述
用户在使用视频通话功能时遇到 TypeError
错误,具体表现为 roomName
属性为 undefined
,导致视频通话无法正常启动。
根本原因分析
- 参数传递不一致: 在某些情况下,导航到
VideoCall
屏幕时没有传递必要的参数 - 缺少参数验证:
VideoCallScreen
组件没有对传入参数进行验证和默认值处理 - 缓存问题: 开发环境中存在旧版本的缓存代码,可能包含不正确的导航调用
修复内容
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
的调用都正确传递了参数:
- ✅
ChatDetailScreen.tsx
- 正确传递参数 - ✅
FloatingCallWindow.tsx
- 正确传递参数 - ✅
CallNavigationHandler.tsx
- 正确传递参数 - ✅
HomeScreen.tsx
- 正确传递参数
类型安全
确保 src/types/navigation.ts
中的类型定义正确:
VideoCall: {
roomName: string;
identity: string;
isTranslationCall?: boolean;
};
测试建议
- 测试正常的视频通话流程
- 测试从聊天详情页面发起视频通话
- 测试浮动通话窗口的恢复功能
- 测试从主页发起视频通话
- 使用
TestVideoCallScreen
测试边界情况
预期结果
- ✅ 不再出现
roomName
为undefined
的错误 - ✅ 即使在参数缺失的情况下,也能使用默认值正常工作
- ✅ 提供更好的错误处理和用户体验
- ✅ 增强的调试和日志记录功能
后续建议
- 考虑在生产环境中添加错误监控
- 定期清理开发缓存
- 添加更多的单元测试覆盖边界情况
- 考虑添加参数验证的通用工具函数