gpt4 book ai didi

c# - Xamarin MvvmCross Android 阻止后退按钮返回到上一个 View

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:14:36 24 4
gpt4 key购买 nike

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

我构建了一个需要凭据来验证用户身份的应用程序。每当 API 想要重新验证用户时,我都想强制用户返回登录 View 。这个功能很好用,但是当用户按下设备上的后退按钮时,会显示上一个 View 。我希望看到当用户按下后退按钮时应用程序退出。

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

我知道你应该调用 Finish();在一个 Activity 上,以防止后退按钮导航回未经身份验证的 View 。但是将 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);
}

有人知道如何实现这一目标吗?

非常感谢。

最佳答案

我遇到了同样的问题。如果你想实现这个,只需实现一个自定义的 Presenter,它会设置一些 Intent 标志:

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

然后你需要在你的setup类中设置这个presenter:

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

然后显示一个 View 模型(比如你的登录 View )只需设置你的自定义标志键代码,演示者知道他应该设置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>();
}

要显示 View 模型(没有返回导航)只需使用以下代码:

ShowViewModel<MyViewModel>(true);

然后,当您按下后退按钮时,您将无法导航回之前的 Activity ,因为后退堆栈已被清除。

关于c# - Xamarin MvvmCross Android 阻止后退按钮返回到上一个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29004915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com