Flutter 颤振如何处理Image.network错误(如404或错误的url)

Flutter 颤振如何处理Image.network错误(如404或错误的url),flutter,http-status-code-404,Flutter,Http Status Code 404,当url错误或目标指向404时,如何处理Image.network 例如尝试 Image.network('https://image.tmdb.org/t/p/w92') 不要使用Network.image使用NetworkImageWithRetry 例如: var avatar = Image( image: NetworkImageWithRetry('http://example.com/avatars/123.jpg'), ); 更新:看看使用内置方法的新精确方法,@Nir

当url错误或目标指向404时,如何处理
Image.network

例如尝试

Image.network('https://image.tmdb.org/t/p/w92')

不要使用
Network.image
使用
NetworkImageWithRetry

例如:

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

更新:看看使用内置方法的新精确方法,@Niraj Phutane回答说,它不需要插件


旧答案 我建议使用,它提供了添加占位符图像的选项,并且在404或403的情况下还提供了一个错误小部件

CachedNetworkImage(
图像URL:“http://via.placeholder.com/350x150",
占位符:(上下文,url)=>new CircularProgressIndicator(),
errorWidget:(上下文、url、错误)=>新图标(Icons.error),
),
我使用它就像
字符串url=
"https://images.unsplash.com/photo-15856192219-dd823a86ebc5?ixlib=rb-1.2.1&ixid=eyjhcbfawqiojeymdd9&auto=format&fit=crop&w=3334&q=80“;
试一试{
返回CachedNetworkImage(
useOldImageOnUrlChange:true,
imageUrl:url,
占位符:(上下文,url)=>CircularProgressIndicator(),
errorWidget:(上下文、url、错误){
返回图像(
图像:AssetImages(图像位置),
);
},
);
}捕获(e){
返回图像(
图像:AssetImages(图像位置),
);
}
为了安全起见,我们使用了捕手


注意:您可能必须声明CachedNetworkImage的实例,这很奇怪,但您无法使用Image.Provider轻松正确地处理错误。 使用这个方便的软件包:

然后在代码中:

backgroundImage: AdvancedNetworkImage(
                    "YOUR IMAGE URL", 
                    fallbackAssetImage: "YOUR DEAULT ASSERT IMAGE eg:assets/default.png"
                  )

您可以使用
ImageStream
来处理错误

class CustomProductImage extends StatelessWidget {
  final String image;

  const CustomProductImage({Key key, this.image}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return buildWidget(image);
  }
}

Widget buildWidget(String url) {

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

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

  stream.addListener(ImageStreamListener((info, call) {
      //you can also handle image loading 
      //example: loading = false;//that's mean image is loaded
  },
      onError: (dynamic exception, StackTrace stackTrace) {
//    print('enter onError start');
//    print(exception);
//    print(stackTrace);
//    print('enter onError end');     
     
   }));

  return image;
}

我也有同样的问题,但是,我使用FadeInImage类的属性“imageErrorBuilder”解决了这个问题

这里有一个链接:

该示例适用于Image.network(),但也适用于FadeInImage

这是我的密码:

FadeInImage(
  imageErrorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) {
    print('Error Handler'); 
    return Container(
      width: 100.0,
      height: 100.0,
      child: Image.asset('assets/img/no_disponible.jpg'),
    );
  },
  placeholder: AssetImage('assets/img/loading.gif'), 
  image: NetworkImage(product.getImg()),
  fit: BoxFit.cover,
  height: 100.0,
  width: 100.0,
), 
例如,如果页面的方向不存在,将执行imageErrorBuilder的功能


我使用的是Flatter 1.20.1

我使用errorBuilder处理了与404相关的网络映像问题

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

当您在加载图像时发现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,
    )

检查
imageErrorBuilder
属性。

我使用了基本图像小部件,并为错误添加了一个错误生成器,为加载状态添加了一个leadingBuilder,为我使用NetworkImageWithRetry的实际图像添加了一个leadingBuilder,这样它将多次尝试加载图像,如果无法加载图像,最后会给您一个错误

Image(
      image: NetworkImageWithRetry(
      'http://ImageUrl.png',),
      errorBuilder: (context, exception, stackTrack) => Icon(Icons.error,),
      loadingBuilder: (context, exception, stackTrack) => CircularProgressIndicator(),
    )

我想应该允许的,但是我自己还没有仔细研究过。你不需要使用以Dart 2.0开头的
new
关键字
NetworkImageWithRetry
当你出现404错误时,
NetworkImageWithRetry
做什么?@krupeshAnadkat将
flatter\u image:^1.0.0
添加到你的
pubspek.yaml
file@krupesh-anadkat还添加导入
导入“软件包:flatter_image/network.dart”@JenJose你考虑过AutomaticEpaLiveClientMixin吗?将它添加到包装器类中,它将保持状态。或者,如果是ListView,您可以将其配置为保持状态:但如果您确实需要使用图像缓存(即precacheImage),我相信有一种方法可以将precacheImage与字节加载相结合。我正考虑就此提出一个问题。
CachedNetworkImage
导致应用程序在状态代码为404CachedNetworkImage时冻结,但在404@Jorge你找到404的解决方案了吗?如果用户在加载图像之前返回屏幕,我会得到异常错误。只有在URL返回404的情况下才会发生,否则一切正常。如何防止这种情况发生?这是这里唯一没有抛出错误并挂起我的应用程序的解决方案。但是在GitHub中,此包被标记为已存档。有人知道为什么吗?它也无法建立在Flatterv1.2.x+上,遗憾的是,我遇到了这个错误:在尝试将它与Flatter1.20.2一起使用时。我仍然不知道如何捕获加载网络映像期间发生的所有错误:-(太棒了,效果很好,最优雅的解决方案也很漂亮!这个错误生成器是最近在2020年初添加的。在我不得不使用“precacheImage”检查url是否工作之前,它确实使代码变得复杂。工作很好。谢谢。如果用户在加载图像之前返回屏幕,我会收到异常错误。只发生在如果URL返回404,否则一切正常。如何防止?