[RESOLU] FireBase SendPasswordResetEmailAsync et Thread

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Pounky
Messages : 6
Inscription : 08 Sep 2021 02:02
Localisation : Charente-Maritime
Contact :

[RESOLU] FireBase SendPasswordResetEmailAsync et Thread

Message par Pounky » 08 Sep 2021 11:58

Bonjour à tous,
J'ai un problème avec mon loader (une anim dans la même scène qui s'affiche par dessus les autres GameObject) la fonction Show() fonctionne mais Hide() n'a aucun effet, mon anim s'affiche en continu même lorsque la réponse Firebase est récupérée.
Mon projet est une scène d'authentification pour une connexion avec Firebase.
L'anim "loader" permet à l'utilisateur de patienter et visualiser que la tâche est effectuée (register, login etc. ...)

Voici le script du "Loader" :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Loader : MonoBehaviour
{
    public GameObject PanelLoader;
    public void Show()
    {
        PanelLoader.SetActive(true);
    }

    public void Hide()
    {
        PanelLoader.SetActive(false);
    }
}
La partie du script qui gère la reinitialisation du mdp (là où je rencontre le problème)

Code : Tout sélectionner

//Réinitialisation du mdp
    public void ReinitPassword()
    {
        loader.Show();
        auth.SendPasswordResetEmailAsync(emailReinitField.text).ContinueWith(task => {

   if (task.IsCompleted) {

        Debug.Log("Envoi de l'email réussi");
        confirmReinitText.text = "Message envoyé à " + emailReinitField.text;
        loader.Hide();
        return;
    }

    else if (task.IsFaulted) {

        Debug.LogWarning("Erreur " + task.Exception);
        warningReinitText.text = "Erreur ! Vérifiez l'adresse e-mail";
        loader.Hide();
    }
  });
}
Par contre tout fonctionne parfaitement pour le register et le login, voici le script intégral :

Code : Tout sélectionner

using System.Collections;
using UnityEngine;
using Firebase;
using Firebase.Auth;
using TMPro;

public class FirebaseManager : MonoBehaviour
{
    //Firebase variables
    [Header("Firebase")]
    public DependencyStatus dependencyStatus;
    public FirebaseAuth auth;    
    public FirebaseUser User;

    //Login variables
    [Header("Login")]
    public TMP_InputField emailLoginField;
    public TMP_InputField passwordLoginField;
    public TMP_Text warningLoginText;
    public TMP_Text confirmLoginText;

    //Register variables
    [Header("Register")]
    public TMP_InputField usernameRegisterField;
    public TMP_InputField emailRegisterField;
    public TMP_InputField passwordRegisterField;
    public TMP_InputField passwordRegisterVerifyField;
    public TMP_Text warningRegisterText;
    private Loader loader;

    //Reinit variables
    [Header("Reinit")]
    public TMP_InputField emailReinitField;
    public TMP_Text warningReinitText;
    public TMP_Text confirmReinitText;
    

