Menu
CoddyTech

环境对象

本课属于 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 时,应用会因错误而停止运行。

challenge icon

挑战

中等

CartBadge 应显示共享购物车的数量。使用 .environmentObject 将 cart 提供给 VStack,并将 CartBadge 改为使用 @EnvironmentObject 读取它。点击一次后,徽标必须显示 1 in cart。

亲手试试

import SwiftUI

@main
struct CoddyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

SwiftUI 入门中的所有课

自己练习: SwiftUI 在线编辑器