颤抖如何处理Image.network错误(例如404或错误的URL)

moh*_*ani 8 http-status-code-404 flutter

Image.network网址错误或目的地指向404时如何处理。

例如尝试

Image.network('https://image.tmdb.org/t/p/w92')
Run Code Online (Sandbox Code Playgroud)

Nir*_*ane 47

我已经使用 errorBuilder 处理了与 404 相关的网络图像问题。

Image.network('Your image url...',
    errorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) {
        return Text('Your error widget...');
    },
),
Run Code Online (Sandbox Code Playgroud)

errorBuilder 属性

  • 如果用户在加载图像之前返回到屏幕,我会收到异常错误。仅发生在 URL 返回 404 的情况下,否则一切正常。如何预防呢? (4认同)
  • 太棒了,很有魅力,也是最优雅的解决方案 (2认同)

Pha*_*vij 12

更新:看看使用内置方法的新的准确方法,由@Niraj Phutane在这里回答,不需要插件。


旧答案

我建议使用cached_network_image,它提供了添加占位符图像的选项,以及在 404 或 403 的情况下的错误小部件。

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

  • 当状态代码为 404 时,“CachedNetworkImage”会导致应用程序冻结 (15认同)
  • CachedNetworkImage在404时仍然抛出异常 (5认同)

小智 9

可以使用 Image.network 或 Image.asset 中的 errorBuilder

Image.network(
       path.image,
       width: 40,
       height: 40,
       errorBuilder: (BuildContext context, Object exception,
            StackTrace? stackTrace) {
         return const Text('');
       },
Run Code Online (Sandbox Code Playgroud)


Pra*_*ani 7

当您在加载图像时发现 404 或任何其他错误时,您可以显示来自资产的图像。

我所做的是:

  FadeInImage(
      image: NetworkImage("imageUrl"),
      placeholder: AssetImage(
          "assets/images/placeholder.jpg"),
      imageErrorBuilder:
          (context, error, stackTrace) {
        return Image.asset(
            'assets/images/error.jpg',
            fit: BoxFit.fitWidth);
      },
      fit: BoxFit.fitWidth,
    )
Run Code Online (Sandbox Code Playgroud)

检查imageErrorBuilder财产。


moh*_*ani 6

代替Network.image使用NetworkImageWithRetry

https://pub.dartlang.org/documentation/flutter_image/latest/

例:

var avatar = Image(
  image: NetworkImageWithRetry('http://example.com/avatars/123.jpg'),
);
Run Code Online (Sandbox Code Playgroud)

  • 出现404错误时,`NetworkImageWithRetry`会做什么? (3认同)
  • @krupeshAnadkat将`flutter_image:^ 1.0.0`添加到您的`pubspek.yaml`文件中 (3认同)

Blo*_*oss 6

您可以使用ImageStream它来处理错误。

class CustomProductImage extends StatefulWidget {
  final String image;

  const CustomProductImage(this.image);

  @override
  State<CustomProductImage> createState() => _CustomProductImageState();
}

class _CustomProductImageState extends State<CustomProductImage> {
  Widget mainWidget = const CircularProgressIndicator(); // Placeholder widget
  @override
  void initState() {
    super.initState();

    Image image = Image.network(widget.image, width: 50, height: 50);

    final ImageStream stream = image.image.resolve(ImageConfiguration.empty);

    stream.addListener(ImageStreamListener((info, call) {
      if (!completer) {
        completer = true;
        setState(() {
          mainWidget = image;
        });
      }
    }, onError: (dynamic exception, StackTrace? stackTrace) {
      print('Error is $exception , stack is $stackTrace');
      setState(() {
        mainWidget = const Icon(Icons.error); // Error Widget
      });
    }));
  }

  @override
  Widget build(BuildContext context) {
    return mainWidget;
  }
}
Run Code Online (Sandbox Code Playgroud)