Is it obvious this pattern shouldn't work? (adding SwiftUI alert from one level up)

So I read an article about trying to decompose View functionality by use of functions in the View itself, and said, "that sounds cool." Until I ran into this issue. Am I just dumb and it's painfully obvious why this shouldn't work?

So here's the version that works. Tap on the text, alert shows up. Great!

    fileprivate var ctr = 0
    func nextCtr() -> Int {
        ctr += 1
        return ctr
    }

    struct InnerTestView: View {
        @State var showAlert = false
        @State var ntaps = 0

        var body: some View {
            VStack {
                Text("ntimes tapped: \(ntaps)")
                Text("hello. lifetime: \(nextCtr())")
            }.onTapGesture {  self.ntaps += 1
                              self.showAlert = true
            }.alert(isPresented: $showAlert) {
                Alert(title: Text("This is my alert"))
            }
        }
    }

    struct OutterTestView : View {
        var body: some View {
            InnerTestView()
        }
    }

Great. Now let's factor the part about adding the alert. (I know this is trivial, but it's condensed from a more complicated example). I can add a function "addMyAlert()" and then invoke it in the parent:

      struct InnerTestView: View {
            @State var showAlert = false
            @State var ntaps = 0

            var body: some View {
                VStack {
                    Text("ntimes tapped: \(ntaps)")
                    Text("hello. lifetime: \(nextCtr())")
                }.onTapGesture {  self.ntaps += 1
                                  self.showAlert = true
                }
           } 

           func addMyAlert() -> some View {
                return self.alert(isPresented: $showAlert) {
                   Alert(title: Text("This is my alert"))
               }
           }
      }

      struct OutterTestView : View {
        var body: some View {
            InnerTestView().addMyAlert()
        }
    }

This totally fails to work. Why? It registers taps, and if you go into the debugger, you can see the showAlert state variable being changed, but the alert just never shows up.

Someone tell me why it should have been obvious to me that the lifetime of views was going to render this unworkable?