swiftui - 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 {
}
解决方案
这有答案:
@Published 属性包装器不适用于 ObservableObject 的子类
我看到的问题是相同的 - 子类化 ObservableObject。
我现在有了一个解决方案,通过父类中的“@Published var api_response”并从子类中的属性中删除@Published(尽管在其中留下“@Published”似乎不会造成任何副作用,所以它们也可以如果只是为了记录意图,请保留)。
感谢您的回复。
推荐阅读
- machine-learning - XGboost Classifier 迭代训练
- sql - 优化数据库有什么更好的方法:使用一堆带有不同过滤器的存储过程,还是使用一个带有 if 条件的存储过程?
- javascript - 清除除单击的所有复选框之外的所有复选框
- android - Android房间实体,如何处理静态字段?
- python - Python 尝试在与 open 一起使用时出现意外情况
- python - 模板渲染期间的 Django 错误 - 需要 2 个值才能在 for 循环中解压缩;得到 13
- c++ - 使用 OpenCV 调整图像大小时遇到问题
- flutter - 如何使按钮返回其初始状态
- node.js - 节点 ts-jest spyOn 方法不匹配重载
- autodesk-forge - 在 MultiModel Autodesk Forge 中更改 DocumentBrowser 的文档