ObservedObject不触发视图重绘

问题描述

我有一个视图,要求从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 {
}

解决方法

好吧...删除的详细信息可能是问题的原因,但一般方法应如下所示

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

答案如下:

@Published property wrapper not working on subclass of ObservableObject

我看到的问题是相同的-将ObservableObject子类化。

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

感谢您的答复。