0

我有一个需要从 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 {
}
4

2 回答 2

0

这有答案:

@Published 属性包装器不适用于 ObservableObject 的子类

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

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

感谢您的回复。

于 2020-10-01T14:58:26.253 回答
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
          }
     }
}
于 2020-10-01T14:20:41.180 回答