【问题标题】:Null Exception in App constructor when starting Prism 7 application启动 Prism 7 应用程序时 App 构造函数中出现空异常
【发布时间】:2018-01-01 19:12:26
【问题描述】:

我升级了一个 xamarin 表单应用程序以使用 prism 7。当应用程序启动(android 项目)时,它在此行崩溃

public App(IPlatformInitializer initializer = null) : base(initializer) { }

错误是

System.ArgumentNullException: Value cannot be null.
Parameter name: path1

预发行版以及 myget 的当前最新版本会发生这种情况:7.0.0.343-ci。

prism 6.3 没有出现这个错误。

App.xaml.cs:

using Prism;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Ninject;
using SunBaseApp.Helpers;
using Xamarin.Forms;

[assembly: Xamarin.Forms.Xaml.XamlCompilation(Xamarin.Forms.Xaml.XamlCompilationOptions.Compile)]

namespace SunBaseApp
{
    public partial class App : PrismApplication
    {
        public App() : this(null) { }

        public App(IPlatformInitializer initializer = null) : base(initializer) { }

        protected override async void OnInitialized()
        {
            InitializeComponent();

            await NavigationService.NavigateAsync("/NavigationPage/LoginPage");
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            var cont = containerRegistry.GetKernel();

            cont.Bind<IAppSettings>().To<AppSettings>().InSingletonScope();
            cont.Bind<IDataService>().To<DataService>().InSingletonScope();

            containerRegistry.RegisterForNavigation<NavigationPage>();
            containerRegistry.RegisterForNavigation<LoginPage, LoginPageModel>();
            containerRegistry.RegisterForNavigation<MainPage, MainPageModel>();
            containerRegistry.RegisterForNavigation<SettingsEditPage, SettingsEditPageModel>();
            containerRegistry.RegisterForNavigation<StatPage, StatPageModel>();
            containerRegistry.RegisterForNavigation<WebsiteListPage, WebsiteListPageModel>();
            containerRegistry.RegisterForNavigation<WebsiteEditPage, WebsiteEditPageModel>();
        }
    }    
}

App.xaml:

<?xml version="1.0" encoding="utf-8" ?> <prism:PrismApplication xmlns="http://xamarin.com/schemas/2014/forms"
                        xmlns:prism="clr-namespace:Prism.Ninject;assembly=Prism.Ninject.Forms"
                        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                        x:Class="SunBaseApp.App">

  <Application.Resources>
    <ResourceDictionary>
      <Color x:Key="WindowBackgroundColor">#97D3F3</Color>
      <Color x:Key="ButtonBackgroundColor">Green</Color>
      <Color x:Key="ButtonTextgroundColor">White</Color>
      <Color x:Key="textColor">Black</Color>

      <Style TargetType="Button">
        <Setter Property="BackgroundColor" Value="{DynamicResource ButtonBackgroundColor}" />
        <Setter Property="TextColor" Value="{DynamicResource ButtonTextgroundColor}" />
      </Style>

      <!--<Style TargetType="NavigationPage">
        <Setter Property="BarBackgroundColor" Value="Red"/>
        <Setter Property="BarTextColor" Value="Green"/>
      </Style>-->

      <!--<Style TargetType="NavigationPage">
        <Setter Property="BarBackgroundColor" Value="{DynamicResource ButtonBackgroundColor}" />
      </Style>-->

    </ResourceDictionary>   </Application.Resources>

</prism:PrismApplication>

主要活动:

using Android.App;
using Android.Content.PM;
using Android.OS;
using Acr.UserDialogs;
using Prism;
using Prism.Ioc;

namespace SunBaseApp.Droid
{
    [Activity(Label = "SunBaseApp", Icon = "@drawable/icon2", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            ToolbarResource = Resource.Layout.toolbar;
            TabLayoutResource = Resource.Layout.tabs;

            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);

            LoadApplication(new App(new AndroidInitializer()));

            UserDialogs.Init(this);
        }

        public class AndroidInitializer : IPlatformInitializer
        {
            public void RegisterTypes(IContainerRegistry containerRegistry)
            {
            }
        }
    }
}

非常感谢任何想法。

【问题讨论】:

    标签: xamarin.forms prism


    【解决方案1】:

    看起来 Ninject 在 Droid 上运行时存在一些问题。我建议您更新您的项目以使用另一个更稳定的容器。还要记住,最新版本不需要直接引用容器,除非您需要更高级的注册。像您所拥有的那样基本的东西可以简单地注册,例如:

    containerRegistry.RegisterSingleton<IAppSettings, AppSettings>();
    

    【讨论】:

    • 谢谢丹!我切换到 DryIoc,它又可以工作了。还应用了更简单的注册。
    • 我遇到了和 Ed S 完全相同的问题。除了切换 IoC 容器之外,您还可以提供其他提示吗? @Dan S.
    • @TobiasTheel Ninject 不再是 Prism 支持的容器
    • 你有这方面的资料吗?听起来我不应该开始使用 Prism。
    • 我有确切的来源吗?
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 2016-04-09
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2015-06-09
    相关资源
    最近更新 更多