[英]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.