当前位置: 首页 > 知识库问答 >
问题:

flutter - 为什么FadeInImage在图片加载成功后仍显示占位符?

姬欣怡
2024-10-07
  FadeInImage(
    fit: BoxFit.cover,
    image: ResizeImage(
        NetworkImage(snapshot.data!.artUri.toString(),
            headers: const {
              'User-Agent':
                  'Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36',
            }),
        width: 100),
    placeholder: MemoryImage(kTransparentImage),
    imageErrorBuilder: (context, url, error) {
      return const Image(
        image: ResizeImage(AssetImage('assets/images/album.png'),
            width: 100),
      );
    },
  ),
))),

当图片加载失败后会显示imageErrorBuilder,再更改snapshot.data!.artUri为正常Uri并且重新构建后会一直显示占位符(一片白色),即使在Devtools Network中看到图片请求成功且没有异常,仍为占位符,不会显示图片

共有2个答案

姜景焕
2024-10-07
基本用法:
FadeInImage.assetNetwork(
            placeholder: 'assets/loading.gif',
            image: 'https://picsum.photos/250?image=9',
          )

placeholder: 本地的一张图片
image: 是图片的url

你上面的image属性是一个组件(不是图片url)估计这里有问题;可以使用上面的基本用法逐步添加代码排查一下

关宏毅
2024-10-07

出现FadeInImage在图片加载成功后仍显示占位符的问题,可能是由于几个不同的原因导致的。基于你提供的代码和描述,以下是一些可能的原因及相应的解决方案:

1. 图片加载状态未正确更新

FadeInImage组件依赖于其image属性中的图片加载状态来显示相应的图像或占位符。如果图片加载状态没有正确更新(例如,由于网络请求库或状态管理的问题),则可能会持续显示占位符。

解决方案

  • 确保snapshot.data!.artUri在状态更新后确实指向了一个有效的图片URL。
  • 检查是否有任何异步操作或状态更新被延迟或阻塞。

2. ResizeImage组件的问题

在你的代码中,ResizeImage可能是一个自定义组件,用于调整图片大小。如果ResizeImage内部没有正确处理图片加载状态或图片数据,它可能会阻止FadeInImage接收到正确的图片加载信号。

解决方案

  • 检查ResizeImage组件的实现,确保它正确地将图片加载状态传递给其子组件。
  • 尝试直接使用NetworkImage而不通过ResizeImage,看问题是否仍然存在。

3. 缓存问题

如果图片被缓存,并且缓存的图片是损坏的或无法正确显示的,那么即使URL更新为有效的图片,也可能仍然显示占位符。

解决方案

  • 清除应用的缓存并重新加载图片。
  • NetworkImage中设置cachePolicyCachePolicy.noCache来强制不使用缓存。

4. Flutter或Dart的bug

虽然不太可能,但有时Flutter或Dart的bug也可能导致此类问题。

解决方案

  • 确保你的Flutter和Dart环境是最新的。
  • 搜索是否有其他开发者报告了类似的问题。

5. 调试和日志

添加日志输出以跟踪图片加载的状态和过程,这可以帮助你更清楚地了解问题所在。

示例

print("正在加载图片: ${snapshot.data!.artUri}");

FadeInImage的父组件或相关逻辑中添加此类日志输出,可以帮助你跟踪图片的加载和显示过程。

综上所述,你需要检查图片URL的有效性、ResizeImage组件的实现、缓存策略以及Flutter/Dart环境,以诊断并解决这个问题。

 类似资料:
  • 我正在尝试使用Glide在Listview中加载一些图像。如果加载图像时未使用占位符,则图像将正确加载。然而,当我试图设置占位符时,我正在通过网络加载的图像似乎被拉伸了。这仅在使用占位符图像的情况下发生。如果我离开屏幕并返回(因此没有加载占位符图像),则图像会正确显示。 这是我的简单Glide实现:

  • 问题内容: 我将ajax与jquery一起使用,当我尝试在弹出窗口中显示结果时。然后警报始终显示 编辑: 问题答案: 尝试在函数的最后一行添加或。

  • 下面是一个div块: 我用html2canvas把这个div生成了图片,然后用jspdf把图片保存成pdf格式。 现在的问题是html2canvas把div生成图片时DIV里面的图片没有显示,这图片是需要单独处理吗?有遇到过这问题的没? 下面是代码:

  • 本文向大家介绍js实现图片在未加载完成前显示加载中字样,包括了js实现图片在未加载完成前显示加载中字样的使用技巧和注意事项,需要的朋友参考一下

  • 问题内容: 这个想法是在下载真正的高分辨率图像之前显示图像的低分辨率版本,最好使用img标签。 低分辨率图像将首先显示,下载后将替换为高分辨率图像。如何才能做到这一点?是否可以编辑img.src属性,还是应该创建其他内容(例如具有背景的包装div或另一个临时div)? 问题答案: 您可能想要创建一个指令,实际上我将把hires作为属性,因此默认情况下它以绝杀开头。 JS: HTML:

  • 动态绑定src后,img标签不显示图片,点击右键加载后才显示,这是为什么? 如下图 我在vue中动态绑定的img标签的src属性,其中src是一个服务端返回的网络地址 注:该src地址是我阿里云OSS中保存的图片URL地址,已经绑定了自定义域名,并且允许跨域访问,且没有设置防盗链。浏览器是edge 我在img标签中直接把url写在src中倒是可以显示图片