Intégration d'un service de navigation personnalisé dans un projet MAUI Blazor avec support pour le bouton retour Android

Ajout du code nécessaire

  1. Ajoutez une interface INavigationService
public interface INavigationService
{
    event Action Action;
    NavigationManager Navigation { get; protected set; }
    List<string> HistoryUrls { get; protected set; }
    void Initialize(NavigationManager navigation);
    void NavigateTo(string url);
    void NavigateToBack();
    bool OnBackButtonPressed();
}

  1. Ajoutez la classe d'implémentation NavigationService
public class NavigationService : INavigationService
{
    public NavigationManager Navigation { get; set; } = default!;

    public event Action? Action;

    public void Initialize(NavigationManager navigation)
    {
        Navigation = navigation;
    }

    public List<string> HistoryUrls { get; set; } = new List<string>();

    public void NavigateTo(string url)
    {
        var currentUrl = Navigation.ToBaseRelativePath(Navigation.Uri);
        HistoryUrls.Add(currentUrl);
        Navigation.NavigateTo(url);
    }

    public void NavigateToBack()
    {
        if (HistoryUrls.Count > 0)
        {
            string lastUrl = HistoryUrls.Last();
            Navigation.NavigateTo(lastUrl);
            HistoryUrls.RemoveAt(HistoryUrls.Count - 1);
        }
    }

    public bool OnBackButtonPressed()
    {
        if (Action != null && Action?.GetInvocationList().Length > 0)
        {
            var delegates = Action!.GetInvocationList();
            (delegates.Last() as Action)!.Invoke();
            return true;
        }

        if (HistoryUrls.Count > 0)
        {
            NavigateToBack();
            return true;
        }

        return false;
    }
}

  1. Ajoutez une classe de gestion du bouton retour pour Android, placez-la dans le dossier Platforms/Android et ajustez l'espace de noms si nécessaire
using Android.OS;
using Android.Views;
using Android.Widget;
using YourNamespace.IServices;
using Application = Android.App.Application;

namespace YourNamespace.Platforms.Android
{
    public static class BackButtonHandler
    {
        private static byte BackPressCount;

        public static bool OnBackButtonPressed(KeyEvent e)
        {
            if (e.KeyCode == Keycode.Back && e.Action == KeyEventActions.Down)
            {
                var service = MauiApplication.Current.Services.GetRequiredService<INavigationService>();
                bool handled = service!.OnBackButtonPressed();
                if (!handled)
                {
                    ExitApp();
                }
                return true;
            }
            return false;
        }

        public static void ExitApp()
        {
            if (BackPressCount == 1)
            {
                Process.KillProcess(Process.MyPid());
            }
            else if (BackPressCount == 0)
            {
                BackPressCount++;
                Toast.MakeText(Application.Context, "Appuyez encore une fois pour quitter", ToastLength.Long).Show();
                Task.Run(async () =>
                {
                    await Task.Delay(2000);
                    BackPressCount = 0;
                });
            }
        }
    }
}

  1. Modifiez Platforms/Android/MainActivity.cs pour ajouter le code suivant
public override bool DispatchKeyEvent(KeyEvent e)
{
    var handled = BackButtonHandler.OnBackButtonPressed(e);
    if (handled)
    {
        return true;
    }

    return base.DispatchKeyEvent(e);
}

  1. Ajoutez MainLayout.razor.cs dans le dossier Shared
public partial class MainLayout
{
    [Inject]
    NavigationManager Navigation { get; set; } = default!;

    [Inject]
    INavigationService NavigationService { get; set; } = default!;

    protected override void OnInitialized()
    {
        NavigationService.Initialize(Navigation);
        base.OnInitialized();
    }
}

  1. Modifiez MauiProgram.cs pour ajouter le code suivant
builder.Services.AddSingleton<INavigationService, NavigationService>();

Utilisation

Inejctez INavigationService

[Inject]
protected INavigationService NavigationService { get; set; } = default!;

Si vous souhaitez enregistrer l'historique des pages visitées, uitlisez NavigationService.NavigateTo(url). Lorsque vous appelez NavigationService.NavigateToBack() ou appuyez sur le bouton retour d'Android, la page précédente enregistrée sera affichée. Si vous voulez que le bouton retour exécute une méthode spécifique, ajoutez-la à l'événement NavigationService.Action += VotreMethode;. N'oubliez pas de la supprimer de l'événement après son exécution ou lors de la suppression du composant NavigationService.Action -= VotreMethode;

Étiquettes: MAUI Blazor Android NavigationManager C#

Publié le 4 août à 07h01