如何通过使用 @EnvironmentObject 路由视图来导航到项目的详细视图?

How can I navigate to a detail view of an item by using an @EnvironmentObject to route the views?

我在 SwiftUI 中有以下代码。我希望它从列表视图导航到 PetView(),并在点击 ForEach 循环中的一个项目或显示“转到第一只宠物”的按钮时显示正确的名称。但是,当我点击某个项目或按钮时,该应用程序不会执行任何操作。我究竟做错了什么?感谢您的帮助!



import SwiftUI

@main
struct TestListAppApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(ViewRouter())
        }
    }
}



import SwiftUI

struct ContentView: View {
    @EnvironmentObject var viewRouter: ViewRouter

    
    var body: some View {
            
            ForEach(viewRouter.pets) { pet in
                NavigationLink(
                    destination: PetView(),
                    tag: pet,
                    selection: $viewRouter.selectedPet,
                    label: {
                        Text(pet.name)
                    }
                )
            }
            
            Button("Go to first pet.") {
                viewRouter.selectedPet = viewRouter.pets[0]
            }
    
        
}
    
}


import Foundation

class ViewRouter: ObservableObject {
    @Published var selectedPet: Pet? = nil
    @Published var pets: [Pet] = [Pet(name: "Louie"), Pet(name: "Fred"), Pet(name: "Stanley")]
}



import SwiftUI

struct PetView: View {
    
    @EnvironmentObject var viewRouter: ViewRouter

    var body: some View {
        Text(viewRouter.selectedPet!.name)
    }
}

import Foundation

struct Pet: Identifiable, Hashable {
    var name: String
    var id: String { name }

}

试试这个:

@main
struct TestListAppApp: App {
@StateObject var viewRouter = ViewRouter()
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(viewRouter)
        }
    }
}
struct PetView: View {
    @EnvironmentObject var viewRouter: ViewRouter
    
    var body: some View {
        if let pet = viewRouter.selectedPet {
            Text(pet.name)
        } else {
            EmptyView()
        }
    }
}

struct ContentView: View {
    @EnvironmentObject var viewRouter: ViewRouter
    
    var body: some View {
        NavigationView {
            List {
                ForEach(viewRouter.pets) { pet in
                    NavigationLink(destination: PetView(),
                                   tag: pet,
                                   selection: $viewRouter.selectedPet,
                                   label: {
                        Text(pet.name)
                    })
                }
                Button("Go to first pet.") {
                    viewRouter.selectedPet = viewRouter.pets[0]
                }
            }
        }
    }
}