代码之家  ›  专栏  ›  技术社区  ›  fuzzygoat

使用新的@StateObject将模型传递给多个视图?

  •  -1
  • fuzzygoat  · 技术社区  · 4 年前

    如果要在多个视图之间传递模型,是否可以多次使用@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)")
        }
    }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Asperi    4 年前

    @StateObject 是真相的来源,所以它必须在一个地方创建,所以(示意图上是你提供的截图,但不是要修改的代码)

    in App >
      @StateObject private var model = Model()
    
      ...
    
      ContentView().environmentObject(model)
    
      ...
    
    in ContentView >
    
      @EnvironmentObject var model: Model
    
      ...
    
    in AnotherView >
    
      @EnvironmentObject var model: Model
    
        2
  •  1
  •   fuzzygoat    4 年前

    基于已接受答案的小扩展,以便将来的读者能够获得更多的洞察力。

    APPLE: Managing Model Data in Your App

    从苹果文档看来,一个解决方案是在所有三个视图上使用@ObservedObject。

    // MARK: - CONTENT VIEW
    struct ContentView: View {
        @ObservedObject var model: Model
        var body: some View {
            VStack {
                Text("\(model.temperature)")
                AnotherView(model: model)
            }
        }
    }
    

    .

    // MARK: - ANOTHER VIEW
    struct AnotherView: View {
        @ObservedObject var model: Model
        var body: some View {
            Text("\(model.temperature)")
        }
    }
    

    // MARK: - APP.SWIFT
    @main
    struct SwiftUI_DataFlow_005App: App {
        @StateObject var model = Model()
        var body: some Scene {
            WindowGroup {
                ContentView().environmentObject(model)
            }
        }
    }
    

    // MARK: - CONTENT VIEW
    struct ContentView: View {
        @EnvironmentObject var model: Model
        var body: some View {
            VStack {
                Text("\(model.temperature)")
                AnotherView()
            }
        }
    }
    

    .

    // MARK: - ANOTHER VIEW
    struct AnotherView: View {
        @EnvironmentObject var model: Model
        var body: some View {
            Text("\(model.temperature)")
        }
    }