How do I make NavigationView
call onAppear()
(or any other functions) whenever it appears, especially when I back out from its child view?
I linked 3 NavigationView
s in this way: TestView
-> SecondView
-> ThirdView
, and I put onAppear()
function on TestView
and SecondView
.
struct TestView: View {
@State var text:String = "This is page 1"
var body: some View {
NavigationView {
VStack {
Text(text)
NavigationLink(
destination: SecondView(),
label: { Text("go to page2") }
)
}
}
.onAppear() {
text += " called+1 "
}
}
}
struct SecondView: View {
@State var text:String = "This is page 2"
var body: some View {
NavigationView {
VStack {
Text(text)
NavigationLink(
destination: ThirdView(),
label: { Text("go to page3") }
)
}
}
.onAppear() {
text += " called+1 "
}
}
}
struct ThirdView: View {
var body: some View {
Text("This is page 3")
}
}
From the function name onAppear()
, I thought it would be invoked every time the view appears. However, it turns out it will only be invoked once when I go deeper into a new view, but NOT invoked when I back out from its child view.
In other words, when the app launches, TestView
's onAppear()
will be called. Then, when I click go to page2
, SecondView
's onAppear()
will be called. Then I click go to page3
, and then I click the back
button on the ThirdView
, SecondView
's onAppear()
will bot be invoked, even though the current view is SecondView
. And it is the same when I click back
on the SecondView
, the TestView
's onAppear()
is not invoked again.
How to call onAppear()
when I click Back
, or used other method to achieve the same result.
You could try this approach, moving the TestView
, .onAppear {..}
to
the VStack{..}
as shown in the example code. Also there is no need
for the SecondView
NavigationView
. With these changes all .onAppear {..}
work well for me.
Note that NavigationView
is deprecated, use the NavigationStack
instead.
struct ContentView: View {
var body: some View {
TestView()
}
}
struct TestView: View {
@State var text:String = "This is page 1"
var body: some View {
NavigationView {
VStack {
Text(text)
NavigationLink(destination: SecondView(), label: { Text("go to page2") })
}
.onAppear {
text += " called+1 "
print("\n------> TestView onAppear ")
}
}
}
}
struct SecondView: View {
@State var text: String = "This is page 2"
var body: some View {
VStack {
Text(text)
NavigationLink(destination: ThirdView(),label: { Text("go to page3") })
}
.onAppear {
text += " called+1 "
print("\n------> SecondView onAppear ")
}
}
}
struct ThirdView: View {
var body: some View {
Text("This is page 3")
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With