我有一个视图,要求从api获取数据。 我对SwiftUI的理解是,通过使用onAppear,将调用api,更新viewmodel属性,并更改StateObject,这将触发View重绘。
问题是没有重绘。
我可以看到正在发生api调用,并且在使用解码后的数据之后添加调试,我可以看到返回了很多数据。
我删除了很多代码,以使逻辑更容易理解(如下)。
用@ObservedObject替换@StateObject并从父级传递到视图也没什么区别。
谢谢
struct FactoryDetailView: View {
var factory: Factory
@StateObject var factoryDetailsViewModel: FactoryDetailsViewModel()
var body: some View {
VStack {
Text(factory.name)
ForEach(factoryDetailsViewModel.details) { det in
Text(det)
}
}
.onAppear { factoryDetailsViewModel.loadDetails(factory) }
}
}
视图模型:
class FactoryDetailsViewModel: ApiViewModel {
@Published var details: [ String ]
func loadDetails(factory: Factory) {
// Do api call...
self.objectWillChange.send()
self.details = decodedResultsFromApiCall
self.objectWillChange.send()
}
class ApiViewModel: ObservableObject {
}
答案 0 :(得分:0)
好吧...删除的详细信息可能是问题的原因,但一般方法应如下所示
struct FactoryDetailView: View {
...
// assume it is a type and here there is initialization
@StateObject var factoryDetailsViewModel = FactoryDetailsViewModel()
...
关于self.objectWillChange.send()
的知识-请勿调用它,修改已发布的属性会自动调用
func loadDetails(factory: Factory) {
// Do api call...
{
// this is inside (!) API callback
DispatchQueue.main.async {
// update published property on main queue, always.
self.details = decodedResultsFromApiCall
}
}
}
答案 1 :(得分:0)
答案如下:
@Published property wrapper not working on subclass of ObservableObject
我看到的问题是相同的-将ObservableObject子类化。
我现在有了一个由父类中的'@Published var api_response'工作的解决方案,并从子类的属性中删除了@Published(尽管在它们中保留了'@Published'似乎没有任何副作用,所以它们如果只是为了记录意图,也可以保留。)
感谢您的答复。