You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter实现网络图片加载失败时显示本地资源图片的方法

Flutter网络图片加载失败时显示本地占位图的解决方案

方案1:利用Image.network的errorBuilder(原生无依赖)

这是最轻量化的原生实现方式,通过Image.network自带的错误回调,在网络图片加载失败时返回本地资源图片。

String imageNetworkLink = "someUnstableLink";

Image.network(
  imageNetworkLink,
  // 可选:加载过程中显示的占位组件
  loadingBuilder: (context, child, loadingProgress) {
    if (loadingProgress == null) return child;
    return const Center(child: CircularProgressIndicator());
  },
  // 加载失败时渲染本地图片
  errorBuilder: (context, error, stackTrace) {
    return Image.asset('assets/images/error_placeholder.png');
    // 也可以用AssetImage的形式:
    // return const Image(image: AssetImage('assets/images/error_placeholder.png'));
  },
  fit: BoxFit.cover,
);

注意:本地资源必须在pubspec.yaml中正确声明,示例配置如下:

flutter:
  assets:
    - assets/images/error_placeholder.png

方案2:使用FadeInImage实现过渡+ fallback(原生无依赖)

FadeInImage原生支持占位图与目标图的渐显过渡,同时可以通过imageErrorBuilder处理加载失败的情况,兼顾用户体验与容错逻辑。

String imageNetworkLink = "someUnstableLink";

FadeInImage(
  // 加载中和加载失败的基础占位图
  placeholder: const AssetImage('assets/images/loading_placeholder.png'),
  // 目标网络图片
  image: NetworkImage(imageNetworkLink),
  // 网络图加载失败时替换为错误占位图
  imageErrorBuilder: (context, error, stackTrace) {
    return Image.asset('assets/images/error_placeholder.png');
  },
  fit: BoxFit.cover,
);

方案3:第三方包cached_network_image(适合复杂场景)

如果需要图片缓存、更灵活的占位/错误逻辑,cached_network_image是不错的选择,它内置了完整的错误 fallback 机制,还能自动缓存已加载的网络图片。

首先在pubspec.yaml中添加依赖:

dependencies:
  cached_network_image: ^3.2.3 # 请使用最新版本

然后实现代码:

String imageNetworkLink = "someUnstableLink";

CachedNetworkImage(
  imageUrl: imageNetworkLink,
  placeholder: (context, url) => const CircularProgressIndicator(),
  // 加载失败时显示本地图片
  errorWidget: (context, url, error) => Image.asset('assets/images/error_placeholder.png'),
  fit: BoxFit.cover,
);

内容的提问来源于stack exchange,提问作者Gwhyyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:45:39