Xamarin Prism无法导航到LoginPageViewModel

时间:2020-10-07 06:47:11

标签: xamarin mvvm prism dryioc navigationservice

我正在尝试使我的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)

2 个答案:

答案 0 :(得分:1)

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

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

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

顺便说一句,这部分错误

解决方案根AppetiteApp.ViewModels.LoginPageViewModel 带有传递的参数[value(Prism.Navigation.ErrorReportingNavigationService)]

基本上意味着视图模型是通过以下调用resolver.Resolve(typeof(LoginPageViewModel), args: new[] { errorReportingNavigationService })

解析的

希望它可以帮助您或Xamarin知识渊博的人跟踪错误原因。

答案 1 :(得分:0)

因此,一旦我在 ICoreServices 内部进行了调查,我便注释掉了每个依赖项,然后发现 IUserSession 是造成问题的一次原因,然后我深入研究了该依赖关系 App.Xaml.cs 注册类型中缺少 IAppInfo IVersionTracking 的内容,所以我添加了它,然后它就起作用了!

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