How to Show an Local image till the NetworkImage() Loads Up in flutter?
Asked Answered
M

10

22
            new CircleAvatar(
                              backgroundColor: Colors.black87,
                              backgroundImage: new NetworkImage(url),
                              radius: 45.0,
                            )

I Want to show a local image in CircleAvatar until the NetworkImage fully loads from the internet.

Mcfarland answered 8/10, 2017 at 9:50 Comment(0)
W
22

You may want to try a FadeInImage wrapped in a ClipOval. FadeInImage provides a placeholder property you can use while the network image is loading.

Note: ClipOval can be expensive if you do it a lot, so use it sparingly.

Wormseed answered 9/10, 2017 at 17:10 Comment(1)
how can I use placeholder for "NetworkImage" until "NetworkImage" is loaded? any example will be highly appreciated. ThanksGrogan
C
16

There is a new official widget for this now!

First, create a folder called assets in the project root directory.

Then, mention the folder in pubspec.yaml file (also found in the project root directory):

flutter:
  uses-material-design: true
  assets:
    - assets/

You can put a picture there, for example, put this as ./assets/loading.gif.

Loading.gif

(If you changed files in assets folder, hot reload won't work. Make sure you restart the app entirely.)

Now you can refer to the loading file in the code:

FadeInImage.assetNetwork(
  placeholder: 'assets/loading.gif',
  image: 'https://github.com/flutter/website/blob/master/src/_includes/code/layout/lakes/images/lake.jpg?raw=true',
);

For more details: https://flutter.io/docs/cookbook/images/fading-in-images#from-asset-bundle

Cerotype answered 14/12, 2018 at 21:6 Comment(3)
FadeInImage cannot be passed as the image to the CircleAvatarProtege
My widget needs 'imageProvider'. Kindly suggest how can I use your FadeInImage and network image solutions to show image? Thanks.Grogan
I am using photo_view package available at pub.dev/packages/photo_view. My code is as: PhotoView( imageProvider: NetworkImage( widget.photoPath.toString(), ),), Kindly suggest how can I use placeholder image until network image is loaded. Thanks a lot.Grogan
L
14

Use a StateflWidget and you can add a listener to the ImageStream and override the initState to trigger a replacement between the local image and the one obtained from the internet when it is fully loaded.

I have used a high resolution image to show the loading time:

enter image description here

  var _loadImage = new AssetImage(
      'assets/img/basic2-090_loader_loading-512.png');
  var _myEarth = new NetworkImage(
      "http://qige87.com/data/out/73/wp-image-144183272.png");
  bool _checkLoaded = true;

  @override
  void initState() {
    _myEarth.resolve(new ImageConfiguration()).addListener((_, __) {
      if (mounted) {
        setState(() {
          _checkLoaded = false;
        });
      }
    });
  }


  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        body: new Center(child: new Container(
          decoration: new BoxDecoration(shape: BoxShape.circle,),
          height: 80.0,
          width: 80.0,
          child: new CircleAvatar(
            backgroundColor: Theme
                .of(context)
                .scaffoldBackgroundColor,
            backgroundImage: _checkLoaded ? _loadImage : _myEarth,
          ),)
        )
    );
  }
}
Leavetaking answered 8/10, 2017 at 12:4 Comment(4)
BoxDecoration do not have width and height propertyYesman
this is on the Container widget not BoxDecorationLeavetaking
This solved my problem, the key thing I needed to know when the image was loaded.Hinze
how can I show "CircularProgressIndicator" instead of backgroundImage _loadImage. Kindly suggest. ThanksGrogan
B
7

You can also use the frameBuilder property. The good thing: you can implement your custom placeholder widget here.

Image.network('https://example.com/my-image',
  height: 100,
  frameBuilder: (context, child, frame, _) {
    if (frame == null) {
      // fallback to placeholder
      return MyPlaceholderWidget();
    }
    return child;
  }
)
Bonniebonns answered 16/12, 2020 at 16:1 Comment(0)
S
5

Two way to solve your problem

