【问题标题】:Initializing @StateObject with parameters [duplicate]使用参数初始化@StateObject [重复]
【发布时间】:2022-01-19 00:45:32
【问题描述】:

假设我有这样的观点:

struct Parent: View {
  var data: Int

  var body: some View {
    Child(state: ChildState(data: data))
  }
}

struct Child: View {
  @StateObject var state: ChildState
  var body: {
    ...
  }
}

class ChildState: ObservableObject {
  @Published var property: Int
  ...

  init(data: Int) {
    // ... heavy lifting
  }
}

我的理解是 Childinit 方法不应该做任何繁重的计算,因为它可以被 SwiftUI 一遍又一遍地调用。因此,应该在标有@StateObject 装饰器的ChildState 类中完成繁重的工作,以确保它在渲染周期中持续存在。问题是,如果 Parent.data 发生变化,我如何向下传播,以便 ChildState 也知道更新?

也就是说,我确实想要ChildState 的新实例,或者当且仅当Parent.data 发生变化时更新ChildState。否则,ChildState 不应更改。

【问题讨论】:

  • 在 Parent 中将其作为 @StateObject 属性,然后将其传递给作为 @ObservedObject 属性的子视图

标签: ios swift swiftui


【解决方案1】:

您还需要使父状态可观察。我会这样做:

class ParentState: ObservableObject {
    @Published var parentData = 0
}

class ChildState: ObservableObject {
    @Published var childData = 0
}

struct Parent: View {
    @StateObject var parentState = ParentState()
    @StateObject var childState = ChildState()

    var body: some View {
        ZStack {
            Color.black

            VStack {
                Text("Parent state \(parentState.parentData) -- click me")
                    .onTapGesture {
                        parentState.parentData += 1
                    }

                Child(parentState: parentState, childState: childState)
            }
        }
    }
}

struct Child: View {
    @ObservedObject var parentState: ParentState
    @ObservedObject var childState: ChildState

    var body: some View{
        Text("Child state \(childState.childData) parentState \(parentState.parentData) -- click me")
            .onTapGesture {
                childState.childData += 1
            }
    }
}

struct ContentView: View {
    var body: some View {
        Parent()
    }
}

使用 Xcode 13.1 测试

当然,将子状态对象传递给子视图的初始化程序并没有错,就像您展示的那样。它仍然可以正常工作,我只是想让示例尽可能清晰。

【讨论】:

  • 好的,如果我将示例中的第 2 行从 var data: Int 更改为 @State var data: Int,会达到预期的效果吗?
  • 嘿,是的,that 也可以。也许我的第一个例子太复杂了?‍♂️
猜你喜欢
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
相关资源
最近更新 更多