首页 > 解决方案 > 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 {
}

标签: swiftuipublishobservableobject

解决方案


这有答案:

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

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

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

感谢您的回复。


推荐阅读