环境对象
本课属于 Coddy Swift 学习旅程的“SwiftUI 入门”单元。第 41 课,共 50 课。
把一个对象逐层传递给需要它的视图会很麻烦。你可以把它放在环境中,这样下方的任何视图都能读取它:
@StateObject private var cart = Cart()
var body: some View {
NavigationStack {
ShopView()
}
.environmentObject(cart)
}更下方的视图通过 @EnvironmentObject 声明它需要的对象,且不设置初始值:
struct CartBadge: View {
@EnvironmentObject var cart: Cart
var body: some View {
Text("\(cart.count) in cart")
}
}ShopView 从未提到购物车,但其中的 CartBadge 仍会获取同一个对象。如果上层视图都没有通过 .environmentObject 提供这个对象,那么显示 CartBadge 时,应用会因错误而停止运行。
挑战
中等CartBadge 应显示共享购物车的数量。使用 .environmentObject 将 cart 提供给 VStack,并将 CartBadge 改为使用 @EnvironmentObject 读取它。点击一次后,徽标必须显示 1 in cart。
亲手试试
import SwiftUI
@main
struct CoddyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
SwiftUI 入门中的所有课
自己练习: SwiftUI 在线编辑器