使用expo-image-picker选择图片时为何出现Promise拒绝?
解决expo-image-picker返回结果无assets字段的问题
这是因为expo-image-picker的版本差异导致返回格式不同:
- 版本 >=13.0.0:调用
launchImageLibraryAsync/launchCameraAsync会返回包含assets数组的对象,需通过result.assets[0]获取选中的图片资源 - 版本 <13.0.0:返回的是单个媒体对象,直接通过
result.uri、result.assetId等字段访问即可
具体解决步骤
1. 确认当前包版本
运行以下命令查看expo-image-picker的版本:
npm list expo-image-picker # yarn 用户执行 yarn list expo-image-picker
2. 对应版本修改代码
情况1:版本 <13.0.0(旧版本)
直接使用返回的result对象,无需访问assets:
import * as ImagePicker from 'expo-image-picker'; const pickImage = async () => { const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); if (!permission.granted) { alert('请授予相册访问权限'); return; } const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, quality: 1, }); if (!result.cancelled) { // 直接使用result的字段 console.log('图片URI:', result.uri); console.log('Asset ID:', result.assetId); // 后续上传逻辑用result.uri即可 } };
情况2:版本 >=13.0.0(新版本)
如果想保持result.assets[0]的写法,先升级到最新版本:
npm install expo-image-picker@latest # yarn 用户执行 yarn add expo-image-picker@latest
然后使用官方文档的标准写法:
import * as ImagePicker from 'expo-image-picker'; const pickImage = async () => { const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); if (!permission.granted) { alert('请授予相册访问权限'); return; } const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, quality: 1, }); if (!result.cancelled) { const selectedImage = result.assets[0]; console.log('图片URI:', selectedImage.uri); console.log('Asset ID:', selectedImage.assetId); } };
3. 临时兼容写法(可选)
如果需要同时兼容新旧版本,可添加判断逻辑避免报错:
if (!result.cancelled) { const imageAsset = result.assets ? result.assets[0] : result; // 使用imageAsset.uri等字段处理上传 }
内容的提问来源于stack exchange,提问作者Hornik Taras
相关产品推荐
相关产品推荐

