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 应该返回数字10
  • getString 应该返回字符串’aaa’
  • getMap 应该返回一个map

实际结果:

  • getResult 返回数字0
  • getString 返回数字0
  • getMap 返回数字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

示例图片

test-2.zip


更多关于uni-app uts兼容模式插件 组件函数返回值无效 永远返回数字0的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

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

临时解决方案:

  1. 使用回调函数传递返回值
// 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
});
  1. 通过事件传递数据
// 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);
    }
}
  1. 存储到共享对象中
// UTS 组件侧
data() {
    return {
        sharedData: null
    }
},
getString() {
    this.sharedData = "返回字符串";
    return 0;
}

// JS 调用侧通过属性访问
console.log(this.$refs.nativeComp.sharedData);
回到顶部