Xamarin MvvmCross Android防止后退按钮返回上一个视图

Jon*_*rix 7 c# android mvvmcross xamarin

我正在尝试为以下情况创建一个简洁的解决方案:

我已经构建了一个需要凭据来验证用户身份的应用程序.每当API想要重新验证用户时,我都想强制用户返回登录视图.此功能很有用,但当用户按下设备上的后退按钮时,将显示上一个视图.我想看到当用户按下后退按钮时,应用程序退出.

MvvmCross可以选择使用MvxPresentationHint.我创建了一个CustomAndroidViewPresenter并创建了以下MvxAndroidSetup:

public class Setup : MvxAndroidSetup
{
    private CustomAndroidViewPresenter _presenter;
    public Setup(Context applicationContext)
        : base(applicationContext)
    {
        _presenter = new CustomAndroidViewPresenter(applicationContext);
    }

    protected override IMvxAndroidViewPresenter CreateViewPresenter()
    {
        Mvx.RegisterSingleton(_presenter);
        return _presenter;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道你应该调用Finish(); 在一个活动上,以防止后退按钮导航回未经身份验证的视图.但是转换applicationContext会抛出异常.

public CustomAndroidViewPresenter(Context context)
{
    _context = context;
}

public override void ChangePresentation(MvxPresentationHint hint)
{
    if (hint is LoginOnlyBackStackHint)
    {
        var context = Application.Context;
        if (context is Activity)
        {
            // Context is NOT activity
        }
        try
        {
            Activity x = (Activity) context;
            x.Finish();
            // Exception is thrown
        }
        catch (Exception ex)
        {

        }
    }
    base.ChangePresentation(hint);
}
Run Code Online (Sandbox Code Playgroud)

有人有任何想法如何实现这一目标?

提前谢谢了.

Joe*_*ehl 13

我有同样的问题.只要实现一个自定义Presenter,它设置一些意图标志,如果你想实现这个:

public class CustomAndroidPresenter : MvxAndroidViewPresenter 
    {
        public override void Show(MvxViewModelRequest request)
        {
            if (request != null && request.PresentationValues != null)
            {
                if (request.PresentationValues.ContainsKey("MyCustomFlag"))
                {
                    // Get intent from request and set flags to clear backstack.
                    var intent = base.CreateIntentForRequest(request);
                    intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);

                    base.Show(intent);
                    return;
                }
            }

            base.Show(request);
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后,您需要在安装程序类中设置此演示者:

protected override IMvxAndroidViewPresenter CreateViewPresenter()
        {
            var presenter = new CustomAndroidPresenter();
            Mvx.RegisterSingleton<IMvxViewPresenter>(presenter);
            return presenter;
        }
Run Code Online (Sandbox Code Playgroud)

然后显示一个viewmodel(比如你的登录视图)只需设置你的自定义标志键代码,演示者知道他应该设置inten-flags:

protected void ShowViewModel<TViewModel>(bool clearbackstack) where TViewModel : MvxViewModel
        {
            if (clearbackstack)
            {
                var presentationBundle = new MvxBundle(new Dictionary<string, string> { { "MyCustomFlag", "" } });
                ShowViewModel<TViewModel>(presentationBundle: presentationBundle);
                return;
            }

        // Normal start
        ShowViewModel<TViewModel>();
    }
Run Code Online (Sandbox Code Playgroud)

要显示视图模型(不带后退导航),只需使用以下代码:

ShowViewModel<MyViewModel>(true);
Run Code Online (Sandbox Code Playgroud)

然后,当您按下后退按钮时,您无法导航回到之前的活动,因为后台堆栈已被清除.