2017-01-25 2 views
0

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: enter image description here

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()); 
      }); 
     } 
    } 
+0

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

Antwort

3

Die kurze Antwort ist es statisch nicht machen. Wenn Sie es in eine öffentliche Eigenschaft ändern, können Sie darauf unter App.Current zugreifen. Um genauer zu sein:

public 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()); 
     }); 
    } 
} 

Dann nennen es von überall wie folgt aus:

((App)Application.Current).SuccessfulLoginAction.Invoke(); 

diese Weise erhalten Sie Zugriff auf Ihre _NavPage als das Ganze auf die Instanz von App gebunden ist.

+0

((App) Application.Current.SuccessfulLoginAction.Invoke()) nicht funktioniert, ist der Fehler: „Severity \t-Code \t Beschreibung \t Projekt \t Datei \t Linie \t Unterdrückungszustand Fehler \t CS1061 \t 'Anwendung' enthält keine Definition für ' SuccessfulLoginAction‘und keine Erweiterungsmethode‚SuccessfulLoginAction Anwendung ‚‘ ein erstes Argument vom Typ akzeptieren‘gefunden werden konnte (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis?) " –

+0

@IgorMonteiro Whoops Tippfehler. Siehe meine Bearbeitung. '((App) Application.Current.SuccessfulLoginAction.Invoke())' behoben zu: '((Anwendung) Application.Current) .SuccessfulLoginAction.Invoke();' – SuavePirate

+0

tks mein Freund .. pls mag meine Frage :) –

Verwandte Themen