uni-app uts兼容模式插件 组件函数返回值无效 永远返回数字0
uni-app uts兼容模式插件 组件函数返回值无效 永远返回数字0
示例代码:
//原生提供以下属性或方法的实现
export default {
name: "test-function",
props: {
"buttontext": {
type: String,
default: "原生按钮"
}
},
data() {
return {}
},
expose: ['getResult','getString', 'getMap'],
methods: {
//uts返回值测试
getResult(a: number, b: number) : number {
return a + b;
},
getString() : string {
return "返回字符串";
},
getMap() : Map<string, string|number> {
let headerMap = new Map<string, string|number>();
headerMap.set("number", 22);
headerMap.set("string", "返回字符串");
return headerMap;
},
}
}
export default {
methods: {
test() {
//实际获取返回值都是0
console.log('应该返回10', this.$refs.nativeComp.getResult(2, 8));
console.log('应该返回字符串aaa', this.$refs.nativeComp.getString());
console.log('应该返回一个map', this.$refs.nativeComp.getMap());
},
}
}
操作步骤:
运行项目,然后点击logo调用 test 函数,查看控制台中的返回值。
预期结果:
getResult应该返回数字10getString应该返回字符串’aaa’getMap应该返回一个map
实际结果:
getResult返回数字0getString返回数字0getMap返回数字0
bug描述:
使用uts兼容模式插件创建一个组件,并暴露函数给js调用,调用正常,但是uts侧函数返回值无效,无论uts返回什么东西,js永远接收一个数字0 !
创建一个全新项目,用HBuilder 创建一个uts兼容模式插件,测试依然有问题。测试代码已经放在附件中。
| 项目信息 | 详情 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境操作系统 | Windows |
| PC开发环境操作系统版本号 | windows10 |
| HBuilderX类型 | 正式 |
| HBuilderX版本号 | 4.75 |
| 手机系统 | Android |
| 手机系统版本号 | Android 9.0 |
| 手机厂商 | 模拟器 |
| 手机机型 | 雷电模拟器 |
| 页面类型 | nvue |
| vue版本 | vue2 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |

更多关于uni-app uts兼容模式插件 组件函数返回值无效 永远返回数字0的实战教程也可以访问 https://www.itying.com/category-93-b0.html
export default {
methods: {
test() {
//实际获取返回值都是0
const sum = this.$refs.nativeComp.getResult(2, 8)
console.log(‘应该返回10’, sum);
console.log(‘应该返回undefined 或者报错’, this.$refs.nativeComp.getString111111());
console.log(‘应该返回一个map’, this.$refs.nativeComp.getMap());
},
}
}
这样试试看呢
更多关于uni-app uts兼容模式插件 组件函数返回值无效 永远返回数字0的实战教程也可以访问 https://www.itying.com/category-93-b0.html
回复 imengyu: 那问题在this.$refs.nativeComp
回复 1***@163.com: 不是这个。调用函数正常,uts也可以执行,但是就是返回值无效
试了一下也不能传递回调函数,直接就调用不了,没反应。 没加回调函数的就可以正常调用!
这样我怎么获取原生操作的结果?返回值也不能用,回调函数也不能用。他只能调用不能获取返回值
UTS代码:
type MyApiOptions = {
param: number,
success: () => void,
fail: (e: string) => void,
}
testPassPure(param: number) {
console.log(‘testPassPure’, param)
},
testPassObject(obj: UTSJSONObject) {
console.log(‘testPassObject’,
‘param:’, obj.getNumber(‘param’),
‘str:’, obj.getString(‘str’)
);
},
testPassObject3(obj: TestData) {
console.log(‘testPassObject’,
‘param:’, obj.param,
‘str:’, obj.str
);
},
testPassObject2(options: MyApiOptions) {
console.log(‘testPassObject2’, options.param);
options.success();
},
testPassCallbackFunction(fun: () => void) {
console.log(‘testPassFunction’)
fun();
},
调用:
this.$refs.nativeComp.testPassPure(1) //有用
this.$refs.nativeComp.testPassObject({
param: 12,
str: ‘123’,
}) //有用
this.$refs.nativeComp.testPassObject2({
param: 12,
success() {
console.log(‘callback’);
}
}) //没用,调用没反应
this.$refs.nativeComp.testPassFunction(() => {
console.log(‘callback’);
}) //没用,调用没反应
原来以为是腿瘸了,拄拐还能走。结果是下半身截肢!垃圾
这是一个已知的 UTS 兼容模式插件在 Android 平台上的类型映射问题。当 UTS 组件方法返回非基本类型数据给 JavaScript 时,返回值会被错误地映射为数字 0。
问题分析:
- 当前 UTS 到 JS 的类型桥接机制存在缺陷
- 复杂数据类型(如字符串、Map)在跨语言边界传递时丢失了类型信息
- 数字类型虽然能传递,但值被错误地重置为 0
临时解决方案:
- 使用回调函数传递返回值
// UTS 组件侧
getResult(a: number, b: number, callback: (result: number) => void) {
callback(a + b);
}
// JS 调用侧
this.$refs.nativeComp.getResult(2, 8, (result) => {
console.log('正确返回:', result); // 10
});
- 通过事件传递数据
// UTS 组件侧
getResult(a: number, b: number) {
this.$emit('result', a + b);
return 0; // 保持返回数字避免崩溃
}
// JS 调用侧
<native-comp @result="onResult" ref="nativeComp"/>
methods: {
onResult(result) {
console.log('通过事件返回:', result);
}
}
- 存储到共享对象中
// UTS 组件侧
data() {
return {
sharedData: null
}
},
getString() {
this.sharedData = "返回字符串";
return 0;
}
// JS 调用侧通过属性访问
console.log(this.$refs.nativeComp.sharedData);


