簡體   English   中英

SwiftUI NavigationLink isActive 綁定未更新/工作

[英]SwiftUI NavigationLink isActive Binding Not Updated/Working

我有以下內容:

@State private var showNext = false

...
    NavigationStack {
        VStack {
            NavigationLink(destination: NextView(showSelf: $showNext),
                           isActive: $showNext) { EmptyView() }

            Button("Show Next") {
                showNext = true
            }
        }
    }

...

struct NextView: View {
    @Binding var showSelf: Bool

    var body: some View {
        Text("Next")
         .navigationTitle("Next")

        Button("Dismiss") {
            showSelf = false
        }
            .padding(30)
    }
}

點擊Show Next時, NextView會按預期顯示。

但是當點擊Dismiss時,沒有任何反應。

原來showSelf在設置為false之前就已經是false了。 因此,將綁定傳遞給NextView似乎出了點問題。

有什么問題嗎?

該問題是由NavigationStack引起的。 當我用NavigationView替換它時,它按預期工作。

當嵌入NavigationStack時, NavigationLinkisActive綁定似乎不起作用(或不受支持)。

當您沒有正確地為 NavigationView 提供詳細視圖時,有時會發生這種錯誤,例如

NavigationView {
    MainView()
    DetailView()
}

它試圖在層次結構的更下方使用另一個視圖,這可能導致 isActive 之類的東西中斷。 在您的情況下, NextView中可能存在一個錯誤,您有 2 個視圖但沒有容器,請嘗試將其更改為:

struct NextView: View {
    @Binding var showSelf: Bool

    var body: some View {
        HStack {
            Text("Next")
            Button("Dismiss") {
                showSelf = false
            }
        }
        .navigationTitle("Next")
    }
}

另一件非標准的事情是EmptyView的使用。

您正在嘗試混合 iOS >= 16 ( NavigationStack ) 和 iOS < 16 的代碼(以前處理NavigationLink的方法)。 同樣對於 dismiss 部分,它是 iOS < 15。

這是 iOS 16 的代碼:

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationStack {
            VStack {
                NavigationLink {
                    NextView()
                } label: {
                    Text("Show next view")
                }
            }
        }
    }
}

struct NextView: View {
    @Environment(\.dismiss) private var dismiss
    var body: some View {
        VStack {
            Text("You are in the next view")
            Button("Dismiss", action: dismiss.callAsFunction)
        }
        .navigationTitle("Next")
    }
}

我使用了最簡單的NavigationLink結構。 一個更復雜的將與.navigationDestination結合使用。 我發現的最好的例子在這里:

如果您想更深入地了解堆棧的非常奇怪的行為,您可以在這里查看我的帖子: 在與新的導航堆棧組合時發現@State 的奇怪行為 - 這是一個錯誤還是我做錯了?

如果您需要為 iOS < 16 生成代碼,則應將NavigationStack替換為NavigationView並從那里開始工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM