From 63df4ae4f0cdba125833b229a3425adf2a7139cf Mon Sep 17 00:00:00 2001 From: orfelorfel23 Date: Sun, 31 May 2026 20:40:36 +0200 Subject: [PATCH] Migrate from react-native Image to expo-image to permanently resolve Android OutOfMemory crashes with massive local photo decodes --- package-lock.json | 18 ++++++++++++++++++ package.json | 1 + src/screens/PreviewScreen.tsx | 13 ++++++------- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 974a7490..6a62f039 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "expo-build-properties": "~1.0.10", "expo-camera": "~17.0.10", "expo-file-system": "~19.0.23", + "expo-image": "~3.0.11", "expo-image-manipulator": "~14.0.8", "expo-linear-gradient": "~15.0.8", "expo-media-library": "~18.2.1", @@ -4671,6 +4672,23 @@ "react-native": "*" } }, + "node_modules/expo-image": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/expo-image/-/expo-image-3.0.11.tgz", + "integrity": "sha512-4TudfUCLgYgENv+f48omnU8tjS2S0Pd9EaON5/s1ZUBRwZ7K8acEr4NfvLPSaeXvxW24iLAiyQ7sV7BXQH3RoA==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, "node_modules/expo-image-loader": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-6.0.0.tgz", diff --git a/package.json b/package.json index 6b76bb2d..45786942 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "expo-build-properties": "~1.0.10", "expo-camera": "~17.0.10", "expo-file-system": "~19.0.23", + "expo-image": "~3.0.11", "expo-image-manipulator": "~14.0.8", "expo-linear-gradient": "~15.0.8", "expo-media-library": "~18.2.1", diff --git a/src/screens/PreviewScreen.tsx b/src/screens/PreviewScreen.tsx index c6553161..2778613c 100644 --- a/src/screens/PreviewScreen.tsx +++ b/src/screens/PreviewScreen.tsx @@ -3,11 +3,11 @@ import { StyleSheet, Text, View, - Image, TouchableOpacity, ActivityIndicator, } from 'react-native'; import ViewShot from 'react-native-view-shot'; +import { Image } from 'expo-image'; import { LinearGradient } from 'expo-linear-gradient'; import Animated, { FadeIn, FadeOut } from 'react-native-reanimated'; import { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome'; @@ -320,7 +320,7 @@ export default function PreviewScreen({ {photoUris.slice(-3).map((uri, idx) => ( - + ))} @@ -334,7 +334,7 @@ export default function PreviewScreen({ {photoUris.slice(-4).map((uri, idx) => ( - + ))} @@ -347,7 +347,7 @@ export default function PreviewScreen({ {photoUris.slice(-2).map((uri, idx) => ( - + ))} @@ -359,10 +359,9 @@ export default function PreviewScreen({ return ( );