Home > Enterprise >  How to access an @State variable inside a separate function
How to access an @State variable inside a separate function

Time:10-04

Code:

//
//  Login.swift
//  test
//
//  
//

//
//  ContentView.swift
//  test
//
//  
//

import SwiftUI
import FirebaseAuth
import FirebaseDatabase

struct SignUp: View {

    @State var Value: String = ""
    @State var username: String = ""
    @State var email: String = ""
    @State var password: String = ""

    var body: some View {
    
    
    
    
        ZStack {
        
            LinearGradient(gradient: Gradient(colors: [Color.blue, Color.white]),   startPoint: .topLeading, endPoint: .bottomTrailing)
            .ignoresSafeArea()
        
        Rectangle()
            .fill(Color.white)
            .frame(width: 300, height: 550)
            .cornerRadius(10)
        
        
        VStack(spacing: 30){
            Image(systemName: "bitcoinsign.circle")
                .font(.system(size: 70, weight: .medium))
                .padding()
            TextField("Username", text: $username)
                .frame(width: 200, height: 30)
                .padding()
                .overlay(RoundedRectangle(cornerRadius: 10.0).strokeBorder(Color.blue, style: StrokeStyle(lineWidth: 2.0)))
                .foregroundColor(.green)
            TextField("Email", text: $email)
                .frame(width: 200, height: 30)
                .padding()
                .overlay(RoundedRectangle(cornerRadius: 10.0).strokeBorder(Color.blue, style: StrokeStyle(lineWidth: 2.0)))
                .foregroundColor(.green)
            TextField("Password", text: $password)
                .frame(width: 200, height: 30)
                .padding()
                .overlay(RoundedRectangle(cornerRadius: 10.0).strokeBorder(Color.blue, style: StrokeStyle(lineWidth: 2.0)))
                .foregroundColor(.green)
            Button(action: {
                    print("Rounded Button")
                }, label: {
                    Text("Sign Up")
                        .frame(width: 200, height: 20, alignment: .center)
                        .padding()
                        .background(Color.blue)
                        .foregroundColor(Color.white)
                        .cornerRadius(15)
                    })
            
        
            
            }
        }
        

        
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        SignUp()
    }
}
}
func signupbuttonpressed(){


    createUser(withEmail: email, password: password, username: username)
}
func createUser(withEmail email: String, password: String, username: String){

    Auth.auth().createUser(withEmail: email, password: password) { (result, error) in
    
        if let error = error {
           print("Failed to sign user up", error.localizedDescription)
           return
        }
    
        else{
            guard let uid = result?.user.uid else { return}
        
            let values = ["email": email, "username":username]
        
           Database.database().reference().child(uid).child("users").updateChildValues(values, withCompletionBlock: { (error, ref) in
            
            if let error = error {
                
                print("failed to update databse values with error", error.localizedDescription)
                
                return
            }
            else {
                print("user successfully created..")
            }
            
            
            
            
            
        })
    }
    
}

}

When I try call the createUser(withEmail: email, password: password, username: username) function, its says Cannot find 'email' in scope. So my question is how am I able to access @State var username: String = "", @State var email: String = "" @State var password: String = "", in the signupbuttonpressed() function? I am kinda new to swift so I may be missing a simple concept, any help will be appreciated.

CodePudding user response:

You should pass arguments inside view, like

Button(action: {
  // here you have access to all view's internal states
  createUser(withEmail: email, password: password, username: username) // << here !!
}, label: {
  Text("Sign Up")
  • Related