升级expo-image-picker后React Native Android构建报错:ifNull未解析等问题
升级expo-image-picker至12.0.2后Android构建失败的问题排查与解决
问题描述
将expo-image-picker从11.0.3版本升级至12.0.2版本后,执行React Native Android构建时出现Kotlin编译失败,具体错误日志如下:
> Task :expo-image-picker:compileReleaseKotlin FAILED e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (25, 36): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (131, 39): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (133, 7): 'return' is not allowed here e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (138, 71): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (140, 7): 'return' is not allowed here e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (193, 7): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (195, 7): 'return' is not allowed here e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (200, 39): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (202, 7): 'return' is not allowed here e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (325, 8): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (327, 9): 'return' is not allowed here e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (376, 8): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (378, 9): 'return' is not allowed here e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (381, 46): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt: (383, 7): 'return' is not allowed here e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerOptions.kt: (4, 36): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerOptions.kt: (40, 9): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerOptions.kt: (42, 9): 'return' is not allowed here e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerUtils.kt: (11, 36): Unresolved reference: ifNull e: /Users/user/Desktop/Projects/MyApp/Frontend/Expo/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/ImagePickerUtils.kt: (32, 39): Unresolved reference: ifNull w: Detected multiple Kotlin daemon sessions at build/kotlin/sessions FAILURE: Build failed with an exception.
已尝试的解决方法
- 修改AndroidManifest.xml
- 执行
gradle clean - 删除.gradle缓存文件
- 在
gradle.properties中添加如下配置:org.gradle.daemon=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - 在
build.gradle中添加:dexOptions { javaMaxHeapSize "3g" } - 执行命令:
./gradlew -stop
问题原因
核心错误是Unresolved reference: ifNull,这个ifNull是Expo Modules Core库中的Kotlin扩展函数。升级后的expo-image-picker@12.0.2依赖的Expo Modules Core版本与你项目中现有版本不兼容,导致编译时无法找到该扩展方法。后续的'return' is not allowed here错误是ifNull引用失败引发的连锁问题,并非独立错误。
解决方案
1. 升级Expo Modules Core版本
expo-image-picker@12.0.2需要依赖较新版本的expo-modules-core,执行以下命令更新:
npm install expo-modules-core@latest # 若使用yarn则执行: yarn add expo-modules-core@latest
2. 清理依赖缓存并重新安装
# 删除node_modules和锁文件 rm -rf node_modules package-lock.json yarn.lock # 重新安装依赖 npm install # 或使用yarn yarn install
3. 重新同步Android项目依赖
进入Android目录执行:
cd android ./gradlew clean ./gradlew assembleRelease
4. 确认Expo SDK版本兼容性
如果项目基于Expo SDK,需确保SDK版本与expo-image-picker@12.0.2匹配。查看expo-image-picker版本说明,确认对应的最低SDK版本要求,若不匹配则同步升级Expo SDK。
内容的提问来源于stack exchange,提问作者Steven Matthews
相关产品推荐
相关产品推荐

