2016-05-26 15 views
0

現在私のアプリケーションでは、2つのナビゲーションスタックがあります。認証スタックを「再設定」するための最良の解決策は何ですか?

  1. 認証
  2. メイン

マイ認証スタックは次のようになります。

  1. スプラッシュページ
  2. 選択して作成するか、ログインページ
  3. ログインページ
そのIコールの後

CoreMethods.SwitchOutRootNavigation(NavigationContext.Main);

このすべてが正常に動作します。

私はこのようなメインスタック内からログアウトを呼び出す

CoreMethods.SwitchOutRootNavigation(NavigationContext.Authentication);

私は現在、「ログインページ」になりますが、私は本当にそれが最初のページ「スプラッシュページ」になりたいです。

ナビゲーションスタックを使用すると、スタックの履歴が他のすべてのケースでは完璧であることを覚えておいてください。

質問:認証スタックを「再設定する」最適な解決策は何ですか?

+0

スプラッシュページはxaml/C#のページまたはアクティビティですか?その活動の場合、これは動作しません。 –

答えて

1

私のアプリで普通にやっていることは、次のとおりです。

LoggedInまたはLoggedOutであるStateのプロパティを持つIAuthenticationServiceがあります。セッション状態が明示的なログインによって変更された場合や、トークンが期限切れになった場合は、StateLoggedOutに設定します。また、私はブロードキャストメッセージSessionStateChangedからMessengerを起動するので、このメッセージをアプリの周りにキャッチし、画面の状態の変更などのUIレベルで対応します。

ユーザーを完全にログさせる必要がある場合は、StateLoggedOutの場合、ログインページを表示することを意味します。これはあなたの場合です。私はXamarin.Formsを使用していますが、ネイティブのiOSまたはAndroidを使用している場合のアプローチは似ています。 は私のメインAppクラス(Xamarin.Forms.Applicationから派生1)で、私は、メソッド呼び出しUpdateMainPage、私はちょうどに応じてサインインフローまたはメインフローにアプリケーションのルートページを変更する何が起こるこの

private async void UpdateMainPage() 
    { 
     if (_authService.State == SessionState.LoggedIn) 
      MainPage = new NavigationPage(new RequestPage()); 
     else 
      MainPage = new NavigationPage(new SignInPage()); 
    } 

のようなものを作成しますSessionState。それから私のコンストラクタで、私は次のことを行います。

public FormsApp() 
    { 
     InitializeComponent(); 
     _authService = Mvx.Resolve<IAuthenticationService>(); 

     UpdateMainPage(); 

     var messenger = Mvx.Resolve<IMvxMessenger>(); 
     _sessionStateChangedToken = messenger.Subscribe<SessionStateChangedMessage>(HandleSessionStateChanged); 
    } 

私が行うために必要なもの、私はその後、私はいくつかのアプリケーションのために、このアプローチを使用しUpdateMainPage

private void HandleSessionStateChanged(SessionStateChangedMessage sessionStateChangedMessage) 
    { 
     UpdateMainPage(); 
    } 

トリガーSessionStateChangedイベントに加入し、それは動作し、事前に設定メインページに必要私にとって完璧です。これは

+0

kyurkchyanさん、ありがとうございました。私は後にしたことは全くありませんでしたが、(私たちは特にFreshMvvmを使用しています)方法を助けてくれました。 – duyker

0

を役に立てば幸い私は最近、非常に同じ問題を抱えていたし、これは私がやったことです:

ナビゲーションスタック:App.xaml.csで

public enum NavigationStacks {Authentication, Main} 

を:

//Navigation stack when user is authenticated. 
var mainPage = FreshPageModelResolver.ResolvePageModel<MainPageModel>(); 
var mainNavigation = new FreshNavigationContainer(MainPage, NavigationStacks.Main.ToString()); 

//Navigation stack for when user is not authenticated. 
var splashScreenPage= FreshPageModelResolver.ResolvePageModel<SplashScreenPageModel>(); 
var authenticationNavigation = new FreshNavigationContainer(splashScreenPage, NavigationStacks.Authentication.ToString()); 

ここでは、活用することができますJames Montemagno's Settings Plugin

if (Settings.IsUserLoggedIn) 
    { 
     MainPage = mainNavigation; 
    } 
    else 
    { 
     MainPage = authenticationNavigation; 
    } 

これまでのところ、すでに上記のコードを実行していました。しかし、問題のためのアイデアは、ルートページ、すなわちスプラッシュ画面以外の認証スタックをクリアすることです:

public static void PopToStackRoot(NavigationStacks navigationStack) 
{ 
    switch (navigationStack) 
    { 
     case NavigationStacks.Authentication: 
     { 
      var mainPage = FreshPageModelResolver.ResolvePageModel<MainPageModel>(); 
      var mainNavigation = new FreshNavigationContainer(MainPage, NavigationStacks.Main.ToString()); 
      break; 
     } 
     case NavigationStacks.Main: 
     { 
      var splashScreenPage= FreshPageModelResolver.ResolvePageModel<SplashScreenPageModel>(); 
      var authenticationNavigation = new FreshNavigationContainer(splashScreenPage, NavigationStacks.Authentication.ToString()); 
      break; 
     } 
    } 
} 

そして最後に、ここでは、ログアウトコマンド内のコードです:

private void Logout() 
{ 
    Settings.IsUserLoggedIn = false; 
    NavigationService.PopToStackRoot(NavigationStacks.Authentication); 
    CoreMethods.SwitchOutRootNavigation(NavigationStacks.Authentication.ToString()); 
} 

私はより良いがあるかもしれません知っていますより効率的なアプローチです。しかし、それは私のために働いた。

関連する問題