微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kingfisher 更新 KFImage url 不会更新 SwiftUI 中的图像

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?