Flutter – Standardbild zu Image.network, wenn es fehlschlägt

Lesezeit: 4 Minuten

Gibt es eine Möglichkeit, Ausnahmen zu steuern, die von Image.network() gestartet werden, damit Sie ein Standard-AssetImage bereitstellen können?

  • Was meinst du mit Ausnahme? ]

    – Rémi Rousselet

    11. April 2018 um 10:11 Uhr

  • Fehler, zum Beispiel beim Versuch, eine URL zu lesen, die nicht existiert

    – Jesus Martín

    11. April 2018 um 11:01 Uhr

Benutzer-Avatar
Schattige Aziza

Es hängt von Ihrem Anwendungsfall ab, aber eine Möglichkeit, dies zu tun, ist die Verwendung FadeInImage die eine Eigenschaft von hat img für das Bild, das geladen werden soll, und placeholdernaja, für den Platzhalter

FadeInImage(image: NetworkImage(url), placeholder: AssetImage(assetName)

Sie können auch zuhören, bis das Bild geladen ist, und selbst einen Platzhalter anzeigen, bis das Abrufen des Bilds aufgelöst ist.

Pseudo-Code

bool _loaded = false;
var img = Image.network(src);
var placeholder = AssetImage(assetName)

@override
void initState() {
  super.initState();
  img.image.resolve(ImageConfiguration()).addListener((i, b) {
    if (mounted) {
      setState(() => _loaded = true);
    }
  });     
}

@override
Widget build(BuildContext context) { 
  return YourWidget(
    child: _loaded ? img : placeholder,
  );
}

  • You can also listen until the image is loaded sprechen über ImageProvider würde hier helfen. Da Bild kein Hörbares enthält.

    – Rémi Rousselet

    11. April 2018 um 11:20 Uhr

Benutzer-Avatar
Lay Leangsros

Sie können mit FadeInImage.assetNetwork tun

 child: new Container(
      child: FadeInImage.assetNetwork(
          placeholder: 'assets/place_holder.jpg',
          image:url
      )
  )

und in pubspec.yaml

  assets:
  - assets/place_holder.jpg

  • Wie behandelt man eine Null-URL mit FadeInImAGE?

    – Md. Sulayman

    14. Juli 2020 um 7:47 Uhr


  • Sie sollten den vollständigen Pfad angeben, nicht nur den Namen.

    – Haley Huynh

    6. Oktober 2020 um 20:02 Uhr

  • Platzhalter erfordert absoluten Pfad. relativer Pfad funktioniert nicht! Irgendwelche Gründe oder Vorschläge?

    – Aayush Shah

    23. Juni 2021 um 4:56 Uhr

Benutzer-Avatar
Kirill Karmazin

Es gibt ein neues Paket namens cached_network_image was tut, was Sie brauchen. Hier können Sie direkt ein „Loading“-Bild und ein „Error“-Bild einstellen.

Eine Flutter-Bibliothek, um Bilder aus dem Internet anzuzeigen und im Cache-Verzeichnis zu halten.
https://pub.dev/packages/cached_network_image#-readme-tab-

CachedNetworkImage(
        imageUrl: "http://via.placeholder.com/350x150",
        placeholder: (context, url) => new CircularProgressIndicator(),
        errorWidget: (context, url, error) => new Icon(Icons.error),
     ),

oder Sie können beispielsweise Ihr eigenes Asset-Bild als Platzhalter verwenden:

...
placeholder: (context, url) => {return Image.asset('assets/img/my_placeholder.png');},

Fügen Sie dies der Datei pubspec.yaml Ihres Pakets hinzu:

dependencies:
  cached_network_image: ^1.1.1

und importieren Sie Ihren Dart-Code:

import 'package:cached_network_image/cached_network_image.dart';

  • this: placeholder: (context, url) => {return Image.asset(‘assets/img/my_placeholder.png’);}, funktioniert überhaupt nicht

    – Körnel

    27. April 2020 um 18:01 Uhr

  • @Kornel versuche es mit (context) => Image.asset(‘assets/img/my_placeholder.png’),

    – Yumarx Polanco

    25. Oktober 2020 um 2:57 Uhr

Sie können die Eigenschaften loadingBuilder und erroBuilder wie in der offiziellen Widget-Dokumentation angegeben verwenden:

               Image.network(
                  'https://example.com/image.jpg',
                  errorBuilder: (context, error, stackTrace) {
                    print(error); //do something
                  },
                  loadingBuilder: (BuildContext context, Widget child,
                      ImageChunkEvent loadingProgress) {
                    if (loadingProgress == null) return child;
                    return Center(
                      child: CircularProgressIndicator(
                        value: loadingProgress.expectedTotalBytes != null
                            ? loadingProgress.cumulativeBytesLoaded /
                                loadingProgress.expectedTotalBytes
                            : null,
                      ),
                    );
                  },
                ),

https://api.flutter.dev/flutter/widgets/Image/loadingBuilder.html
https://api.flutter.dev/flutter/widgets/ImageErrorWidgetBuilder.html

Problem:

Image.Network bietet keine Funktion zum Anzeigen eines Fehler-Widgets, wenn das Bild aus irgendeinem Grund nicht erfolgreich geladen wurde. Das bedeutet, dass Ihre URL immer korrekt sein sollte?

Das Flutter-Team hat am 13.01.2020 ein neues Video über Image Widget hochgeladen (https://www.youtube.com/watch?v=7oIAs-0G4mw), aber sie haben immer noch keine Lösung bereitgestellt. Wir hoffen, dass das Flutter-Team dieses Problem bald lösen wird.

Lösung: Sie können ein zwischengespeichertes Netzwerkbild verwenden, das viele Features/Funktionalitäten bietet, um ein Bild von einer URL zu laden. Um mehr über gecachte Netzwerkbilder zu erfahren, besuchen Sie bitte:

https://pub.dev/packages/cached_network_image

Beispielcode des Pakets:

CachedNetworkImage(   
imageUrl: "http://via.placeholder.com/200x150",  
imageBuilder: 
(context, imageProvider) => 
    Container(
     decoration: BoxDecoration(
      image: DecorationImage(
          image: imageProvider,
          fit: BoxFit.cover,
          colorFilter:
              ColorFilter.mode(Colors.red, BlendMode.colorBurn)),
     ),   
    ),   
 placeholder: (context, url) => 
   CircularProgressIndicator(),  
 errorWidget: (context, url, error) 
  => Icon(Icons.error),
),

Benutzer-Avatar
Amit

Ich habe die Möglichkeit gefunden, wie Sie dies verwenden können

     SizedBox(
              height: 50,
              width: 50,
              child: FadeInImage(
                  height: 50,
                  width: 50,
            fadeInDuration: const Duration(milliseconds: 500),
                  fadeInCurve: Curves.easeInExpo,
                  fadeOutCurve: Curves.easeOutExpo,
                  placeholder: AssetImage("assets/images/common_screen/ic_default_image.jpg"),
                  image: NetworkImage(imageURL
                  ),
                  imageErrorBuilder: (context, error, stackTrace) {
                      return Container(child: Image.asset("assets/images/common_screen/ic_default_image.jpg"));
                  },
                  fit: BoxFit.cover),
            )

1019870cookie-checkFlutter – Standardbild zu Image.network, wenn es fehlschlägt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy