簡體   English   中英

如何在非活動類中使用Xamarin.Firebase.Auth並得到通知?

[英]How to use Xamarin.Firebase.Auth in a non-activity class and get notified?

我想將FirebaseAuth封裝到AuthService類中。

我也可以登錄。。但是我無法從Firebase獲取事件,因為它無法通知AuthService類內的偵聽器。

當我從LoginActivity按下登錄按鈕時,我可以在控制台中看到該用戶已登錄。

10/29 21:45:34.519 D / FirebaseAuth(28144):通知ID令牌偵聽器有關用戶(mvBkX8YferS6XVdqnUeSLu2yldp2)。

10-29 21:45:34.527 D / FirebaseApp(28144):通知身份驗證狀態偵聽器。

10-29 21:45:34.528 D / FirebaseApp(28144):通知0個身份驗證狀態偵聽器。

這是AuthService類:

 public class AuthService : Java.Lang.Object, IOnSuccessListener, IOnFailureListener
{
    public User CurrentUser;
    private FirebaseAuth firebaseAuth;

    private static AuthService _instance = null;
    private static System.Object _mutex = new object();

    public IntPtr Handle {get;}

    public static AuthService GetInstance()
    {
        if (_instance == null)
        {
            lock (_mutex) // now I can claim some form of thread safety...
            {
                if (_instance == null)
                {
                    _instance = new AuthService();
                }
            }
        }
        return _instance;
    }

    public AuthService()
    {
       Initialise();
    }

    private void Initialise()
    {
        this.firebaseAuth = FirebaseAuth.Instance;

        if (FirebaseAuth.Instance.CurrentUser != null)
        {
            this.CurrentUser = User.GetInstance();
        }
    }

    public FirebaseUser GetUser()
    {
        FirebaseUser user;

        if (FirebaseAuth.Instance.CurrentUser != null)
        {
            user = FirebaseAuth.Instance.CurrentUser;
        }
        else
        {
            user = null;
        }
        return user;
    }


    public void SignInWithEmailAndPassword(string email, string password)
    {
        FirebaseAuth.Instance.SignInWithEmailAndPassword(email, password)
            .AddOnSuccessListener(this)
            .AddOnFailureListener(this);
    }

    public void OnSuccess(Java.Lang.Object result)
    {
        this.CurrentUser = User.GetInstance();

        MyApplication.Context.StartActivity(typeof(MainActivity));
    }
  }
}

LoginActivity:

 public class LoginActivity : Activity
{
    AuthService _AuthService;
    private EditText loginMail;
    private EditText loginPassword;
    private Button buttonLogin;
    private Button buttonGoToCreateAccount;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_login);

        loginMail = FindViewById<EditText>(Resource.Id.emaillogin);
        loginPassword = FindViewById<EditText>(Resource.Id.passwordlogin);
        buttonLogin = FindViewById<Button>(Resource.Id.loginbutton);

        buttonLogin.Click += (sender, e) =>
        {
        AuthService.GetInstance().SignInWithEmailAndPassword(loginMail.Text, loginPassword.Text);
        };
    }
}

為什么將OnSuccess偵聽器實現為非活動類卻無法獲取事件。 我已經使FirebaseAuth可以直接從Activity直接工作,但是我想封裝身份驗證。

有人暗示嗎?

我終於設法做到了。

這是身份驗證AuthListeners的偵聽器類:

 public class AuthListener : Java.Lang.Object, IOnSuccessListener, IOnFailureListener
{
    public delegate void OnAuthFailure(string error);
    public event OnAuthFailure OnAuthFailureEvent;

    public delegate void OnAuthSuccess();
    public event OnAuthSuccess OnAuthSuccessEvent;

    public AuthListener()
    {
    }

    public void OnSuccess(Java.Lang.Object result)
    {
        Console.WriteLine("success");
        OnAuthSuccessEvent?.Invoke();
    }

    public void OnFailure(Java.Lang.Exception e)
    {
        Console.WriteLine("failure: " + e.Message);
        OnAuthFailureEvent?.Invoke(e.Message);
    }
}

這是AuthService類:

 public class AuthService
{
    private FirebaseAuth firebaseAuth;

    public AuthService()
    {
       Initialise();
    }

    private void Initialise()
    {
        this.firebaseAuth = FirebaseAuth.Instance;
    }    

    public void SignInWithEmailAndPassword(string email, string password, AuthListener authListener)
    {
        FirebaseAuth.Instance.SignInWithEmailAndPassword(email, password)
            .AddOnSuccessListener(authListener)
            .AddOnFailureListener(authListener);
    }

    public void CreateUserWithEmailAndPassword(string email, string password, string userName, AuthListener authListener)
    {
        FirebaseAuth.Instance.CreateUserWithEmailAndPassword(email, password)
            .AddOnFailureListener(authListener)
            .AddOnSuccessListener(authListener);
    }

    public void SignOut()
    {
        FirebaseAuth.Instance.SignOut();
    }
}

然后,在登錄|| create_account活動||片段中,我僅調用Auth服務並從AuthListener訂閱該事件。

LoginActivity的示例:

 public class LoginActivity : Activity
{
    AuthListener _authListener;
    AuthService _authService;

    private EditText loginMail;
    private EditText loginPassword;
    private Button buttonLogin;
    private Button buttonGoToCreateAccount;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_login);

        _authListener = new AuthListener();
        _authService = new AuthService();
        Subscribe();

        loginMail = FindViewById<EditText>(Resource.Id.emaillogin);
        loginPassword = FindViewById<EditText>(Resource.Id.passwordlogin);
        buttonLogin = FindViewById<Button>(Resource.Id.loginbutton);
        buttonGoToCreateAccount = FindViewById<Button>(Resource.Id.goto_create_account);


        buttonLogin.Click += (sender, e) =>
        {
            _authService.SignInWithEmailAndPassword(loginMail.Text, loginPassword.Text, this._authListener );
        };

        buttonGoToCreateAccount.Click += (sender, e) =>
        {
            UnSubscribe();

            StartActivity(typeof(CreateAccountActivity));
            Finish();
        };
    }

    private void UnSubscribe()
    {
        _authListener.OnAuthFailureEvent -= ShowErrorDialog;
        _authListener.OnAuthSuccessEvent -= AuthSuccess;
    }

    private void Subscribe()
    {
        _authListener.OnAuthFailureEvent += ShowErrorDialog;
        _authListener.OnAuthSuccessEvent += AuthSuccess;
    }

    private void AuthSuccess()
    {
        StartActivity(typeof(DashboardActivity));
        Finish();
    }

    private void ShowErrorDialog(string error)
    {
        this.RunOnUiThread(() =>
        {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
            alertDialog.SetTitle("Error");
            alertDialog.SetMessage(error);
            alertDialog.SetNeutralButton("Try again!", delegate
            {
                alertDialog.Dispose();
            });
            alertDialog.Show();
        });
    }
}

我現在可以說我封裝了Firebase Authenticate服務,因此有一天,如果我最終想離開Firebase來使用另一項服務,那將不會是一團糟,或者至少是一團糟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM