Expo 47+Dev-Client下用expo-sharing分享Assets图片遇参数类型兼容错误
Expo 47 自定义Dev-Client下expo-sharing分享本地图片报错解决
问题背景
使用Expo 47搭配自定义Dev-Client(Android平台),已确认客户端包含所需依赖库,尝试通过expo-sharing分享本地Assets中的图片时触发错误。
示例代码:
import * as Sharing from 'expo-sharing' async function shareImage(imageURI) { try { await Sharing.shareAsync(require('../../../assets/images/motivational/36.jpg')) } catch (error) { console.log(error) } }
报错信息:
[Error: Argument of an incompatible class: class java.lang.Double cannot be passed as an argument to parameter expecting class java.lang.String.]
错误含义
require()加载Expo本地Asset时,返回的是Android平台的资源ID(数字类型,对应Java中的Double),但Sharing.shareAsync()方法要求传入字符串格式的文件URI,类型不匹配导致了这个错误。
解决方法
需要借助expo-asset库将本地Asset转换为可访问的文件URI,步骤如下:
- 确保已安装
expo-asset(Expo 47默认包含,若未安装可执行npx expo install expo-asset) - 修改代码,先加载Asset并获取其本地URI,再传入分享方法:
修改后的代码:
import * as Sharing from 'expo-sharing' import { Asset } from 'expo-asset' async function shareImage() { try { // 加载Asset资源 const asset = Asset.fromModule(require('../../../assets/images/motivational/36.jpg')) await asset.downloadAsync() // 使用Asset的localUri进行分享 await Sharing.shareAsync(asset.localUri) } catch (error) { console.log(error) } }
说明
Asset.fromModule()将require返回的资源ID转换为Asset对象downloadAsync()确保Asset已下载到本地,获取到有效的localUriasset.localUri是字符串格式的本地文件路径,符合shareAsync()的参数要求
内容的提问来源于stack exchange,提问作者GOXR3PLUS
相关产品推荐
相关产品推荐

