Ich habe einen einfachen Code, der eine Authentifizierung in plattformspezifischen Code machen:Anruf nicht statische Methode in PageRenderer Xamarin
[assembly: ExportRenderer(typeof(FacebookLoginPage), typeof(FacebookLoginRenderer))]
namespace VejoSeriesMobile.Droid.Renderers
{
public class FacebookLoginRenderer : PageRenderer
{
public static string ClientId = "";
public static string ClientSecret = "";
public static string Scope = "email, public_profile";
public static string AuthorizeUrl = "https://m.facebook.com/dialog/oauth";
public static string RedirectUrl = "https://www.facebook.com/connect/login_success.html";
public static string AccessTokenUrl = "https://m.facebook.com/dialog/oauth/token";
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
base.OnElementChanged(e);
var activity = this.Context as Activity;
var auth = new OAuth2Authenticator(
clientId: "717427648360004",
scope: Scope,
authorizeUrl: new Uri("https://m.facebook.com/dialog/oauth/"),
redirectUrl: new Uri("http://www.facebook.com/connect/login_success.html"));
auth.Completed += OnAuthenticationCompleted;
activity.StartActivity(auth.GetUI(activity));
}
async void OnAuthenticationCompleted(object sender, AuthenticatorCompletedEventArgs e)
{
if (e.IsAuthenticated)
{
var request = new OAuth2Request("GET", new Uri("https://graph.facebook.com/me?fields=id,name,picture,email"), null, e.Account);
await request.GetResponseAsync().ContinueWith(t =>
{
var fbUser = JObject.Parse(t.Result.GetResponseText());
var id = fbUser["id"].ToString().Replace("\"", "");
var name = fbUser["name"].ToString().Replace("\"", "");
var email = fbUser["email"].ToString().Replace("\"", "");
var conta = new Account { Username = name };
conta.Properties.Add("email", email);
AccountStore.Create(Context).Save(conta, "VejoSeries");
App.SuccessfulLoginAction.Invoke();
});
}
}
}
}
in meiner App tragbare Klasse ich eine statische Methode, die nach der Anmeldung ruft vollständig:
Aber in diesem Bereich kann ich nur statische Methode verwenden, ich möchte eine nicht statische Methode für das Rendern der gesamten Seite (mit Menüs, etc ..) nach dem Login aufrufen. Wie kann ich das machen?
über meinen successLoginAction:
public static Action SuccessfulLoginAction
{
get
{
return new Action(() =>
{
//var masterDetailPage = Application.Current.MainPage as MasterDetailPage;
//masterDetailPage.Detail = new NavigationPage((Page)Activator.CreateInstance(typeof(Painel)));
//masterDetailPage.IsPresented = false;
_NavPage.Navigation.PopAsync();
_NavPage.Navigation.PushAsync(new MainPage());
});
}
}
Wenn Ihre 'FacebookLoginPage' als modal angezeigt wird, können Sie nicht einfach Ihre' MainPage' darunter anzeigen lassen, wenn Sie 'PopModalAsync()' aufrufen, wird Ihre 'MainPage()' bereits angezeigt? Auch Ihre 'SuccessfulLoginAction' sollte eine Aktion zurückgegeben werden, die mit async und erwarten wie erklärt wird:' return new Aktion (async() => {erwarten _NavPage.Navigation.PopModalAsync(); ....}); ' – hvaughan3