mauiapp-shell

Navigate to page on start in .NET Maui app


Seems like a simple question, but I haven't been able to find a simple answer. Essentially I want to choose which page in the app to start on based on some stored state. I added a GoToAsync call in the AppShell constructor, but this didn't work--which makes sense because the AppShell hasn't been fully constructed yet.

I found this answer, but it feels like it kind of skirts around the issue:

Maui AppShell - Navigate on Open

Where is the best place to inject some code that will run once on startup and can successfully navigate a .NET Maui app to a chosen page?


Solution

  • After playing around with overrides, it seems like overriding Application.OnStart works! Shell.Current is set at this point and navigation works.

    Here's additional code that allows for asynchronous initialization and uses a Loading Page until the initialization is complete:

    using MyApp.Services;
    using MyApp.UI;
    
    namespace MyApp;
    
    public partial class App : Application
    {
        ConfigurationProviderService m_configProvider;
    
        public App(ConfigurationProviderService configProvider)
        {
            m_configProvider = configProvider;
    
            InitializeComponent();
    
            MainPage = new LoadingPage();
        }
    
        protected override void OnStart()
        {
            var task = InitAsync();
    
            task.ContinueWith((task) =>
            {
                MainThread.BeginInvokeOnMainThread(() =>
                {
                    MainPage = new AppShell();
    
                    // Choose navigation depending on init
                    Shell.Current.GoToAsync(...);
                });
            });
    
            base.OnStart();
        }
    
        private async Task InitAsync()
        {
            await m_configProvider.InitAsync();
        }
    }