    void Awake()
    {
        //Chargement de l'anim Loader
        loader = GetComponent<Loader>();
        //Vérification de la présence de toutes les dépendances nécessaires pour Firebase
        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
        {
            dependencyStatus = task.Result;
            if (dependencyStatus == DependencyStatus.Available)
            {
                //Si elles sont toutes disponibles lancement de l'initialisation de Firebase
                InitializeFirebase();
            }
            else
            {
                Debug.LogError("Could not resolve all Firebase dependencies: " + dependencyStatus);
            }
        });
    }

    private void InitializeFirebase()
    {
        Debug.Log("Setting up Firebase Auth");
        //Set the authentication instance object
        auth = FirebaseAuth.DefaultInstance;
    }

    //Function for the login button
    public void LoginButton()
    {
        //Call the login coroutine passing the email and password
        StartCoroutine(Login(emailLoginField.text, passwordLoginField.text));
    }
    //Function for the register button
    public void RegisterButton()
    {
        //Call the register coroutine passing the email, password, and username
        StartCoroutine(Register(emailRegisterField.text, passwordRegisterField.text, usernameRegisterField.text));
    }

    private IEnumerator Login(string _email, string _password)
    {
        loader.Show();
        //Call the Firebase auth signin function passing the email and password
        var LoginTask = auth.SignInWithEmailAndPasswordAsync(_email, _password);
        //Wait until the task completes
        yield return new WaitUntil(predicate: () => LoginTask.IsCompleted);

        if (LoginTask.Exception != null)
        {
            //If there are errors handle them
            Debug.LogWarning(message: $"Failed to register task with {LoginTask.Exception}");
            FirebaseException firebaseEx = LoginTask.Exception.GetBaseException() as FirebaseException;
            AuthError errorCode = (AuthError)firebaseEx.ErrorCode;

            string message = "Échec de la connexion";
            loader.Hide();
            switch (errorCode)
            {
                case AuthError.MissingEmail:
                    message = "E-mail manquant";
                    loader.Hide();
                    break;
                case AuthError.MissingPassword:
                    message = "Mot de passe manquant";
                    loader.Hide();
                    break;
                case AuthError.WrongPassword:
                    message = "Mauvais mot de passe";
                    loader.Hide();
                    break;
                case AuthError.InvalidEmail:
                    message = "E-mail non valide";
                    loader.Hide();
                    break;
                case AuthError.UserNotFound:
                    message = "Ce compte n'existe pas";
                    loader.Hide();
                    break;
            }
            warningLoginText.text = message;
        }
        else
        {
            //User is now logged in
            //Now get the result
            User = LoginTask.Result;
            Debug.LogFormat("User signed in successfully: {0} ({1})", User.DisplayName, User.Email);
            warningLoginText.text = "";
            confirmLoginText.text = "Connection réussie";
            loader.Hide();
        }
    }

//Réinitialisation du mdp
    public void ReinitPassword()
    {
        loader.Show();
        auth.SendPasswordResetEmailAsync(emailReinitField.text).ContinueWith(task => {
 
    if (task.IsFaulted) {
        
      Debug.LogWarning("SendPasswordResetEmailAsync encountered an error: " + task.Exception);
      warningReinitText.text = "Erreur ! Vérifiez l'adresse e-mail";
      loader.Hide();    
      }

    Debug.Log("Password reset email sent successfully.");
    confirmReinitText.text = "Message envoyé à " + emailReinitField.text;
    loader.Hide();
  });
}

    //Déconnection de l'utilisateur
    public void SignOut()
     {
         auth.SignOut();
         emailLoginField.text="";
         passwordLoginField.text="";
         confirmLoginText.text = "Vous avez été déconnecté(e)";
     }

    private IEnumerator Register(string _email, string _password, string _username)
    {
        loader.Show();
        if (_username == "")
        {
            //If the username field is blank show a warning
            warningRegisterText.text = "Le nom d'utilisateur est manquant !";
            loader.Hide();
        }
        else if(passwordRegisterField.text != passwordRegisterVerifyField.text)
        {
            //If the password does not match show a warning
            warningRegisterText.text = "Les mots de passe ne sont pas identiques !";
            loader.Hide();
        }
        else 
        {
            //Call the Firebase auth signin function passing the email and password
            var RegisterTask = auth.CreateUserWithEmailAndPasswordAsync(_email, _password);
            //Wait until the task completes
            yield return new WaitUntil(predicate: () => RegisterTask.IsCompleted);

            if (RegisterTask.Exception != null)
            {
                //If there are errors handle them
                Debug.LogWarning(message: $"Failed to register task with {RegisterTask.Exception}");
                FirebaseException firebaseEx = RegisterTask.Exception.GetBaseException() as FirebaseException;
                AuthError errorCode = (AuthError)firebaseEx.ErrorCode;

                string message = "Échec de l'inscription :(";
                loader.Hide();
                switch (errorCode)
                {
                    case AuthError.MissingEmail:
                        message = "Email manquant !";
                        loader.Hide();
                        break;
                    case AuthError.MissingPassword:
                        message = "Mot de passe manquant !";
                        loader.Hide();
                        break;
                    case AuthError.WeakPassword:
                        message = "Mot de passe faible !";
                        loader.Hide();
                        break;
                    case AuthError.EmailAlreadyInUse:
                        message = "Cet E-mail est déjà utilisé !";
                        loader.Hide();
                        break;
                }
                warningRegisterText.text = message;
                loader.Hide();
            }
            else
            {
                //User has now been created
                //Now get the result
                User = RegisterTask.Result;

                if (User != null)
                {
                    //Create a user profile and set the username
                    UserProfile profile = new UserProfile{DisplayName = _username};

                    //Call the Firebase auth update user profile function passing the profile with the username
                    var ProfileTask = User.UpdateUserProfileAsync(profile);
                    //Wait until the task completes
                    yield return new WaitUntil(predicate: () => ProfileTask.IsCompleted);

                    if (ProfileTask.Exception != null)
                    {
                        //If there are errors handle them
                        Debug.LogWarning(message: $"Failed to register task with {ProfileTask.Exception}");
                        FirebaseException firebaseEx = ProfileTask.Exception.GetBaseException() as FirebaseException;
                        AuthError errorCode = (AuthError)firebaseEx.ErrorCode;
                        warningRegisterText.text = "Échec de l'enregistrement du nom d'utilisateur :(";
                        loader.Hide();
                    }
                    else
                    {
                        //Username is now set
                        //Now return to login screen
                        UIManager.instance.LoginScreen();
                        warningRegisterText.text = "";
                        loader.Hide();
                    }

                }
            }
        }
    }
}

