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