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

如何让加载失败的Kingfisher KFImage自动折叠?

优化KFImage加载失败自动折叠的方案

你原来的方案逻辑可行,但可以通过补充回调逻辑或调整渲染方式来简化代码,以下两种更简洁的实现方式:

方案一:优化状态控制逻辑

补充失败回调确保URL无效时能正确折叠,同时配合隐藏修饰符彻底清理布局占位:

@State private var shouldShowImage = false

HStack(alignment: .top) {
    KFImage(someUrl)
        .onSuccess { _ in shouldShowImage = true }
        .onFailure { _ in shouldShowImage = false }
        .forceRefresh()
        .resizable()
        .aspectRatio(contentMode: .fill)
        .cornerRadius(20)
        .clipped()
        .frame(width: shouldShowImage ? 150 : 0)
        .hidden(!shouldShowImage)
    Text("some Text")
}
  • 补充onFailure回调,覆盖URL无效、加载失败等所有异常场景
  • .hidden(!shouldShowImage)配合width:0,彻底避免组件在隐藏时仍占用布局空间

方案二:条件渲染图片组件

提前预加载图片,仅在加载成功后才将KFImage加入布局,失败时完全不渲染组件:

@State private var imageLoaded = false

HStack(alignment: .top) {
    if imageLoaded {
        KFImage(someUrl)
            .resizable()
            .aspectRatio(contentMode: .fill)
            .cornerRadius(20)
            .frame(width: 150)
            .clipped()
    }
    Text("some Text")
}
.onAppear {
    KingfisherManager.shared.retrieveImage(with: someUrl) { result in
        imageLoaded = result.isSuccess
    }
}
  • 用KingfisherManager提前校验图片可用性,逻辑更直观
  • 失败时组件不会出现在布局树中,完全不占用空间,布局更干净

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:20:02