uni-app uniapp-x编译Kotlin的问题,不懂Kotlin 求个解决办法
uni-app uniapp-x编译Kotlin的问题,不懂Kotlin 求个解决办法
具体问题可见插件
https://ext.dcloud.net.cn/plugin?id=23422
UTS代码
export async function xRequest<T>(instanceConfig: RequestOptions<any>): Promise<T>{
// #ifdef APP-ANDROID
// 解决Android泛型转换失败问题
// 如果把此处代码移入onSuccess回调中 Android编译会报错 不太清楚什么问题 等研究明白后更新
// 这样也可以正常使用
const v = await _xRequest<T>(instanceConfig) as UTSJSONObject;
return JSON.parse<T>(JSON.stringify(v)) as T;
// #endif
// #ifndef APP-ANDROID
return _xRequest<T>(instanceConfig);
// #endif
}
async function _xRequest<T>(instanceConfig: RequestOptions<any>): Promise<T>{
return createXRequest<APIResponse>(
{...} as XBaseRequestOptions
, {
onRequest: function(config: RequestOptions<any>) {
...
},
onRequestEnd: async function(response: RequestSuccess<APIResponse>) {
if(401 == response.statusCode){
// 无权限/鉴权无效/鉴权过期 无感刷新Token
await refreshToken();
console.log('已刷新鉴权!');
// 返回null 请求重试
return null;
}
return 200 == response.statusCode;
},
onRequestError: function(error: IUniError, response: RequestSuccess<APIResponse> | null) {
....
},
onRequestMonitor: function(response: APIResponse) {
.....
},
onRequestMonitorError: function(response: APIResponse) {
.....
},
onSuccess: function(response: APIResponse) {
return response.data as any | undefined;
//return JSON.parse<T>(JSON.stringify(v)) as T;
}
} as XRequestOptions<APIResponse>
, instanceConfig
) as Promise<T>
}
如果将JSON.parse<T>(JSON.stringify(v)) as T
这句代码放在外层转换,在Android上运行正常
如果将这句代码移入onSuccess里,Android编译失败,报错见图
大佬们给看看,困扰好几天了
更多关于uni-app uniapp-x编译Kotlin的问题,不懂Kotlin 求个解决办法的实战教程也可以访问 https://www.itying.com/category-93-b0.html
4 回复
JSON.parse<T>(JSON.stringify(v)) as T 这一句代码需要将泛型实体化,这就导致编译器需要将整个方法编译为inline+reified函数,这种函数又会导致需要函数表达式编译为lambda,而lambda又会引发一些return语句的调整,上述的调整可能存在一些边界情况出现问题,稍后排查一下,看看如何解决
感谢 alphav版修复请告知下
这是一个典型的UTS到Kotlin类型转换问题。从错误日志看,Kotlin编译器无法正确处理泛型类型T在回调函数中的传递。
主要原因:
- UTS的泛型在编译到Kotlin时,类型擦除导致回调函数内部无法正确推断T的类型
- Android平台对泛型的处理比iOS/web更严格
解决方案:
- 保持现有写法(外层转换)是最稳妥的方式
- 如果必须在内层转换,可以尝试:
onSuccess: function(response: APIResponse) {
const data = response.data;
return JSON.parse(JSON.stringify(data)) as any;
}