Last year, I shipped a plant care app for a client in the UAE. The camera screen took 5 full seconds to load. Users would just stare at a loading spinner, then close the app. That’s not hypothetical — we had logs showing 37% abandoned the app on that screen. After a week of fixes, we got it down to 1.2 seconds consistently. This article explains what I did — and the mistakes I made figuring it out.
FlatList Was My First Win Against Lag
A friend once joked that developers who don’t use FlatList properly are stuck in 2018. He’s not wrong.
In the app I mentioned, the plant photo feed had infinite scroll but was glacial. I checked the network tab: it fetched all images at once. Switching to FlatList with onEndReached cut initial load time by 60%. But I didn’t stop there — I added 3 more tweaks:
- •Set
maxToRenderPerBatchto 6 (we tested numbers — anything over 10 caused lag) - •Used
windowSizeto keep only 5 screens worth of data in memory - •Preloaded images via
Image.prefetchwhen rows came into view
Don’t treat FlatList as a checkbox solution. You have to tweak the config.
Why I Replaced All Image Tags With FastImage
The default Image component in React Native works, but for a real client app? You’ll shoot yourself in the foot.
Switching to react-native-fast-image (v8.3.3) alone reduced the camera screen load time by another 1.5 seconds. We pre-cached the most common plant images to internal storage. One gotcha: in UAE apps, Arabic text sometimes overlaps images — we added resizeMode="contain" to avoid UI glitches on Samsung Galaxy phones with Android 12.
State Management Spaghetti Broke My Frame Rate
I built a component that updated 18 state variables every time the user scrolled. Frame rate dropped to 23 FPS.
The fix? Two steps:
- Moved calculations outside the component using Zustand
- Wrapped static components in
React.memo— but only wherepropschanged < 2% of the time
I’ve done this for a logistics client in Dubai — memoized their fleet tracking map. FPS jumped from 28 to 58.
Animated Libraries Are NOT All the Same
Ever used Lottie for 40 animations on a single screen? No? Good.
I once did that for a Dubai fintech app. FPS dropped to 15. Switched to React Native Reanimated 2.18.3 with the new Skia engine. It’s verbose, but the animations now run at 59 FPS. Don’t use Lottie for 10+ animations — trust me, I learned the hard way.
Upgrading Metro Bundler Was Overlooked, But Lifesaving
Most React Native developers don’t touch Metro config until they have to. My client’s app froze 10% of the time on Android 11.
The fix?
- •Upgraded Metro from 0.74 to 0.76
- •Set
symbolicateNativeStackTracestofalsein release builds - •Modified Babel config to exclude
@babel/plugin-transform-classesfor Android
Yes, that last one sounds scary. No, your app won’t explode. It just compiles faster.
Code Splitting: Split My App Into 3 Bundles
One client had a 90MB APK — half was unused code. We split the app into 3 dynamic bundles:
- •Core: Auth, Settings
- •Feature A: Plant Database
- •Feature B: AI Scanner
Used React.lazy with Suspense. Initial install size went from 90MB to 38MB. UAE users with cheap 4G connections loved it — retention improved by 12%.
Analytics Caught a Memory Leak I Missed
I’d shipped the Greeny Corner app thinking everything was fine. Then Flipper showed increasing memory usage on the camera screen.
Root cause? The AI plant scanner kept referencing a destroyed view in a closure. Used React Native Debugger to inspect retained object sizes. Fixed by removing stale refs in useEffect cleanup.
Animations Killed My Battery Usage Stats
One client complained their app drained 20% battery in 30 minutes. Turns out, the background animation ran requestAnimationFrame() even when screen wasn’t visible.
Solution:
- •Wrapped animation with
InteractionManager.runAfterInteractions - •Used
useIsFocused()from React Navigation to pause off-screen animations
Battery drain dropped to 5% in the same test period.
How to Debug React Native Performance Issues?
Use React Native Debugger or Flipper to check FPS, memory usage, and network requests. In UAE projects, I always run tests on actual devices — Android Go phones in particular, since they’re common in the GCC region.
Is FastImage the Best Solution for React Native Apps?
It’s solid for most apps, but if you need advanced features like dynamic resizing or SVG support, try React Native Fast Image Pro (not free, but worth it for enterprise UAE clients).
Why Does My React Native App Lag on Android?
Common issues: unoptimized images, excessive state updates, or legacy libraries still using JSC. I saw one client app using a 2019 library for maps — upgraded it and FPS doubled.
How Do I Reduce React Native App Size?
Enable Metro’s enableHermes in react-native.config.js. For UAE clients building bilingual apps, split code by language using import() dynamically.
I’ve spent years debugging performance for UAE and GCC clients — from AI-heavy apps to limo booking platforms. If you're struggling with React Native performance, let’s fix it together. Get in touch or book a free consultation.