Merci pour l'aide que vous pourrez m'apporter, ça fait des jours que j'essaie de modifier mon script ou de modifier des éléments dans Unity sans succès :triste1:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Problème avec Show() et Hide()

Message par boubouk50 » 08 Sep 2021 13:35

Je ne suis pas du tout familier avec ce genre de code, je découvre même.
Quelque chose attire cependant mon attention:

Code : Tout sélectionner

auth.SendPasswordResetEmailAsync(emailReinitField.text).ContinueWith(task => {
Ceci est asynchrone et la Task créée nécessite de se terminer pour avoir son résultat. Sinon, tu risques de toujours avoir le même résultat.
EDIT - d'après ce que je lis, ContinueWith () est justement là pour ça.

Aussi, comment cette Task a accès à la variable loader?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Pounky
Messages : 6
Inscription : 08 Sep 2021 02:02
Localisation : Charente-Maritime
Contact :

Re: Problème avec Show() et Hide()

Message par Pounky » 08 Sep 2021 14:15

Merci boubouk50 pour ta participation ;)

Le code en question est celui indiqué dans la doc Firebase : https://firebase.google.com/docs/auth/u ... nage-users il n'y a pas de problème puisque je n'ai pas d'erreur de ce côté là, je récupère bien les infos du côté de Firebase.
Le seul souci est que le loader de s'interrompt pas et continu à tourner alors qu'il y a le "loader.Hide(); qui devrait avoir pour effet de le masquer. Si tu jettes un coup d'oeil dans mon script intégral, j'utilise la même méthode au moment du login et du register et que ça fonctionne bien dans ces 2 cas ... :( :snif:
Mode Expert Unity ... en cours de téléchargement, veuillez patienter.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Problème avec Show() et Hide()

Message par boubouk50 » 08 Sep 2021 14:35

Pas tout à fait identique, non.
Register () et Login () sont des coroutines, donc asynchrone alors que ReinitPassword () est synchrone.

Code : Tout sélectionner

var LoginTask = auth.SignInWithEmailAndPasswordAsync(_email, _password);
        yield return new WaitUntil(predicate: () => LoginTask.IsCompleted);
Ici le yield attend que la Task soit terminée pour continuer l'exécution.

Ne sachant pas comment fonctionne les Tasks réellement, difficile là d'être sûr.

Commençons par le début. Je viens de voir que tu as des Debug.Log () dans la Task. As-tu un des deux qui s'affiche en console?
Si c'est le cas, alors la Task est bien effectuée, donc soit le Hide () est suivi d'un Show () quelque part, soit loader est indéterminé et tu devrais avoir une NullReferenceException.
Sinon, cela provient de la Task et probablement de la synchronisation. Il faudrait essayer de passer la fonction en coroutine.

Code : Tout sélectionner

public void ReinitPassword()
{
	// Je ne me souviens plus de la syntaxe exacte
	StartCoroutine (ReinitPasswordAsync());
}

private IEnumerator ReinitPasswordAsync ()
    {
        loader.Show();
        auth.SendPasswordResetEmailAsync(emailReinitField.text).ContinueWith(task => {

   if (task.IsCompleted) {

        Debug.Log("Envoi de l'email réussi");
        confirmReinitText.text = "Message envoyé à " + emailReinitField.text;
        loader.Hide();
    }
    else if (task.IsFaulted) {

        Debug.LogWarning("Erreur " + task.Exception);
        warningReinitText.text = "Erreur ! Vérifiez l'adresse e-mail";
        loader.Hide();
    }
    yield return null;
  });
}
Code écrit à la volée, possibilité d'erreurs simples
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Pounky
Messages : 6
Inscription : 08 Sep 2021 02:02
Localisation : Charente-Maritime
Contact :

Re: Problème avec Show() et Hide()

Message par Pounky » 08 Sep 2021 15:31

Oui la task est bien effectuée puisque la console Unity affiche :

Code : Tout sélectionner

Password reset email sent successfully.
UnityEngine.Debug:Log (object)
FirebaseManager:<ReinitPassword>b__21_0 (System.Threading.Tasks.Task) (at Assets/Scripts/FirebaseManager.cs:145)
System.Threading._ThreadPoolWaitCallback:PerformWaitCallback ()
loader.Show(); a 3 références dans la totalité du script :
1x Register, 1x Login et 1x Reinit

Je te rejoins quand tu dis que "Register () et Login () sont des coroutines, donc asynchrone alors que ReinitPassword () est synchrone", est-ce pour cette raison que je ne peux pas avoir le même résultat ? :pleur4: J'en ai bien peur !
Mode Expert Unity ... en cours de téléchargement, veuillez patienter.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Problème avec Show() et Hide()

Message par boubouk50 » 08 Sep 2021 16:47

Huuum... ce n'est pas si évident.
Déjà, j'ai 2 versions de ta fonction, celle isolée et celle dans la classe FireBaseManager -> si tu as ce message, alors c'est celle de la classe qui est en cours? L'as-tu modifiée entre temps?

As-tu reçu les Debug.Log () de la task? A savoir Envoi de l'email réussi et SendPasswordResetEmailAsync encountered an error: + task.Exception?
S'ils ne sont pas présents, alors la task ne s'est pas terminée.
Ensuite, comme ta fonction est synchrone, ce qui suit auth.SendPasswordResetEmailAsync(emailReinitField.text).ContinueWith(...) est directement exécutée quelque soit le résultat (futur) de la task. Cela est donc normal que tu reçoives le Log Password reset email sent successfully donc si tu as laissé le Hide () après, il devrait aussi fonctionner MAIS cela est indépendant de la task et ce n'est peut être pas ce que tu souhaites.
Donc si le Hide () est encore là mais que rien n'est masqué, c'est que tu as un souci de logique et qu'un Show () est appelé juste après.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Pounky
Messages : 6
Inscription : 08 Sep 2021 02:02
Localisation : Charente-Maritime
Contact :

Re: Problème avec Show() et Hide()

Message par Pounky » 08 Sep 2021 18:24

Encore merci Boubouk de ta participation :D

En effet, j'ai fait 2 versions de la fonction dans mes tests et les 2 fonctionnent parfaitement. J'ai conservé la plus simple avec moins de lignes de code ;) c'est à dire celle-là :

