NavigationLink Push через isActive немедленно закрывается

Я хочу запустить стек навигации в SwiftUI. Таким образом, я хочу запустить второе представление сразу после появления первого представления. Поэтому я хочу использовать @State var, для которого я установил значение true onAppear, и, таким образом, активирует NavigationLink.

Однако подход не работает (без модификаций см. Ниже). Отправка выполняется, а затем сразу же закрывается второе представление (видео ). Это мой образец (Github Repo):

struct SecondView: View {
  var body: some View {
    Text("Second")
      .navigationTitle("Second")
      .onAppear(perform: {
        print("Second: onAppear")
      })
  }
}

struct FirstView: View {
   @State var linkActive = false

   var body: some View {
     NavigationLink(destination: SecondView(), isActive: $linkActive) {
       Text("Goto second")
     }
     .navigationTitle("First")
     .onAppear(perform: {
       print("First: onAppear")
       linkActive = true
     })
     .onChange(of: linkActive) { value in
       print("First: linkActive changed to: \(linkActive)")
     }
   }
 }

 struct SwiftUIView: View {
   var body: some View {
     NavigationView {
       NavigationLink(destination: FirstView()) {
         Text("Goto first")
       }
     }
     .navigationViewStyle(StackNavigationViewStyle())
   }
}

Выход:

First: onAppear
First: linkActive changed to: true
Second: onAppear
First: linkActive changed to: false

Если я изменю onAppear, чтобы установить для linkActive значение true после задержки мин. 0,5 секунды работает. Что здесь не так? Я ожидаю, что SecondView останется на экране, так как я не понимаю, почему isActive снова меняется на false.


person honkmaster    schedule 27.12.2020    source источник
comment
Проблема в том, что вы используете локальное состояние, если можете создать абстрактное представление, или делегат, если он это поддерживает. Прочтите эту статью, если она может вам помочь code.tutsplus.com/tutorials/   -  person Michael    schedule 27.12.2020
comment
Я обязательно использую местный @State. Но я не понимаю, как ваша оценка и ссылка связана с моим вопросом. Я не делюсь данными между представлениями намеренно.   -  person honkmaster    schedule 27.12.2020
comment
Каждый раз, когда вы пытаетесь сохранить данные, называется совместным использованием данных, и вы пытаетесь сделать, чтобы ваше второе представление изменило данные первого представления, которые не будут работать, если только ваши данные не являются глобальным делегатом, а статья отправлено вам, чтобы дать более четкое представление о том, что делать в лучшем случае.   -  person Michael    schedule 27.12.2020
comment
Проблема, с которой вы столкнулись, заключается в том, что все классы являются частными или безопасными.   -  person Michael    schedule 27.12.2020
comment
Либо я совершенно тупой и не понимаю твоего комментария, либо мы говорим мимо друг друга. Второй вид не делает ничего активного, у него нет доступа к NavigationLink, который используется для его отображения. Здесь я использую базовые концепции SwiftUI. И с вашим комментарием о частных, общедоступных классах ... лучше не становится (вы видели, что мы здесь используем структуры). Я чувствую, что меня троллируют.   -  person honkmaster    schedule 27.12.2020
comment
я не знаю, может ли эта ссылка помочь вам наконец stackoverflow.com/questions/60797431/   -  person Michael    schedule 27.12.2020
comment
Я попробовал isActive.toggle вместо isActive = true. Без изменений. Выше добавлены ссылка на репо и видео для всех, кто хочет попробовать и увидеть это своими глазами.   -  person honkmaster    schedule 27.12.2020
comment
Я, должно быть, неправильно прочитал ваш исходный пост, потому что я независимо обнаружил, что если я изменю isActive на true через 0,5 секунды, это сработает. Я тестировал только приращения в 0,1 с, но все, что я могу предложить, это еще одна точка данных, в которой я вижу такое же поведение. 0,4 с, и он немедленно возвращается. 0.5 и остается на SecondView.   -  person drootang    schedule 28.12.2020