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

287 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 语音插件 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 处修改
### **后续建议**
- 命名时避免使用保留字
- 使用更描述性的名称
- 考虑向插件作者反馈此问题
---
**现在重新打包应该可以成功了!** 🎯