Code : Tout sélectionner

//Réinitialisation du mdp
    public void ReinitPassword()
    {
        loader.Show();
        auth.SendPasswordResetEmailAsync(emailReinitField.text).ContinueWith(task => {
 
    if (task.IsFaulted) {
        
      Debug.LogWarning("SendPasswordResetEmailAsync encountered an error: " + task.Exception);
      warningReinitText.text = "Erreur ! Vérifiez l'adresse e-mail";
      loader.Hide();    
      }

    Debug.Log("Password reset email sent successfully.");
    confirmReinitText.text = "Message envoyé à " + emailReinitField.text;
    loader.Hide();
  });
}
J'ai le Debug.Log dans la console "Password reset email sent successfully." + confirmReinitText.text = "Message envoyé à " + emailReinitField.text qui est un champ TextMesh pro

Il y a bien un Show() à la fonction Register qui se trouve juste après le Hide() qui termine la fonction Reinit , je te donne à nouveau le script entier :

Code : Tout sélectionner

using System.Collections;
using UnityEngine;
using Firebase;
using Firebase.Auth;
using TMPro;

public class FirebaseManager : MonoBehaviour
{
    //Firebase variables
    [Header("Firebase")]
    public DependencyStatus dependencyStatus;
    public FirebaseAuth auth;    
    public FirebaseUser User;

