Как показывать локальное изображение до тех пор, пока NetworkImage () не загружается с перебоями?

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

Я хочу показывать локальное изображение в CircleAvatar, пока NetworkImage полностью не загрузится из Интернета.


person Ajay Kumar    schedule 08.10.2017    source источник


Ответы (10)


Вы можете попробовать FadeInImage, заключенный в _ 2_. FadeInImage предоставляет свойство placeholder, которое вы можете использовать во время загрузки сетевого образа.

Примечание. ClipOval может быть дорогостоящим, если вы делаете это много, поэтому используйте его экономно.

person Collin Jackson    schedule 09.10.2017
comment
как я могу использовать заполнитель для NetworkImage, пока NetworkImage не загружен? любой пример будет высоко оценен. Спасибо - person Kamlesh; 29.05.2021

Используйте StateflWidget, и вы можете добавить listener к ImageStream и переопределить initState, чтобы запустить замену между локальным изображением и изображением, полученным из Интернета, когда оно полностью загружено.

Я использовал изображение с высоким разрешением, чтобы показать время загрузки:

введите описание изображения здесь

  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,
          ),)
        )
    );
  }
}
person Shady Aziza    schedule 08.10.2017
comment
BoxDecoration не имеют свойства ширины и высоты - person Nicholas Jela; 31.05.2018
comment
это в виджете "Контейнер", а не в BoxDecoration - person Shady Aziza; 31.05.2018
comment
Это решило мою проблему, ключевую вещь, которую мне нужно было знать, когда изображение было загружено. - person Jaween; 29.06.2019
comment
как я могу показать CircularProgressIndicator вместо backgroundImage _loadImage. Пожалуйста, предложите. Спасибо - person Kamlesh; 29.05.2021

Для этого появился новый официальный виджет!

Сначала создайте папку с именем assets в корневом каталоге проекта.

Затем укажите папку в pubspec.yaml файле (также находящемся в корневом каталоге проекта):

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

Вы можете поместить туда картинку, например, как ./assets/loading.gif.

Loading.gif

(Если вы изменили файлы в папке с ресурсами, горячая перезагрузка не сработает. Не забудьте полностью перезапустить приложение.)

Теперь вы можете обратиться к файлу загрузки в коде:

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

Для получения дополнительной информации: https://flutter.io/docs/cookbook/images/fading-in-images#from-asset-bundle.

person user1032613    schedule 14.12.2018
comment
FadeInImage нельзя передать как изображение в CircleAvatar. - person ; 13.05.2019
comment
Моему виджету нужен imageProvider. Пожалуйста, подскажите, как я могу использовать ваши решения FadeInImage и сетевых изображений для показа изображений? Спасибо. - person Kamlesh; 29.05.2021
comment
Я использую пакет photo_view, доступный по адресу pub.dev/packages/photo_view. Мой код выглядит следующим образом: PhotoView (imageProvider: NetworkImage (widget.photoPath.toString (),),), Пожалуйста, подскажите, как я могу использовать изображение-заполнитель, пока сетевое изображение не будет загружено. Большое спасибо. - person Kamlesh; 29.05.2021

Пока загружаются большие изображения, покажите резервный ресурс!

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

https://github.com/FaisalAbid/pluto

person Ajay Kumar    schedule 09.10.2017

Два способа решить вашу проблему

1) Использование Image.network: если вы хотите, чтобы при загрузке изображения отображалась полоса прогресса, медленное кипение или любой другой виджет.

  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) Использование FadeInImage: если вы хотите отображать локальное изображение при загрузке сетевого изображения

 FadeInImage.assetNetwork( 
    image:"URL",
    placeholder:"assets/loading.png" // your assets image path
    fit: BoxFit.cover,
  )
person Sanjayrajsinh    schedule 11.12.2019
comment
Моему виджету нужен imageProvider. Пожалуйста, подскажите, как я могу использовать ваши решения? Спасибо. - person Kamlesh; 29.05.2021
comment
Я использую пакет photo_view, доступный по адресу pub.dev/packages/photo_view. Мой код выглядит следующим образом: PhotoView (imageProvider: NetworkImage (widget.photoPath.toString (),),), Пожалуйста, подскажите, как я могу использовать изображение-заполнитель, пока сетевое изображение не будет загружено. Большое спасибо. - person Kamlesh; 29.05.2021

Вы можете использовать FadeInImage.

Использовать заполнитель из ресурса

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

Используйте заполнитель по памяти

FadeInImage.memoryNetwork(
                                      placeholder: localImageBytes,
                                      image:"URL"
                                    ),
person Abir Ahsan    schedule 28.03.2020
comment
Я использую пакет photo_view, доступный по адресу pub.dev/packages/photo_view. Мой код выглядит следующим образом: PhotoView (imageProvider: NetworkImage (widget.photoPath.toString (),),), Пожалуйста, подскажите, как я могу использовать изображение-заполнитель, пока сетевое изображение не будет загружено. Большое спасибо. - person Kamlesh; 29.05.2021
comment
@Kamlesh Пожалуйста, создайте новый вопрос - person Abir Ahsan; 29.05.2021
comment
Спасибо, Abir, я решил проблему, другой пользователь stackoverflow поделился лучшим решением для решения этой проблемы. - person Kamlesh; 29.05.2021

Я разработал пакет с именем flutter_url_image_load_fail, чтобы определить загрузку и не удалось для загрузки виджетов:

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
)
person WiseTap    schedule 28.03.2019

Для этого вы можете использовать пакет Кэшированный сетевой образ. CachedNetworkImage можно использовать напрямую или через ImageProvider.

Создайте CircleAvatar вот так

CircleAvatar(
  radius: 50,
  foregroundColor: Colors.transparent,
  backgroundColor: appThemeColor.shade50,
  child: CachedNetworkImage(
    imageUrl: UserInfoData.instance.getUserImageUrl(),
    placeholder: (context, url) => CupertinoActivityIndicator(),
    imageBuilder: (context, image) => CircleAvatar(
      backgroundImage: image,
      radius: 40,
    ),

    errorWidget: (context, url, error) => CircleAvatar(
      backgroundColor: Colors.grey,
      child: userProfileAvatarPlaceholder,
      radius: 40,
    ),
  ),
),

введите описание изображения здесь

person Paresh Mangukiya    schedule 05.04.2021
comment
Я использую пакет photo_view, доступный по адресу pub.dev/packages/photo_view. Мой код выглядит следующим образом: PhotoView (imageProvider: NetworkImage (widget.photoPath.toString (),),), Пожалуйста, подскажите, как я могу использовать изображение-заполнитель, пока сетевое изображение не будет загружено. Большое спасибо. - person Kamlesh; 29.05.2021

Появился новый cached_network_image пакет с изображениями «загрузка» и «ошибка». Наряду с автоматическим кешированием изображений. https://stackoverflow.com/a/57493334/5502121

Вы можете установить в качестве заполнителя все, что захотите, например, из ваших ресурсов используйте Image.asset('assets/images/my_placeholder.png')

person Kirill Karmazin    schedule 14.08.2019

Вы также можете использовать свойство frameBuilder. Хорошая новость: здесь вы можете реализовать свой собственный виджет-заполнитель.

Image.network('https://example.com/my-image',
  height: 100,
  frameBuilder: (context, child, frame, _) {
    if (frame == null) {
      // fallback to placeholder
      return MyPlaceholderWidget();
    }
    return child;
  }
)
person Tien Do Nam    schedule 16.12.2020