1) Using Image.network : If you want to show progressbar,simmer or any other widget when image loading.

  Image.network(
      "URL",
      fit: BoxFit.cover,
      loadingBuilder: (BuildContext ctx, Widget child, ImageChunkEvent loadingProgress) {
        if (loadingProgress == null) {
          return child;
        }else {
          return Center(
            child: CircularProgressIndicator(
              valueColor: AlwaysStoppedAnimation<Color>(Colors.green),
            ),
          );
        }
      },       
  )



2) Using FadeInImage : If you want to display your local image when network image loading

 FadeInImage.assetNetwork( 
    image:"URL",
    placeholder:"assets/loading.png" // your assets image path
    fit: BoxFit.cover,
  )
Southwestward answered 11/12, 2019 at 5:49 Comment(2)
My widget needs 'imageProvider'. Kindly suggest how can I use your solutions? Thanks.Grogan
I am using photo_view package available at pub.dev/packages/photo_view. My code is as: PhotoView( imageProvider: NetworkImage( widget.photoPath.toString(), ),), Kindly suggest how can I use placeholder image until network image is loaded. Thanks a lot.Grogan
M
3

While large images load, show a fallback asset!

 new PlutoImage.networkWithPlaceholder("http://68.media.tumblr.com/f7e2e01128ca8eb2b9436aa3eb2a0a33/tumblr_ogwlnpSpcU1sikc68o1_1280.png", new Image.asset("assets/placeholder.png"));

https://github.com/FaisalAbid/pluto

Mcfarland answered 9/10, 2017 at 10:46 Comment(0)
F
3

You can Use FadeInImage.

Use a placeholder from asset

FadeInImage.assetNetwork(
                              placeholder: "assets/images/image1.png",
                              image:"URL"
                                ),

Use a placeholder from memory

FadeInImage.memoryNetwork(
                                      placeholder: localImageBytes,
                                      image:"URL"
                                    ),
Fiddlestick answered 28/3, 2020 at 7:3 Comment(3)
I am using photo_view package available at pub.dev/packages/photo_view. My code is as: PhotoView( imageProvider: NetworkImage( widget.photoPath.toString(), ),), Kindly suggest how can I use placeholder image until network image is loaded. Thanks a lot.Grogan
@Grogan Please create a new questionFiddlestick
Thanks Abir, I have solved the issue, another stackoverflow user shared the best solution to fix this issue.Grogan
S
2

I developed a package named flutter_url_image_load_fail to define the loading and failed to load widgets:

LoadImageFromUrl(
    'https://upload.wikimedia.org/wikipedia/commons/1/17/Google-flutter-logo.png', //Image URL to load
    (image) => image, //What widget returns when the image is loaded successfully
    () => Text('Loading...'), //What widget returns when the image is loading
    (IRetryLoadImage retryLoadImage, code , message){ //What widget returns when the image failed to load
        return RaisedButton(
            child: Text('Try Again'),
            onPressed: (){
                retryLoadImage.retryLoadImage(); //Call this method to retry load the image when it failed to load
            },
        );
    },
    requestTimeout: Duration(seconds: 5) //Optionally set the timeout
)
Steffen answered 28/3, 2019 at 18:25 Comment(0)
B
1

Use foregroundImage with NetworkImage as profile image, and use backgroundImagewithAssetImage` as placeholder image, like this:

const CircleAvatar(
  radius: 60,
  backgroundColor: Colors.white,
  backgroundImage: AssetImage('assets/avatar.png'), // Placeholder
  foregroundImage: NetworkImage('https://xxx.xxx.xx.jpg'), // Profile
),
Breann answered 2/3, 2023 at 11:34 Comment(0)
N
0

There is a new cached_network_image package that has a "loading" and an "error" images. Along with auto image caching. https://mcmap.net/q/320102/-flutter-default-image-to-image-network-when-it-fails

You can set as a placeholder anything you want, for example from your assets use Image.asset('assets/images/my_placeholder.png')

Naima answered 14/8, 2019 at 11:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.