    //Login variables
    [Header("Login")]
    public TMP_InputField emailLoginField;
    public TMP_InputField passwordLoginField;
    public TMP_Text warningLoginText;
    public TMP_Text confirmLoginText;

    //Register variables
    [Header("Register")]
    public TMP_InputField usernameRegisterField;
    public TMP_InputField emailRegisterField;
    public TMP_InputField passwordRegisterField;
    public TMP_InputField passwordRegisterVerifyField;
    public TMP_Text warningRegisterText;
    private Loader loader;

    //Reinit variables
    [Header("Reinit")]
    public TMP_InputField emailReinitField;
    public TMP_Text warningReinitText;
    public TMP_Text confirmReinitText;
    

    void Awake()
    {
        //Chargement de l'anim Loader
        loader = GetComponent<Loader>();
        //Vérification de la présence de toutes les dépendances nécessaires pour Firebase
        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
        {
            dependencyStatus = task.Result;
            if (dependencyStatus == DependencyStatus.Available)
            {
                //Si elles sont toutes disponibles lancement de l'initialisation de Firebase
                InitializeFirebase();
            }
            else
            {
                Debug.LogError("Could not resolve all Firebase dependencies: " + dependencyStatus);
            }
        });
    }

    private void InitializeFirebase()
    {
        Debug.Log("Setting up Firebase Auth");
        //Set the authentication instance object
        auth = FirebaseAuth.DefaultInstance;
    }

    //Function for the login button
    public void LoginButton()
    {
        //Call the login coroutine passing the email and password
        StartCoroutine(Login(emailLoginField.text, passwordLoginField.text));
    }
    //Function for the register button
    public void RegisterButton()
    {
        //Call the register coroutine passing the email, password, and username
        StartCoroutine(Register(emailRegisterField.text, passwordRegisterField.text, usernameRegisterField.text));
    }

    private IEnumerator Login(string _email, string _password)
    {
        loader.Show();
        //Call the Firebase auth signin function passing the email and password
        var LoginTask = auth.SignInWithEmailAndPasswordAsync(_email, _password);
        //Wait until the task completes
        yield return new WaitUntil(predicate: () => LoginTask.IsCompleted);

        if (LoginTask.Exception != null)
        {
            //If there are errors handle them
            Debug.LogWarning(message: $"Failed to register task with {LoginTask.Exception}");
            FirebaseException firebaseEx = LoginTask.Exception.GetBaseException() as FirebaseException;
            AuthError errorCode = (AuthError)firebaseEx.ErrorCode;

            string message = "Échec de la connexion";
            loader.Hide();
            switch (errorCode)
            {
                case AuthError.MissingEmail:
                    message = "E-mail manquant";
                    loader.Hide();
                    break;
                case AuthError.MissingPassword:
                    message = "Mot de passe manquant";
                    loader.Hide();
                    break;
                case AuthError.WrongPassword:
                    message = "Mauvais mot de passe";
                    loader.Hide();
                    break;
                case AuthError.InvalidEmail:
                    message = "E-mail non valide";
                    loader.Hide();
                    break;
                case AuthError.UserNotFound:
                    message = "Ce compte n'existe pas";
                    loader.Hide();
                    break;
            }
            warningLoginText.text = message;
        }
        else
        {
            //User is now logged in
            //Now get the result
            User = LoginTask.Result;
            Debug.LogFormat("User signed in successfully: {0} ({1})", User.DisplayName, User.Email);
            warningLoginText.text = "";
            confirmLoginText.text = "Connection réussie";
            loader.Hide();
        }
    }

