MVVMCross Android Presenter, чтобы очистить стек деятельности - PullRequest
0 голосов
/ 01 февраля 2019

Мое Android-приложение, которое я создаю с помощью MvvmCross, последовательно выполняет действия, а затем «возвращается» на домашнюю страницу.Как только приложение вернется на домашнюю страницу, я не хочу, чтобы пользователь мог вернуться назад ко всем предыдущим действиям.

Чтение всей документации, публикаций в блогах и т. Д. Я смог пересмотреть докладчика.и перехватить запрос на очистку заднего стека действий.

Весь этот код работает нормально, но я не смог выяснить, как очистить задний стек действий.Есть идеи, как мне этого добиться?Мой код ниже:

Setup.cs

public class Setup : MvxAndroidSetup<Core.App>
{
    protected override IMvxApplication CreateApp()
    {
        return new Core.App();
    }

    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
        MvxAppCompatSetupHelper.FillTargetFactories(registry);
        base.FillTargetFactories(registry);
    }

    protected override void InitializeLastChance()
    {
       // Mvx.IoCProvider.ConstructAndRegisterSingleton<ICameraHelper, CameraHelper>();
        base.InitializeLastChance();
    }

    protected override IMvxAndroidViewPresenter CreateViewPresenter()
    {
        var presenter = new MyAppAndroidPresenter(AndroidViewAssemblies);
        Mvx.IoCProvider.RegisterSingleton<IMvxAndroidViewPresenter>(presenter);

        return presenter;
    }
}

MyAppAndroidPresenter.cs

public class MyAppAndroidPresenter : MvxAndroidViewPresenter
{
    public MyAppAndroidPresenter(IEnumerable<Assembly> androidViewAssemblies) : base(androidViewAssemblies)
    {
    }

    public override async Task<bool> Show(MvxViewModelRequest request)
    {
        if (request.PresentationValues != null)
        {
            if (request.PresentationValues.ContainsKey("ClearBackStack") && request.PresentationValues["ClearBackStack"] == "True")
            {
                // TODO : Clear the activity back stack
            }
        }

        return await base.Show(request);
    }
}

Вызов ViewModel

    private async void NextPageMethod()
    {
        var presentationBundle = new MvxBundle(new Dictionary<string, string> { { "ClearBackStack", "True" } });

        await NavigationService.Navigate<HomeViewModel>(presentationBundle: presentationBundle);

    }

1 Ответ

0 голосов
/ 01 февраля 2019

То, что вы пытаетесь сделать, - это, по сути, начать «Домашнюю страницу», используя намерение, включающее флаг ClearTop .Согласно документации разработчика Android, добавление этого флага вызовет следующее поведение:

Например, рассмотрим задачу, состоящую из действий: A, B, C, D. Если D вызывает startActivity ()с намерением, которое разрешается к компоненту действия B, тогда C и D будут завершены, и B получит данное намерение, в результате чего стек теперь будет: A, B.

Просмотр MvvmCrossИсходный код для встроенного Android-презентера, есть несколько способов добиться этого.Самый простой способ - переопределить метод CreateIntentForRequest в своем настраиваемом докладчике.Этот метод передает MvxViewModelRequest в качестве параметра.Таким образом, вы можете изменить намерение и добавить к нему флаг ClearTop, если условие выполнено правильно.

protected override Intent CreateIntentForRequest(MvxViewModelRequest request)
{
    var intent =  base.CreateIntentForRequest(request);

    if (request.PresentationValues != null) {
        if (request.PresentationValues.ContainsKey("ClearBackStack") && request.PresentationValues["ClearBackStack"] == "True") {
            intent.AddFlags(ActivityFlags.ClearTop);

        }
    }

    return intent;
}

Это всего лишь один из способов достижения полной функциональности бэк-стека.MvvmCross - это расширяемая среда, и можно настроить практически все.

...