ObservedObject未触发视图重绘



我有一个视图,它需要从api获取数据。我对SwiftUI的理解是,通过使用onAppear,将调用api,更新视图模型属性,并更改StateObject,这将触发视图重绘。

问题是没有重新绘制。

我可以看到一个api调用正在发生,在使用解码的数据后添加调试,我可以看到返回了很多数据。

我删除了很多代码,使逻辑更易于遵循(如下(。

将@StateObject替换为@ObservedObject并从父级传递到视图中也没有什么区别。

感谢

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 {
}

嗯。。。删除的细节可能是问题的原因,但总的来说,方法应该像一样

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
}
}
}

答案是:

@已发布的属性包装器不适用于ObservableObject 的子类

我看到的问题是一样的——对ObservableObject进行子类化。

我现在有了一个解决方案,可以在父类中使用"@Published var api_response",并从子类中的属性中删除@Published(尽管在子类中保留"@Published'"似乎不会造成任何副作用,所以如果只是为了记录意图,它们也可以保留下来(。

感谢您的回复。

最新更新