//Réinitialisation du mdp
    public void ReinitPassword()
    {
        loader.Show();
        auth.SendPasswordResetEmailAsync(emailReinitField.text).ContinueWith(task => {
 
    if (task.IsFaulted) {
        
      Debug.LogWarning("SendPasswordResetEmailAsync encountered an error: " + task.Exception);
      warningReinitText.text = "Erreur ! Vérifiez l'adresse e-mail";
      loader.Hide();    
      }

    Debug.Log("Password reset email sent successfully.");
    confirmReinitText.text = "Message envoyé à " + emailReinitField.text;
    loader.Hide();
  });
}
    //Déconnection de l'utilisateur
    public void SignOut()
     {
         auth.SignOut();
         emailLoginField.text="";
         passwordLoginField.text="";
         confirmLoginText.text = "Vous avez été déconnecté(e)";
     }

    private IEnumerator Register(string _email, string _password, string _username)
    {
        loader.Show();
        if (_username == "")
        {
            //If the username field is blank show a warning
            warningRegisterText.text = "Le nom d'utilisateur est manquant !";
            loader.Hide();
        }
        else if(passwordRegisterField.text != passwordRegisterVerifyField.text)
        {
            //If the password does not match show a warning
            warningRegisterText.text = "Les mots de passe ne sont pas identiques !";
            loader.Hide();
        }
        else 
        {
            //Call the Firebase auth signin function passing the email and password
            var RegisterTask = auth.CreateUserWithEmailAndPasswordAsync(_email, _password);
            //Wait until the task completes
            yield return new WaitUntil(predicate: () => RegisterTask.IsCompleted);

            if (RegisterTask.Exception != null)
            {
                //If there are errors handle them
                Debug.LogWarning(message: $"Failed to register task with {RegisterTask.Exception}");
                FirebaseException firebaseEx = RegisterTask.Exception.GetBaseException() as FirebaseException;
                AuthError errorCode = (AuthError)firebaseEx.ErrorCode;

                string message = "Échec de l'inscription :(";
                loader.Hide();
                switch (errorCode)
                {
                    case AuthError.MissingEmail:
                        message = "Email manquant !";
                        loader.Hide();
                        break;
                    case AuthError.MissingPassword:
                        message = "Mot de passe manquant !";
                        loader.Hide();
                        break;
                    case AuthError.WeakPassword:
                        message = "Mot de passe faible !";
                        loader.Hide();
                        break;
                    case AuthError.EmailAlreadyInUse:
                        message = "Cet E-mail est déjà utilisé !";
                        loader.Hide();
                        break;
                }
                warningRegisterText.text = message;
                loader.Hide();
            }
            else
            {
                //User has now been created
                //Now get the result
                User = RegisterTask.Result;

                if (User != null)
                {
                    //Create a user profile and set the username
                    UserProfile profile = new UserProfile{DisplayName = _username};

                    //Call the Firebase auth update user profile function passing the profile with the username
                    var ProfileTask = User.UpdateUserProfileAsync(profile);
                    //Wait until the task completes
                    yield return new WaitUntil(predicate: () => ProfileTask.IsCompleted);

                    if (ProfileTask.Exception != null)
                    {
                        //If there are errors handle them
                        Debug.LogWarning(message: $"Failed to register task with {ProfileTask.Exception}");
                        FirebaseException firebaseEx = ProfileTask.Exception.GetBaseException() as FirebaseException;
                        AuthError errorCode = (AuthError)firebaseEx.ErrorCode;
                        warningRegisterText.text = "Échec de l'enregistrement du nom d'utilisateur :(";
                        loader.Hide();
                    }
                    else
                    {
                        //Username is now set
                        //Now return to login screen
                        UIManager.instance.LoginScreen();
                        warningRegisterText.text = "";
                        loader.Hide();
                    }

                }
            }
        }
    }
}
Mode Expert Unity ... en cours de téléchargement, veuillez patienter.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Problème avec Show() et Hide()

