如何解决Kingfisher 更新 KFImage url 不会更新 SwiftUI 中的图像
抱歉初学者的问题,我正在尝试从 UIKit 过渡到 SwiftUI。 @State 变量的 didSet 不会像在 UIKit 中那样被触发。
我有从用户的 photoUrl 加载图像的 KFImage,我想要它在点击时启动图像选择器,然后更新 userUIImage
但由于 KFImage 需要一个 url 来更新,我不知道我该怎么做调用我的 updateUserImage()
更新 photoUrl 以更新 KFImage。
下面是我的代码
struct ProfileView: View {
//MARK: Properties
let screenWidth = UIScreen.main.bounds.width
let screenHeight = UIScreen.main.bounds.height
@State private var isImageLoaded: Bool = false
@State private var showImagePicker = false
@State private var photoUrl: URL? = URL(string: (Customer.current?.photoUrl)!)
@State private var userImage: Image? = Image(uiImage: UIImage())
@State private var userUIImage: UIImage? = UIImage() {
didSet {
if isImageLoaded {
updateUserImage()
}
}
}
var body: some View {
KFImage(photoUrl)
.resizable()
.onSuccess { result in
self.userUIImage = result.image
self.isImageLoaded = true
}
.aspectRatio(contentMode: .fill)
.frame(width: screenWidth / 2.5)
.clipShape(Circle())
.overlay(Circle().stroke(Color.white,linewidth: 4))
.shadow(radius: 10)
.onTapGesture { self.showImagePicker = true }
.sheet(isPresented: $showImagePicker) {
CustomImagePickerView(sourceType: .photoLibrary,image: $userImage,uiImage: $userUIImage,isPresented: $showImagePicker)
}
}
//MARK: Methods
func updateUserImage() {
CustomerService.updateUserImage(image: userUIImage!) { (photoUrl,error) in
if let error = error {
handleError(errorBody: error)
return
}
guard var user = Customer.current else { return }
self.photoUrl = photoUrl
user.photoUrl = photoUrl?.absoluteString
CustomerService.updateUserDatabase(user: user) { (error) in
if let error = error {
handleError(errorBody: error)
return
}
Customer.setCurrent(user,writetoUserDefaults: true)
}
}
}
}
解决方法
尝试改用 onChange
/ onReceive
:
KFImage(photoUrl)
.resizable()
// ...
// remove .onSuccess implementation as self.userUIImage = result.image will result in an infinite loop
.onChange(of: userUIImage) { newImage in
updateUserImage()
}
或
import Combine
...
KFImage(photoUrl)
.resizable()
// ...
.onReceive(Just(userUIImage)) { newImage in
updateUserImage()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。