2017-01-25 3 views
0

У меня есть простой код, который делает проверку подлинности в платформо-зависимом коде:вызова не статический метод в 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(); 
       }); 
      } 
     } 
    } 
} 

в моем App портативного классе У меня есть статический метод, который звонит после регистрации полной: enter image description here

Но в этой области я могу использовать метод Static, я хочу вызвать нестационарный метод для повторной передачи всей страницы (с меню и т. Д.) После входа в систему. Как я могу это сделать?

Над моей 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

Если ваш 'FacebookLoginPage' отображается как модальный, вы не могли бы просто отображать под ним' MainPage', поэтому, когда вы вызываете 'PopModalAsync()' ваш 'MainPage()' уже будет отображаться? Кроме того, вашему «SuccessfulLoginAction» должно быть возвращено действие, объявленное с помощью async и ожидающее следующего: «return new Action (async() => {await _NavPage.Navigation.PopModalAsync(); ....});' – hvaughan3

ответ

3

Короткий ответ не делает его статическим. Если вы измените его на общедоступную собственность, вы можете получить к нему доступ через App.Current. Чтобы быть более конкретным:

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

Затем вызовите его из любого места, как это:

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

Таким образом, вы можете получить доступ к вашим _NavPage, как все это связано с экземпляром App.

+0

((App) Application.Current.SuccessfulLoginAction.Invoke()) не работает, ошибка: «Тяжесть \t \t Код Описание \t \t Project File \t \t Line Подавление Государственный ошибка \t \t CS1061 'Application' не содержит определение для" SuccessfulLoginAction 'и не может быть найден метод расширения' SuccessfulLoginAction ', принимающий первый аргумент типа' Application '(вам не хватает директивы using или ссылки на сборку?) " –

+0

@IgorMonteiro Опечатать опечатку. См. Мое редактирование. '((Приложение) Application.Current.SuccessfulLoginAction.Invoke())' исправлено: '((приложение) Application.Current) .SupccessLoginAction.Invoke();' – SuavePirate

+0

tks мой друг .. PLS, как мой вопрос :) –