swiftui - 使用新的@StateObject 将模型传递给多个视图?
问题描述
如果您想在多个视图之间传递模型,您可以多次使用@StateObject(参见下面的示例)以便每个视图都可以修改对象吗?我很欣赏使用@EnvironmentObject 会更好地完成这件事,但只是想了解这个新的属性包装器在这种情况下是如何工作的。
// MARK: - MODEL
class Model: ObservableObject {
@Published var temperature = 27.5
}
.
// MARK: - APP.SWIFT
@main
struct SwiftUI_DataFlow_005App: App {
@ObservedObject var model = Model()
var body: some Scene {
WindowGroup {
ContentView(model: model)
}
}
}
.
// MARK: - CONTENT VIEW
struct ContentView: View {
@StateObject var model: Model
var body: some View {
VStack {
Text("\(model.temperature)")
AnotherView(model: model)
}
}
}
// MARK: - ANOTHER VIEW
struct AnotherView: View {
@StateObject var model: Model
var body: some View {
Text("\(model.temperature)")
}
}
解决方案
@StateObject
是事实的来源,所以它必须在一个地方创建,所以(示意图如您提供的屏幕截图,但不是要修改的代码)
in App >
@StateObject private var model = Model()
...
ContentView().environmentObject(model)
...
in ContentView >
@EnvironmentObject var model: Model
...
in AnotherView >
@EnvironmentObject var model: Model
推荐阅读
- c# - 在组合框中设置 SelectedItem
- python - 如何将来自分组数据帧的值归入另一个分组数据帧?
- ruby-on-rails - 如何使用 Rspec 检查方法内的请求标头?
- javascript - 如何在我的应用程序的 two.js 画布上添加事件?
- python - 在 Python 中按列分组时出现关键错误
- php - MySQL 错误:3161 Laravel 无法创建临时表
- drupal - Drupal 8 搜索错误
- debugging - SIGSEGV 错误,代码是正确的,但仍然没有给出任何输出,有人可以解释一下吗
- javascript - 按钮链接到应执行阅读更多功能的页面
- android - Android - 检查应用程序是否已安装在模拟器中