【问题标题】:Force reload Image when url changes SwiftUI当 url 更改 SwiftUI 时强制重新加载图像
【发布时间】:2021-06-27 11:02:09
【问题描述】:

新手(对于 swiftui),我想在 url 准备好后立即显示图像(刷新视图)。显然 State var 还不够。似乎 .onReceive 和发布者可能会有所帮助,但我很无助。 注意:我使用 KingFisher,但任何加载器的情况似乎都是一样的。情况似乎很特殊(创建视图时 url 未准备好)但这是一个更普遍的主题:例如,当请求同步并且个人资料照片需要更新时当其他用户更改它时。

编辑:经过更多测试,如果我们使用 dispachQueue 推迟一秒钟然后尝试更新,则视图似乎已更新。直接使用 firebase onAppear 检索值时不会更新

import SwiftUI
import Firebase
import Kingfisher


struct Test4: View {

    @State private var mProfilePhotoUrl: URL = URL(string:"0")!
 
 var body: some View {
    
 VStack(alignment: .center,spacing : 0){
           
           KFImage(mProfilePhotoUrl)
      
  }.onAppear(){
        setUpProfileElements()
       }
     
    }
    
    private func setUpProfileElements(){

    //    FirebaseRequest -> mProfilePhotoUrl = URL(string: User.profilePhoto)
     
    }
    
}

【问题讨论】:

  • 在这种情况下,这似乎应该是 KingFisher 的责任——我很惊讶它不能处理这种情况。给它加上.id(mProfilePhotoUrl)来强制它在URL改变时改变呢?
  • 这会在使用延迟时更新,但不会在出现使用的 firebase 请求时更新。使用 Id 强制更新成功了。其他人可能会支持这个案子。谢谢!

标签: image swiftui loader event-receiver


【解决方案1】:

这是 jnpdx 答案! 我不知道原因,如果它离显示太近,但视图不会随着 firebase 请求 onAppear 更新,使用 id 会强制刷新。

struct Test4: View {

    @State private var mProfilePhotoUrl: URL = URL(string:"0")!
    *@State private var ID = 0*

 var body: some View {
    
 VStack(alignment: .center,spacing : 0){
           
           KFImage(mProfilePhotoUrl)*.id(ID)*
      
  }.onAppear(){
        setUpProfileElements()
       }
     
    }
    
    private func setUpProfileElements(){

    //    FirebaseRequest -> mProfilePhotoUrl = URL(string: User.profilePhoto)
     //                    *-> self.ID += 1*
    }
    
}

【讨论】:

  • 我需要 2 天才能将自己的答案标记为已接受,但我会的,谢谢
  • 使用 .id() 对我有用,但是我不能使用 .resizable()
  • Ypu 的意思是如果你使用 .frame(w:p1,h:p2),当值更新时图像不会被调整大小?
猜你喜欢
  • 2015-01-19
  • 2014-09-18
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
相关资源
最近更新 更多