Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cache memory image using Image.memory() or MemoryImage() flutter?

How to cache memory image using Image.memory() or MemoryImage() flutter ?

i have i list of data but the image type is bytes. i was using Image.memory() or MemoryImage() inside of Gridview.builder but it's blinking every re render the grid example when pagin(new data is coming), or scrolling.

Thanks for help 🙏

Code:

StreamBuilder<List<Datum>>(
        stream: _provider.promotionsStream,
        builder: (BuildContext context, AsyncSnapshot<List<Datum>> snapshot) {
          return Padding(
            padding: EdgeInsets.only(top: 16.0),
            child: NotificationListener<ScrollEndNotification>(
              onNotification: (scrollEnd) {
                if (scrollEnd.metrics.pixels >=
                    scrollEnd.metrics.maxScrollExtent * .45) {
                  _provider.nextPage();
                }
                return true;
              },
              child: SingleChildScrollView(
                child: Column(
                  children: [
                    GridView.builder(
                      shrinkWrap: true,
                      physics: BouncingScrollPhysics(),
                      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                        crossAxisCount: 3,
                      ),
                      itemCount:
                          _provider.dataLentgh > 16 ? _provider.dataLentgh : 18,
                      itemBuilder: (ctx, idx) {
                        Datum? _data = snapshot.data == null
                            ? null
                            : _provider.dataLentgh > idx
                                ? snapshot.data![idx]
                                : null;

                        return AspectRatio(
                          aspectRatio: 1.0,
                          child: Container(
                            padding: EdgeInsets.all(2.0),
                            alignment: Alignment.center,
                            width: 60,
                            decoration: BoxDecoration(
                              color: Colors.white,
                              border:
                                  Border.all(color: Colors.grey, width: 0.5),
                            ),
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: [
                                Container(
                                  width: 60,
                                  height: 60,
                                  decoration: BoxDecoration(
                                    image: _data == null
                                        ? null
                                        : _data.imageUrl.isEmpty
                                            ? null
                                            : DecorationImage(
                                                fit: BoxFit.contain,
                                                image: Image.memory(
                                                  Uint8List.fromList(
                                                      _data.imageBytes),
                                                ).image,
                                              ),
                                    color: Colors.transparent,
                                  ),
                                ),
                              ],
                            ),
                          ),
                        );
                      },
                    ),
                    
                  ],
                ),
              ),
            ),
          );
        },
      ),

the data come from the API with bytes type need to display that in gridview as image. but the issues is blinking eah time the data updated or scrolling

like image 659
Darmawan Z. Avatar asked Jun 22 '26 10:06

Darmawan Z.


1 Answers

Finally found the solution, i just customize the Image Provider to cache the Image with bytes type. here is the code

https://gist.github.com/darmawan01/9be266df44594ea59f07032e325ffa3b

Maybe there is another way to do this you guys want to share with anyone who read this post. i will appreciate that.

Hope this help 🎉

like image 162
Darmawan Z. Avatar answered Jun 25 '26 00:06

Darmawan Z.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!