@EnvironmentObject не работает через navigationLink

Я использую свой @EnvironmentObject, чтобы мои TeamData могли использовать другие, но это не работает. Когда я перехожу к другому представлению с помощью navigationLink в списке, все в порядке. Когда я нажимаю кнопку для того же просмотра, происходит сбой ..
Кажется, я что-то неправильно поставил. Может ли кто-нибудь помочь в этом вопросе? Означает ли это, что мне нужно сначала добавить @EnvironmentObject в NavigationView, чтобы я мог его использовать? Спасибо

Демо: https://youtu.be/-iRadrHd94c

import SwiftUI

struct GameRecordListView: View {
@EnvironmentObject var teamResult : TeamResult

@State var hint : String = ""
@State var successRegistration : Bool = false
@State var sheetPresented: Bool = false
var body: some View {
     VStack{

        List(0 ..< 12){ item in
            NavigationLink(destination: GameDetailRecordView()){   <-this works well
                Text("444")

            }
        }
        VStack{
            Spacer()
            HStack{
                Spacer()
                NavigationLink(destination: GameDetailRecordView())  <-this doesn't works well and crashed
                {
                    Image(systemName: "pencil.circle")
                        .resizable()
                        .frame(width: 35, height: 35)
                        .padding(12)
                        .background(Color.blue)
                        .foregroundColor(Color.white)
                        .clipShape(Circle())

                }
            }.padding(15)

        }

     }.onAppear(perform: {
        print("teamResult:\(self.teamResult.groupID):\(self.teamResult.groupName)")
     })
}
}

Я создаю объект enviromentObject в этом представлении

import SwiftUI
import SwiftyJSON

struct TeamDetail: View {
@EnvironmentObject var teamResult : TeamResult
//    @ObservedObject var teamResult: TeamResult
var roles = ["GameRecord", "Schedule", "Money", "Member"]
@State var show = false
@State private var selectedIndex = 0
var body: some View {
    ZStack{
        VStack {
            Picker(selection: $selectedIndex, label: Text("")) {
                ForEach(0..<roles.count) { (index) in
                    Text(self.roles[index])
                }
            }
            .pickerStyle(SegmentedPickerStyle())

            HStack{
                containedView()

            }
            Spacer()

            }


        }.navigationBarTitle(teamResult.groupName)
        .onAppear(perform:{

        })
}



//select different view by selectedIndex
func containedView() -> AnyView {
   switch selectedIndex {
   case 0:
       return AnyView(
            GameRecordListView().environmentObject(teamResult)   <-create environmentObject here
       )

   case 1:

      return AnyView(Text("")
           .padding(30))


   case 2:
      return AnyView(
        BookkeepingView().environmentObject(teamResult)

    )


   default:
    return AnyView(
        TeamMemberListView().environmentObject(teamResult))
}

}
}

Представление, которое я использую @EnviromentObject

import SwiftUI

struct GameDetailRecordView: View {
  @EnvironmentObject var teamResult : TeamResult
  var body: some View {
     Text("ID:\(teamResult.groupID)Name:\(teamResult.groupName)")
  }
}

Сообщение об ошибке:

Fatal error: No ObservableObject of type TeamResult found.
A View.environmentObject(_:) for TeamResult may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55
2020-01-20 01:14:58.466655+0800 Fitness(SwiftUI)[49035:4851345] Fatal error: No ObservableObject of type TeamResult found.
A View.environmentObject(_:) for TeamResult may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55

person frank61003    schedule 19.01.2020    source источник


Ответы (1)


попробуйте добавить environmentObject в представление в NavigationLink

 NavigationLink(destination: GameDetailRecordView().environmentObject(teamResult))
person Kenny Kurochkin    schedule 19.01.2020
comment
Привет, я использую этот метод, и это может сработать. Но я хочу знать, почему NavigationLink в списке не нужно добавлять .environmentObject (teamResult), а еще нужно добавить .environmentObject (teamResult). Означает ли это, что NavigationLink создает новую среду? Я думаю, что все представленные ниже GameRecordListView (). EnvironmentObject (teamResult) могут вообще использовать @environmentObject teamResult. - person frank61003; 20.01.2020
comment
Привет @ frank61003, тебе удалось выяснить, почему это происходит? Я в такой же ситуации. - person Federico Zanetello; 24.03.2020
comment
Похоже, что все environmentObjects не передаются, когда NavigationLink создается динамически во время выполнения. В этих случаях вам нужно снова указать environmentObjects. - person user482594; 10.06.2021