我有一个视图,需要从api获取数据。我对SwiftUI的理解是,通过使用onAppear,api将被调用,视图模型属性将被更新,StateObject将被更改,这将触发视图重绘。
问题是没有重绘发生。
我可以看到发生了api调用,在使用解码的数据后添加debug,我可以看到返回了大量数据。
我删除了很多代码,以使逻辑更容易理解(如下所示)。
用@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 {
}发布于 2020-10-01 22:20:41
好吧..。删除的细节可能是问题的原因,但通常的方法应该如下所示
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-01 22:58:26
这就是答案:
@Published property wrapper not working on subclass of ObservableObject
我看到的问题也是一样的--将ObservableObject子类化。
我现在已经有了一个解决方案,在父类中使用“@Published var api_response”,并从子类的属性中删除@Published(尽管在子类中保留“@Published”似乎不会造成任何副作用,所以如果只是为了记录意图,它们也可以保留下来)。
感谢您的回复。
https://stackoverflow.com/questions/64157178
复制相似问题