Prism.Navigation.INavigationService,是一个接口,无法构造

Prism.Navigation.INavigationService, is an interface and cannot be constructed

我在使用 MVVM Prism 时遇到了一个奇怪的异常。

这是我的代码:

LoginPageViewModel.cs 文件:

    using Prism.Commands;
    using Prism.Mvvm;
    using Prism.Navigation;
    using Prism.Services;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using Xamarin.Forms;
    using Prism.Unity;
    using Microsoft.Practices.Unity;
    using System.Threading.Tasks;
    using MobileApp.Views;

    namespace MobileApp.ViewModels
    {
        public class LoginPageViewModel : BindableBase, INavigationAware
        {

            .
            .
            .
            private INavigationService _navigationService;

            public LoginPageViewModel(INavigationService navigationService, ...)
            {
                .
                .
                .
                _navigationService = navigationService;
            }
        }
    }

App.xaml.cs 我调用登录页面的文件:

    using Prism.Unity;
    using MobileApp.Views;
    using Xamarin.Forms;
    using System;
    using System.Globalization;
    using Microsoft.Practices.Unity;
    using Prism.Navigation;
    using Microsoft.Practices.ServiceLocation;
    using System.Diagnostics;
    using MobileApp.ViewModels;
    using System.Threading.Tasks;

    namespace MobileApp
    {
        public partial class App : PrismApplication
            {
                public App(IPlatformInitializer initializer = null) : base(initializer)
                {

                }

                protected override void OnInitialized()
                {
                    NavigationService.NavigateAsync("LoginPage"); // ERROR here (Exception)
                    .
                    .
                    .
                }

                protected override void RegisterTypes()
                {

                    Container.RegisterTypeForNavigation<NavigationPage>();
                    Container.RegisterTypeForNavigation<LoginPage>();
                    .
                    .
                    .
                }
        }
    }

在 NavigationService.NavigateAsync("LoginPage") 调用之后,我得到这个错误:

System.InvalidOperationException: The current type, Prism.Navigation.INavigationService, is an interface and cannot be constructed. Are you missing a type mapping?

有谁知道怎么解决吗? 谢谢

首先,您可以尝试使 OnInitialized 异步,等待 NavigateAsync 并将整个过程包装在一个 try catch 中,并为任何异常提供调试输出。

其次,虽然您在这里看到的内容看起来是正确的,但当导航服务的名称有拼写错误时,通常会发生此错误。 Unity 注入导航服务的方式必须完全正确命名,否则将无法解析。您可以尝试从 Unity 切换到 DryIoc,看看是否能解决您的问题。它也是一个更快的 DI 容器并且实际上得到了维护!

我遇到了同样的问题。我尝试将 OnInitialized 标记为 async 并在 NavigationService.NavigateAsync 中使用 nameof 以避免拼写错误,但它没有用。万一其他人有同样的问题,我在 RegisterTypes:

的开头添加了这一行就解决了
Container.Register<Prism.Navigation.INavigationService, Prism.Navigation.PageNavigationService>();

它将 PageNavigationService 注册为 INavigationService 的实现。