Ryan
Ryan

Reputation: 203

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?

Upvotes: 9

Views: 9864

Answers (1)

Ryan
Ryan

Reputation: 203

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

Upvotes: 6

Related Questions