Message par boubouk50 » 09 Sep 2021 09:22

Techniquement, si tu appelles ReinitPassword (), tu n'appelles pas Register () juste après je suppose (en tout cas, je ne vois pas pourquoi ni rien dans le code).

Pour savoir l'ordre d'exécution, ajoute un Debug.Log () quelconque dans les fonctions Show () et Hide ().
La console te donne la suite des événements, donc tu seras en mesure de savoir si:
1/ Hide se fait bien.
2/ Si un show se fait juste après, savoir qui l'appelle.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Pounky
Messages : 6
Inscription : 08 Sep 2021 02:02
Localisation : Charente-Maritime
Contact :

Re: Problème avec Show() et Hide()

Message par Pounky » 10 Sep 2021 11:59

L'erreur que j'ai commise est d'avoir utilisé "ContinueWith" au lieu de ContinueWithOnMainThread !
Avec un "ContinueWith" le traitement n'est pas fait sur le thread Unity principal or ce que je souhaite faire avec le "SendPasswordResetEmailAsync" nécessite d'être exécuté sur le thread principal Unity.
Et apparemment, après maintes recherches et tests en tous genres, il s'agit d'un problème classique de continuation des tâches dans Unity à l'aide de Firebase.
Important : La fonction ContinueWithOnMainThread necessite Firebase.Extensions.

Du coup les loader.Show() et Hide() s'executent tous les 2 parfaitement car la tache SendPasswordResetEmailAsync a enfin un début et une fin :D

Voici le code :

Code : Tout sélectionner

//Réinitialisation du mdp
      public void ReinitPassword()
        {
            ReinitInput();
            if (emailReinitField.text != string.Empty && emailReinitField.text != null) {
                loader.Show();
                FirebaseAuth.DefaultInstance.SendPasswordResetEmailAsync(emailReinitField.text).ContinueWithOnMainThread(task => {
                    
                    if (task.IsFaulted) {
                        Debug.LogWarning("SendPasswordResetEmailAsync encountered an error: " + task.Exception);
                       // warningReinitText.text = "Erreur ! Vérifiez l'adresse e-mail";
                       warningReinitText.text = "IsFaulted";
                    }
                    else if (task.IsCompleted) {
                        Debug.Log("Password reset email sent successfully.");
                        confirmReinitText.text = "Message envoyé à " + emailReinitField.text;
                    }
                 loader.Hide();
                });
            }
            else
            {
                Debug.LogWarning("Email Input empty");
                warningReinitText.text = "Saisissez un e-mail valide";
                loader.Hide();
            }

        }

    public void ReinitInput()
    {
        warningReinitText.text = "";
        confirmReinitText.text = "";
    }
Mode Expert Unity ... en cours de téléchargement, veuillez patienter.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Problème avec Show() et Hide()

Message par boubouk50 » 10 Sep 2021 13:59

Problème résolu, donc?

Lorsque le problème est résolu, merci de penser à le signaler en éditant le titre du premier message puis en y ajoutant [RESOLU] en début de celui-ci.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »