KMP WasmJs项目中如何正确显示字符串数组资源?
Kotlin Multiplatform WASM Web端访问字符串数组元素触发WebAssembly异常
问题详情
- 环境:Kotlin Multiplatform Wizard生成项目,WasmJS目标,webpack-dev-server@4.15.2
- 触发异常的代码:
Text(text = stringArrayResource(Res.array.item_list)[0])
- 字符串资源文件(
res/values/strings.xml):
<resources> <string name="app_name">TestWeb</string> <string-array name="item_list"> <item>item 1</item> <item>item 2</item> <item>item 3</item> </string-array> </resources>
- 异常表现:Web端(Chrome、Firefox均测试)触发WebAssembly异常;但调用
toString()可正常输出[item 1, item 2, item 3],安卓和桌面端无此问题。
原因
Kotlin Multiplatform的WasmJS目标中,stringArrayResource返回的对象并非原生Kotlin数组,而是跨平台资源适配层的包装对象。该对象支持toString()方法,但未实现数组下标访问的操作符重载,直接用[index]访问会触发底层类型不匹配的异常。
解决方案
方案1:转换为原生集合类型
将资源对象转换为List<String>或Array<String>后再访问元素:
// 转换为List val itemList = stringArrayResource(Res.array.item_list).toList() Text(text = itemList[0]) // 或转换为Array val itemArray = stringArrayResource(Res.array.item_list).toTypedArray() Text(text = itemArray[0])
方案2:调用包装对象的get方法
部分资源包装类提供了get方法,可直接通过索引获取元素:
Text(text = stringArrayResource(Res.array.item_list).get(0))
验证
上述方案在WasmJS Web端、安卓、桌面端均可正常运行,既保证了跨平台一致性,又解决了Web端的异常问题。
内容的提问来源于stack exchange,提问作者Orlay Garcia Duconge
相关产品推荐
相关产品推荐

