1

I am trying to redirect the user to a login page, where they can login using firebase but am given the error above.

I am also using the same code (but altered) to redirect them after they have entered the correct username and password.

First Page

import SwiftUI

struct onboarding1: View {

    @Binding var isOnboardingDone: Bool

    init(_ isOnboardingDone: Binding<Bool>) {
        self._isOnboardingDone = isOnboardingDone
    }

    var body: some View {
        NavigationView {
        ZStack {
            Color("background").edgesIgnoringSafeArea(.all)
        VStack {
            Image("logo")

            Button(action: {
                self.isOnboardingDone.toggle()
            }) {
                Text("toggle")
            }
                }
            }
        }
    }
}
struct shmuck_Previews: PreviewProvider {
    static var previews: some View {
        onboarding1(.constant(false))
    }
}

Other Page

import SwiftUI

struct supporter: View {

   @State var isOnboardingDone = false

        var body: some View {
            Group {
            if isOnboardingDone {
               loginpage()  // error displayed here ('loginpage.Type' is not convertible to '(Binding<Bool>) -> loginpage')
            } else {
                onboarding1($isOnboardingDone)
            }
        }
    }
}

struct supporter_Previews: PreviewProvider {
    static var previews: some View {
        supporter()
    }
}

As requested here is the login page code

Login Page

import SwiftUI
import Firebase

struct loginpage: View {

    @Binding var sos: Bool

       init(_ sos: Binding<Bool>) {
           self._sos = sos
       }

    @State var email = ""
    @State var password = ""
    var body: some View {
      NavigationView {

            ZStack {
                Color("background").edgesIgnoringSafeArea(.all)
            VStack {
                Image("fulllogo")
                    .offset(y: -100)
            Text("username")
                .offset(y: -200)
               TextField("Enter your email", text: $email)
                .offset(y: -200)
            Text("Password")
.offset(y: -200)
            TextField("Enter your password", text: $password)
          .offset(y: -200)
                Button(action: {
                    Auth.auth().signIn(withEmail: self.email, password: self.password) { (result, error) in
                        if error != nil {
                        print(error?.localizedDescription)
                    } else {
                    // user signed in
                        self.sos.toggle()
                    }
                    }
                }) {
                    RoundedRectangle(cornerRadius: 10)
                    .frame(width: 300, height: 40)
                    .overlay(
                    Text("Let's Go!")
                        .foregroundColor(.white)
                    )
                }.offset(y: -180)
            }.navigationBarTitle("Login")

                }
            }
        }
    }

struct heyMama_Previews: PreviewProvider {
    static var previews: some View {
        loginpage(.constant(false))
    }
}

Other Page

import SwiftUI

struct login2: View {
    @State var sos = false
    var body: some View {

                    Group {
            if sos {
                LoggedIn()
            } else {
                loginpage($sos)
            }
        }

    }
}

struct login2_Previews: PreviewProvider {
    static var previews: some View {
        login2()
    }
}

benl134
  • 134
  • 11

2 Answers2

1

As you've declared @Binding var sos: Bool & init it using init(_ sos: Binding<Bool>) method in loginpage, You must have to pass binding variable as argument.

You need to pass binding variable like @State. You can refer this answer for more details about @Binding

Try the below code.

struct supporter: View {

   @State var isOnboardingDone = false
   @State var sos = false

        var body: some View {
            Group {
            if isOnboardingDone {
               loginpage(sos: $sos)  
            } else {
                onboarding1($isOnboardingDone)
            }
        }
    }
}

So, whenever you value of sos variable will change from loginpage it will also reflect on supporter page.

Prayag Gediya
  • 1,078
  • 2
  • 11
  • 20
0

The Code Below Works.

struct supporter: View {

   @State var isOnboardingDone = false
   @State var sos = false

        var body: some View {
            Group {
            if isOnboardingDone {
                loginpage($sos)
            } else {
                onboarding1($isOnboardingDone)
            }
        }
    }
}
benl134
  • 134
  • 11