Probleme sens d'execution

Bonjour a tous,

voila mon problème.

j’a une variable « message » qui est renseigné via la valeur d’un UserDefault.

le UserDefault est modifié dans une fonction de la class HttpAuth.

Mon problème est que lors la variable UserDefault est modifiée, cela ne met pas à jour la variable message, et donc mon affichage n’est pas bon.

voici mon code:

import Foundation
import SwiftUI
import Combine

struct User: View {
@State var username: String = «  »
@State var password: String = «  »
let defaults = UserDefaults.standard
@State var message = UserDefaults.standard.integer(forKey: « erreur »)

var manager = HttpAuth()

    @ViewBuilder

    var body: some View {
          VStack(alignment: .center) {
            Text("message")
            if message == 25 {
                        VStack(alignment: .center) {
                            Text("Bonjour \(username)")
                            {
                               Text("Se déconnecter")
                               .font(.headline)
                               .foregroundColor(.black)
                               .padding()
                               .frame(width: 220, height: 60)
                               .background(Color(red: 1.0, green: 0.75, blue: 0.0, opacity: 1.0))
                               .cornerRadius(15.0)
                                }
                        .padding()
                    }
                }else {
        VStack(alignment: .center) {
            Text("Se connecter")
                .font(.title)
                  TextField("Username", text: $username)
                    .padding()
                    .background(Color(red: 0.8863, green: 0.8863, blue: 0.8863, opacity: 1.0))
                    .cornerRadius(5)
                    .padding(.bottom, 20)

                  SecureField("Password", text: $password)
                    .padding()
                    .background(Color(red: 0.8863, green: 0.8863, blue: 0.8863, opacity: 1.0))
                    .cornerRadius(5)
                    .padding(.bottom, 20)

            Button(action: {
                if( self.username==("") || self.password==("") ){
                   self.showingAlert = true
                }else{
                         self.manager.checkDetails(username: self.username, password: self.password)
                         self.message = UserDefaults.standard.integer(forKey: "erreur")
                }
              }) {
               Text("LOGIN")
               .font(.headline)
               .foregroundColor(.black)
               .padding()
               .frame(width: 220, height: 60)
               .background(Color(red: 1.0, green: 0.75, blue: 0.0, opacity: 1.0))
               .cornerRadius(15.0)
            }
            .alert(isPresented: $showingAlert) {
            Alert(title: Text("Erreur"), message: Text("Entrez vos identifiants"), dismissButton: .default(Text("OK")))
                }
}
        .padding()
}
        }   
}

struct ServerMessage: Decodable {
    let erreur,username: String
}


class HttpAuth: ObservableObject {

    let defaults = UserDefaults.standard
    var didchange = PassthroughSubject<HttpAuth, Never>()

    var authenticated = false{
        didSet {
            objectWillChange.send()
        }
    }

    func checkDetails(username: String, password: String) {
        
         let url = URL(string: "https://www.google.fr")!

        let body: [String: String] = ["username": username, "password": password]
        let finalBody = try! JSONSerialization.data(withJSONObject: body)

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = finalBody
        
        
        

        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")

            URLSession.shared.dataTask(with: request) { data, response, error in
                if let error = error {
                   
                    fatalError("Error: \(error.localizedDescription)")
                }
                guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
                    
                    fatalError("Error: invalid HTTP response code")
                }
                guard let data = data else {
                    
                    fatalError("Error: missing response data")
                }
                do {
                     let finalData = try? JSONDecoder().decode(ServerMessage.self, from: data)
                    if finalData?.erreur == "1" {
                        print(finalData!)
                       self.defaults.set(25, forKey: "erreur")
                    self.defaults.set("\(String(describing: finalData?.username))", forKey: "username")
                       
                    }else{
                        print(finalData!)
                         self.defaults.set(0, forKey: "erreur")         
                    }
                }
        }.resume()
    }

}
}

Bah oui, c’est normal. UserDefaults ne fait pas partie de SwiftUI. Il appartient à un framework classique, existant depuis longtemps.

@State var message = UserDefaults.standard.integer(forKey: « erreur »)

Pour que ton code fonctionne, il faut que UserDefauts soit capable de modifier automatiquement la variable message, en cas de modification du contenu de la clé « erreur », ce qui n’est pas le cas.

La propriété @State n’a de sens que pour les objets de SwiftUI. Elle ne modifie pas magiquement le comportement des autres frameworks.

Tu dois repenser la logique de ton code.

Ok, je comprends.
Quelle solution j ai pour modifier cette variable « message » depuis la class « HttpAuth« ?

Il te suffit de modifier la variable « message », après chaque modification de la clé « erreur ».

Exemple :

// Ton code :
self.defaults.set(0, forKey: "erreur")
// Ligne supplémentaire :
message = 0