Xamarin 棱镜无法导航到 LoginPageViewModel

Xamarin Prism Unable to navigate to LoginPageViewModel

我正在尝试让我的 Xamarin 项目使用带 Prism 和 DryIoc 的 MVVM。

我最想像下面这样使用自动注册:

[AutoRegisterForNavigation] 
...
protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
//Pages
 containerRegistry.RegisterForNavigation<NavigationPage>();

//Services
containerRegistry.RegisterSingleton<ILocalDatabase, LocalDatabase>();
containerRegistry.RegisterSingleton<IUserProfileDataStore, UserProfileDataStore>();
containerRegistry.RegisterSingleton<IApplicationSettings, ApplicationSettings>();
containerRegistry.RegisterSingleton<ILogger, Logger>();
containerRegistry.RegisterSingleton<IApiService, ApiService>();
containerRegistry.RegisterSingleton<IUserSession, UserSession>();
containerRegistry.Register<IBrowser, BrowserImplementation>();
containerRegistry.Register<IConnectivity, ConnectivityImplementation();
containerRegistry.Register<IFileSystem, FileSystemImplementation>();
containerRegistry.Register<ICoreServices, CoreServices>();
}

我也尝试过手动注册:

 containerRegistry.RegisterForNavigation<LoginPage, LoginPageViewModel>();

都没有用,它点击了后面的登录页面代码,然后因以下错误而中断:

Exception - High: Prism.Ioc.ContainerResolutionException: 
An unexpected error occurred while resolving 'AppetiteApp.ViewModels.LoginPageViewModel' ---> 
DryIoc.ContainerException: code: UnableToResolveUnknownService; message: Unable to resolve 
Resolution root AppetiteApp.ViewModels.LoginPageViewModel 
with passed arguments [value(Prism.Navigation.ErrorReportingNavigationService)]

**System.NullReferenceException:** 'Object reference not set to an instance of an object.'

我也尝试过使用链接器文件将其构建操作设置为“linkdescription”

至于我的登录页面,这里是声明

   public LoginPageViewModel(ICoreServices coreServices)
            : base(coreServices)

LoginPageViewModel 的构造函数需要已注册的 ICoreServices 参数。

错误消息说 LoginPageViewModel 本身对于 IoC 是未知的 - 这意味着类型 LoginPageViewModel 没有直接注册,也没有通过动态注册或未知服务解析器找到。

我不是 Xamarin Prism 的用户,所以我不确定它注册视图模型的机制。

顺便说一句,这部分错误

Resolution root AppetiteApp.ViewModels.LoginPageViewModel with passed arguments [value(Prism.Navigation.ErrorReportingNavigationService)]

基本上意味着 view-model 是通过愚蠢的调用 resolver.Resolve(typeof(LoginPageViewModel), args: new[] { errorReportingNavigationService })

解决的

希望它能帮助您或熟悉 Xamarin 的人跟踪错误原因。

所以一旦我调查了 ICoreServices 内部,我注释掉了每个依赖项,然后发现 IUserSession 是曾经引起问题的原因然后我深入研究并发现 IAppInfoIVersionTracking 的依赖项在 App.Xaml.cs[=18= 中丢失了] registr typees 所以我添加了它然后它起作用了!

containerRegistry.Register<IAppInfo, AppInfoImplementation>();
containerRegistry.Register<IVersionTracking, VersionTrackingImplementation>();