I’m working on transitioning a Xamarin.Forms app to Maui. In MauiProgram we call MauiAppBuilder.UsePrism() on the PrismAppBuilder we call .RegisterTypes() to register services and pages for navigation. We’ve confirmed that the services are getting initialized. At the end, in what was .OnAppStart, we now use .CreateWindow().
.CreateWindow(async (container, navigation) =>
{
AppCenter.Start("android=e0b01237-af3e-4e82-8df0-ebb24ae1c20d;ios=923451b3-01d3-4807-9eec-1ae9069c9fe9",
typeof(Analytics), typeof(Crashes));
var result = await navigation.NavigateAsync("/AppInitPage");
if (!result.Success)
{
HandleNavigationError(result.Exception);
}
})
This is resulting in non-successful navigation and resulting in the following exception:
Microsoft.Maui.Controls.InvalidNavigationException: ‘Expected Navigation Failed. No Root Window has been created.’
PrismAppBuilder:
.UsePrism(prism =>
prism
#if ANDROID
.RegisterTypes(Platforms.Android.PlatformRegistrations.RegisterPlatformTypes)
#endif
.RegisterTypes(containerRegistry =>
{
Barrel.ApplicationId = AppInfo.Current.PackageName;
//Register all of the services
containerRegistry.RegisterInstance<IPreferences>(Preferences.Default);
containerRegistry.RegisterInstance<IConnectivity>(Connectivity.Current);
containerRegistry.RegisterInstance<IAppInfo>(AppInfo.Current);
containerRegistry.RegisterInstance<IDeviceInfo>(DeviceInfo.Current);
containerRegistry.RegisterInstance<IVersionTracking>(VersionTracking.Default);
containerRegistry.RegisterSingleton<IAppSettings, AppSettings>();
containerRegistry.RegisterSingleton<IDb, Db>();
containerRegistry.RegisterSingleton<IAPI, API>();
containerRegistry.RegisterSingleton<ISyncManager, SyncManager>();
containerRegistry.RegisterSingleton<ISyncWorker, SyncWorker>();
containerRegistry.Register<IAuthentication, Authentication>();
containerRegistry.Register<IEncryptDecrypt, StringEncryptor>();
containerRegistry.Register<IHelpers, Helpers>();
//Register Pages
containerRegistry.RegisterForNavigation<ThemedNavigationPage>("NavigationPage");
containerRegistry.RegisterForNavigation<AboutPage>();
containerRegistry.RegisterForNavigation<AppInitPage>();
containerRegistry.RegisterForNavigation<TermsOfServicePage>();
containerRegistry.RegisterForNavigation<LoginPage>();
containerRegistry.RegisterForNavigation<CustomerSearchPage>();
containerRegistry.RegisterForNavigation<SettingsPage, SettingsPageViewModel>();
containerRegistry.RegisterForNavigation<CustomerPage>();
containerRegistry.RegisterForNavigation<FilesPage>();
containerRegistry.RegisterForNavigation<PhotoPage>();
containerRegistry.RegisterForNavigation<CustomerContactPage>();
containerRegistry.RegisterForNavigation<AssetPage>();
containerRegistry.RegisterForNavigation<ProductPage>();
//containerRegistry.RegisterGlobalNavigationObserver();
App.Container = containerRegistry.GetContainer();
App.Container.Resolve<IDb>().InitializeTables();
})
.AddGlobalNavigationObserver(context => context.Subscribe(x =>
{
if (x.Type == NavigationRequestType.Navigate)
Console.WriteLine($"Navigation: {x.Uri}");
else
Console.WriteLine($"Navigation: {x.Type}");
var status = x.Cancelled ? "Cancelled" : x.Result.Success ? "Success" : "Failed";
Console.WriteLine($"Result: {status}");
if (status == "Failed" && !string.IsNullOrEmpty(x.Result?.Exception?.Message))
Console.Error.WriteLine(x.Result.Exception.Message);
}))
.OnInitialized(_ =>
{
Microsoft.Maui.ApplicationModel.VersionTracking.Track();
})
.CreateWindow(async (container, navigation) =>
{
AppCenter.Start("android=e0b01237-af3e-4e82-8df0-ebb24ae1c20d;ios=923451b3-01d3-4807-9eec-1ae9069c9fe9",
typeof(Analytics), typeof(Crashes));
var result = await navigation.NavigateAsync("/AppInitPage");
if (!result.Success)
{
HandleNavigationError(result.Exception);
}
})
);
Exception stack:
[DOTNET] Navigation: http://localhost/AppInitPage
[DOTNET] Result: Failed
[DOTNET] A dependency issue occurred while resolving the ViewModel. Check the InnerException for the ContainerResolutionException
[DOTNET] Prism.Navigation.NavigationException: A dependency issue occurred while resolving the ViewModel. Check the InnerException for the ContainerResolutionException
[DOTNET] ---> Prism.Mvvm.ViewModelCreationException: Unable to Create ViewModel for 'myApp.Views.AppInitPage'.
[DOTNET] ---> Prism.Ioc.ContainerResolutionException: An unexpected error occurred while resolving 'myApp.ViewModels.AppInitPageViewModel'
[DOTNET] ---> DryIoc.ContainerException: code: Error.UnableToResolveFromRegisteredServices;
[DOTNET] message: Unable to resolve resolution root myApp.ViewModels.AppInitPageViewModel with passed arguments [Constant(Microsoft.Maui.Dispatching.Dispatcher, typeof(Microsoft.Maui.Dispatching.Dispatcher))]
[DOTNET] from container with scope {Name=null}
[DOTNET] with Rules with {TrackingDisposableTransients, FuncAndLazyWithoutRegistration, SelectLastRegisteredFactory} and without {ThrowOnRegisteringDisposableTransient}
[DOTNET] with FactorySelector=SelectLastRegisteredFactory
[DOTNET] with Made={FactoryMethod=ConstructorWithResolvableArguments}
[DOTNET] with normal and dynamic registrations:
[DOTNET] (DefaultDynamicKey(0), {FactoryID=869, ImplType=myApp.ViewModels.AppInitPageViewModel, Reuse=TransientReuse, HasCondition})
[DOTNET] at DryIoc.Throw.It(Int32 error, Object arg0, Object arg1, Object arg2, Object arg3) in /_/src/DryIoc/Container.cs:line 14774
[DOTNET] at DryIoc.Container.TryThrowUnableToResolve(Request request) in /_/src/DryIoc/Container.cs:line 933
[DOTNET] at DryIoc.Container.DryIoc.IContainer.ResolveFactory(Request request) in /_/src/DryIoc/Container.cs:line 915
[DOTNET] at DryIoc.Container.ResolveAndCacheKeyed(Int32 serviceTypeHash, Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Object scopeName, Type requiredServiceType, Request preResolveParent, Object[] args) in /_/src/DryIoc/Container.cs:line 510
[DOTNET] at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Type requiredServiceType, Request preResolveParent, Object[] args) in /_/src/DryIoc/Container.cs:line 469
[DOTNET] at DryIoc.Resolver.Resolve(IResolver resolver, Type serviceType, Object[] args, IfUnresolved ifUnresolved, Type requiredServiceType, Object serviceKey) in /_/src/DryIoc/Container.cs:line 8673
[DOTNET] at Prism.Container.DryIoc.DryIocScopedProvider.Resolve(Type type, ValueTuple`2[] parameters) in /_/src/Prism.Container.DryIoc/DryIocScopedProvider.cs:line 54
[DOTNET] --- End of inner exception stack trace ---
[DOTNET] at Prism.Container.DryIoc.DryIocScopedProvider.Resolve(Type type, ValueTuple`2[] parameters) in /_/src/Prism.Container.DryIoc/DryIocScopedProvider.cs:line 58
[DOTNET] at Prism.PrismAppBuilder.DefaultViewModelLocator(Object view, Type viewModelType) in D:aPrismPrismsrcMauiPrism.MauiPrismAppBuilder.cs:line 118
[DOTNET] --- End of inner exception stack trace ---
[DOTNET] at Prism.PrismAppBuilder.DefaultViewModelLocator(Object view, Type viewModelType) in D:aPrismPrismsrcMauiPrism.MauiPrismAppBuilder.cs:line 126
[DOTNET] at Prism.Mvvm.ViewModelLocationProvider.AutoWireViewModelChanged(Object view, Action`2 setDataContextCallback) in D:aPrismPrismsrcPrism.CoreMvvmViewModelLocationProvider.cs:line 136
[DOTNET] at Prism.Mvvm.ViewModelLocator.Autowire(Object view) in D:aPrismPrismsrcMauiPrism.MauiMvvmViewModelLocator.cs:line 85
[DOTNET] at Prism.Mvvm.ViewRegistryBase.Autowire(BindableObject view) in D:aPrismPrismsrcMauiPrism.MauiMvvmViewRegistryBase.cs:line 25
[DOTNET] at Prism.Mvvm.ViewRegistryBase`1[[Microsoft.Maui.Controls.BindableObject, Microsoft.Maui.Controls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].CreateView(IContainerProvider container, String name) in D:aPrismPrismsrcPrism.CoreMvvmViewRegistryBase{TBaseView}.cs:line 51
[DOTNET] at Prism.Navigation.PageNavigationService.CreatePage(String segmentName) in D:aPrismPrismsrcMauiPrism.MauiNavigationPageNavigationService.cs:line 903
[DOTNET] --- End of inner exception stack trace ---
[DOTNET] at Prism.Navigation.PageNavigationService.CreatePage(String segmentName) in D:aPrismPrismsrcMauiPrism.MauiNavigationPageNavigationService.cs:line 920
[DOTNET] at Prism.Navigation.PageNavigationService.CreatePageFromSegment(String segment) in D:aPrismPrismsrcMauiPrism.MauiNavigationPageNavigationService.cs:line 943
[DOTNET] at Prism.Navigation.PageNavigationService.ProcessNavigationForRootPage(String nextSegment, Queue`1 segments, INavigationParameters parameters, Nullable`1 useModalNavigation, Nullable`1 animated) in D:aPrismPrismsrcMauiPrism.MauiNavigationPageNavigationService.cs:line 589
[DOTNET] at Prism.Navigation.PageNavigationService.ProcessNavigation(Page currentPage, Queue`1 segments, INavigationParameters parameters, Nullable`1 useModalNavigation, Nullable`1 animated) in D:aPrismPrismsrcMauiPrism.MauiNavigationPageNavigationService.cs:line 486
[DOTNET] at Prism.Navigation.PageNavigationService.NavigateAsync(Uri uri, INavigationParameters parameters) in D:aPrismPrismsrcMauiPrism.MauiNavigationPageNavigationService.cs:line 378
**Microsoft.Maui.Controls.InvalidNavigationException:** 'Expected Navigation Failed. No Root Window has been created.'
We’ve been through each dependency on the AppInitPage to ensure that the dependencies and services that it’s trying to use are all built out. We should then expect that the constructor of the AppInitPage is called, however this is not happening and thus the navigation keeps failing. The same MauiProgram (except it uses OnAppStart instead of CreateWindow) is at use in another app and works without issues.
Matt_Ba is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.