I want to discuss about problem I’m facing in a flutter app.
The app is a social E-Commerce app with layout like Facebook or Instagram. I am using pagination of 10 posts with multiple images max 4 per post like a grid view.
When i scroll upto 5-8 pages app crashes due to large number of images being render.
I have tried many solutions but didn’t get ride of the problem. Following are list of some solutions that i have tried till now.
-
Tried cached_network_image plugin. app crashes on upto 50-60 posts or estimatedly upto 200 images scrolling.
-
Tried optimized_cached_image.
Crash rate is minimized little bit and i was able to scroll upto 250-300 images and then app again crashed. -
Tried FadeInImage.network and FadeInImage.memoery widgets but app also crashes when scrolled upto even 100 images.
-
Download images to local directory and then tried to display images using Image.memory and Image.file widgets. But this solution also didn’t work.
Can you suggest me any solution to sort out this issue
3
Answers
If the response contains the large scale of images then use background fetching before you list is being ended .
so before your screen renders you’ll already have a data.
I was having the same issue when using the CacheNetworkImage . So I decided to dowload the images and save it in Device Storage and then shows the Image using Image.file().But i didnt wanted the images to load when i scroll down, so i used "AutomaticKeepAliveClientMixin" but it work for few images , not with long image list.The app got crashed again.
my image size were between 300 kb to 500 kb. and using CacheWidth and Cache height make the images to blur.
Solution
so I reduce the image sizes to between 50 kb and 100 kb.
And I use
precacheImage(FileImage())
to render the images earlyand use Listview.builder() to only render the images that are visible on the screen (To avoid using too many RAM space on Device which cause app crush)
I remove AutomaticKeeepAliceMixin to save Device memory
Getting storage Location
}
downloadig images to device
}
reading local images
}
showing image in Listview.builder
i use propertyItem to decide the size of the widget of my listview.Set the firstImage of your list in propertyItem. so all the images in listview will take the size of firstimage .
Summary Explanation
Depends on how many images are being rendered on UI and the size of the images, the use of device memory usage is increased .
In flutter Image Widgets are called expensive widgets , I hope this is helpful.
Image widget in flutter is an expensive widget. It’s a problem of your images which are of very high quality. Whenever you use list of such high quality images, ram consumption increases which leads your phone to lag, not your app.
SOLUTION:
Use cacheHeight & cacheWidth property inside Image.asset widget or Image.network() widget. Set it to around 200 to keep a balance between quality and performance.
Image.asset(
"your_image",
cacheHeight: 200,
cacheWidth: 200,
),
I hope this helps.