guoyu/log/语音插件Kotlin保留字冲突修复.md

287 lines
5.9 KiB
Markdown
Raw Normal View History

# 语音插件 Kotlin 保留字冲突修复
## ❌ **错误原因**
云端打包失败,报错:
```
Cannot find a parameter with this name: error
at index.kt:119:95, 123:95, 239:75, 261:71
```
**根本原因:** `error` 是 Kotlin 的保留字,不能用作对象属性名。
---
## 🔍 **问题分析**
### **插件代码中的问题**
`xwq-speech-to-text` 插件的 UTS 代码中使用了:
```typescript
data: {
text: '',
error: '识别错误' // ❌ error 是 Kotlin 保留字
}
```
UTS 编译为 Kotlin 时,`error` 作为对象属性名会导致编译错误。
---
## ✅ **解决方案**
将所有 `error` 属性改为 `errorMsg`
---
## 📝 **修改内容**
### **1. 插件代码修改**
**文件:** `uni_modules/xwq-speech-to-text/utssdk/app-android/index.uts`
#### **修改1onError 方法(第 73 行)**
```typescript
// 修改前
data: {
text: '',
error: '识别错误: ' + (e.message ?? '未知错误')
}
// 修改后
data: {
text: '',
errorMsg: '识别错误: ' + (e.message ?? '未知错误')
}
```
#### **修改2onTimeout 方法(第 85 行)**
```typescript
// 修改前
data: {
text: '',
error: '识别超时'
}
// 修改后
data: {
text: '',
errorMsg: '识别超时'
}
```
#### **修改3startSpeechVoice 方法 - 模型路径检查(第 290 行)**
```typescript
// 修改前
data: {
text: '',
error: '模型未初始化,请重新加载'
}
// 修改后
data: {
text: '',
errorMsg: '模型未初始化,请重新加载'
}
```
#### **修改4startSpeechVoice 方法 - catch 块(第 322 行)**
```typescript
// 修改前
data: {
text: '',
error: '语音识别启动失败: ' + (e.message ?? '未知错误')
}
// 修改后
data: {
text: '',
errorMsg: '语音识别启动失败: ' + (e.message ?? '未知错误')
}
```
---
### **2. 前端代码修改**
**文件:** `fronted_uniapp/pages/speech/speech.vue`
#### **修改handleStart 方法中的错误处理(第 517-522 行)**
```javascript
// 修改前
if (res && res.code === -1) {
console.error('[Speech] 识别出错:', res.data?.error)
self.isRecording = false
self.statusText = '识别出错'
self.debugInfo = '错误: ' + (res.data?.error || '未知错误')
self.stopAutoScroll()
uni.showToast({ title: res.data?.error || '语音识别出错', icon: 'none', duration: 2000 })
return
}
// 修改后
if (res && res.code === -1) {
console.error('[Speech] 识别出错:', res.data?.errorMsg)
self.isRecording = false
self.statusText = '识别出错'
self.debugInfo = '错误: ' + (res.data?.errorMsg || '未知错误')
self.stopAutoScroll()
uni.showToast({ title: res.data?.errorMsg || '语音识别出错', icon: 'none', duration: 2000 })
return
}
```
---
## 📋 **修改文件清单**
1.`uni_modules/xwq-speech-to-text/utssdk/app-android/index.uts`
- 修改了 4 处 `error``errorMsg`
2.`fronted_uniapp/pages/speech/speech.vue`
- 修改了 3 处 `res.data?.error``res.data?.errorMsg`
---
## 🚀 **重新打包步骤**
### **步骤1清理缓存**
在 HBuilderX 中:
```
运行 → 清理项目缓存
```
### **步骤2重新打包**
```
发行 → 原生 App-云打包
选择 Android
等待打包完成(约 5-10 分钟)
```
### **步骤3验证**
1. 下载并安装 APK
2. 打开语音测评页面
3. 测试语音识别功能
4. 测试错误提示(故意触发错误)
---
## 📊 **Kotlin 保留字列表**
以下是常见的 Kotlin 保留字,不能用作属性名:
```
as, break, class, continue, do, else, false, for, fun,
if, in, interface, is, null, object, package, return,
super, this, throw, true, try, typealias, typeof, val,
var, when, while, error, suspend, sealed, etc.
```
**避免方法:**
- 使用描述性名称:`errorMsg`、`errorMessage`、`errorText`
- 使用下划线:`_error`(不推荐)
- 使用驼峰命名:`errorInfo`
---
## ⚠️ **注意事项**
### **1. 插件更新**
如果插件有更新:
- 检查新版本是否修复了此问题
- 如果没修复,需要重新应用本修改
### **2. 其他可能的保留字冲突**
检查代码中是否使用了其他 Kotlin 保留字:
```bash
# 搜索常见保留字
grep -r ":\s*val\s*:" uni_modules/
grep -r ":\s*var\s*:" uni_modules/
grep -r ":\s*fun\s*:" uni_modules/
```
### **3. 文档更新**
如果你的项目有 API 文档,记得更新:
- 回调参数从 `error` 改为 `errorMsg`
- 错误处理示例代码
---
## 🐛 **常见问题**
### **Q1打包还是失败怎么办**
**检查:**
1. 确认所有文件都已保存
2. 清理项目缓存
3. 查看完整的错误日志
4. 检查是否有其他编译错误
### **Q2如何验证修改是否生效**
```bash
# 搜索确认没有遗漏
grep -r "error:" uni_modules/xwq-speech-to-text/
grep -r "\.error" fronted_uniapp/pages/speech/
```
应该没有结果,或只有注释中的。
### **Q3本地运行正常打包失败**
**原因:** 本地运行使用标准基座,不编译 UTS 插件。
云端打包会编译 UTS 为 Kotlin才会发现此问题。
---
## ✅ **验收标准**
- [ ] 云端打包成功(无编译错误)
- [ ] APK 安装成功
- [ ] 语音识别功能正常
- [ ] 错误提示正确显示
- [ ] 无闪退问题
---
## 📚 **相关文档**
1. Kotlin 语言规范https://kotlinlang.org/spec/
2. UTS 开发文档https://uniapp.dcloud.net.cn/tutorial/syntax-uts.html
3. 云端打包说明https://uniapp.dcloud.net.cn/tutorial/run/
---
## ✅ **总结**
### **核心问题**
使用 Kotlin 保留字 `error` 作为对象属性名导致编译失败。
### **解决方法**
将所有 `error` 改为 `errorMsg`
### **影响范围**
- 插件代码4 处修改
- 前端代码3 处修改
### **后续建议**
- 命名时避免使用保留字
- 使用更描述性的名称
- 考虑向插件作者反馈此问题
---
**现在重新打包应该可以成功了!** 🎯