Loading

SwiftUI init函数中查询并赋值数据

问题重现

@State不生效

struct ProductDetailView: View {    
@State private var product: ProductModel
    init(refId: String) {
        let mProduct = AppLocalAPI.findProduct(refId: refId)
        _product = State(initialValue: mProduct)
    }
    
    var body: some View {
        ....
    }
}

// 外部调用
ProductDetailView(refId: ...)

该代码是,传入一个id给view,view通过数据库获取商品信息,赋值到 state 变量。
实际运行会发现,只有第一次传入的id才生效。

后续的 _product = State(initialValue: mProduct) 赋值都没有使得界面刷新

解决方法

改用 @ObservedObject,把 product 放到class里面。

struct ProductDetailView: View {
        class ViewModel: ObservableObject {
        @Published var product = ProductModel(refId: "", retailPrice: 0, tradePrice: 0)

        init(refId: String) {
            product = AppLocalAPI.findProduct(refId: refId) ?? product
        }
        
        
    }
    @ObservedObject var vm: ViewModel
    
    var body: some View {
        ....
    }
}

// 外部调用
ProductDetailView(vm: ...)

原理

https://onevcat.com/2021/01/swiftui-state/

posted @ 2022-06-20 10:45  逆行  阅读(219)  评论(0编辑  收藏  举报