我可以在 SwiftUI 中对所有共享数据使用 @EnvironmentObject 吗?
Can I use @EnvironmentObject in SwiftUI for all shared data?
SwfitUI
中有 @State
、@ObservedObject
和 @EnvironmentObject
绑定,用于在视图和其他对象之间共享数据。每个都有其指定的用法,但 @EnvironmentObject
似乎是最强大和最容易使用的。那么,我可以将它用于所有状态变量和共享数据吗?这有什么缺点吗?
首先,@EnvironmentObject
用于 类。所以如果你想绑定像 Int 这样的原始类型——你只能使用 Binding
。
其次,我认为当您尝试定义多个 @EnvironmentObject
相同类型时会出现问题。所以,当你可以使用 Binding
时——你应该这样做。那只是我的看法。
class SomeClass: ObservableObject{
@Published var value: Int
init(value: Int){
self.value = value
}
}
struct ContentView: View {
@State var one: SomeClass = SomeClass(value: 1)
@State var two: SomeClass = SomeClass(value: 2)
var body: some View {
Adss().environmentObject(one).environmentObject(two)
}
}
struct Adss: View{
@EnvironmentObject var two: SomeClass
var body: some View{
Text("there must be two: \(two.value)")//prints "1"
}
}
即使不需要,您也必须按顺序定义所有所需类型的对象
SwfitUI
中有 @State
、@ObservedObject
和 @EnvironmentObject
绑定,用于在视图和其他对象之间共享数据。每个都有其指定的用法,但 @EnvironmentObject
似乎是最强大和最容易使用的。那么,我可以将它用于所有状态变量和共享数据吗?这有什么缺点吗?
首先,@EnvironmentObject
用于 类。所以如果你想绑定像 Int 这样的原始类型——你只能使用 Binding
。
其次,我认为当您尝试定义多个 @EnvironmentObject
相同类型时会出现问题。所以,当你可以使用 Binding
时——你应该这样做。那只是我的看法。
class SomeClass: ObservableObject{
@Published var value: Int
init(value: Int){
self.value = value
}
}
struct ContentView: View {
@State var one: SomeClass = SomeClass(value: 1)
@State var two: SomeClass = SomeClass(value: 2)
var body: some View {
Adss().environmentObject(one).environmentObject(two)
}
}
struct Adss: View{
@EnvironmentObject var two: SomeClass
var body: some View{
Text("there must be two: \(two.value)")//prints "1"
}
}
即使不需要,您也必须按顺序定义所有所需类型的对象