Xamarin新手使用Ninject 3.3.4创建StandardKernel时遇path1空参数异常
问题:Xamarin中使用Ninject创建StandardKernel时抛出ArgumentNullException
最近在学习Xamarin,打算用Ninject作为IoC容器实现依赖注入。我已经在Visual Studio 2017社区版里通过NuGet安装了Ninject 3.3.4版本,但在App.Xaml.cs里执行这段代码时:
Kernel = new StandardKernel(new TripLogCoreModule(), new TripLogNavModule(mainPage.Navigation));
突然抛出了错误:
Ninject StandardKernel System.ArgumentNullException: value cannot be null. Parameter name: path1
我在网上搜了快两个小时都没找到对应的解决方案,最后才发现是自己的疏忽导致的,特意把这个问题和解决方法分享出来,避免其他新手踩同样的坑。
这个错误的根源其实很简单——你在创建TripLogNavModule时传入的mainPage.Navigation是null值!
在Xamarin中,页面的Navigation属性并不是在页面实例化时就立刻初始化的,它需要等到页面被添加到导航栈之后才会有有效的实例。如果你刚创建完mainPage就直接取它的Navigation属性,得到的肯定是null,而Ninject在处理这个空参数时,内部逻辑触发了带有path1参数的空值异常(这个错误提示确实有点误导性,容易让人往文件路径方向排查)。
你可以通过以下两种方式修正:
方式1:延迟初始化导航模块
先初始化核心模块,等页面加载完成后再加载导航模块:
// 先创建主页面实例 var mainPage = new MainPage(); // 先初始化核心模块,暂时不加载导航模块 Kernel = new StandardKernel(new TripLogCoreModule()); // 监听页面加载完成事件,此时Navigation属性已初始化 mainPage.Loaded += (sender, e) => { if (mainPage.Navigation != null) { // 加载导航模块并传入有效的Navigation实例 Kernel.Load(new TripLogNavModule(mainPage.Navigation)); } }; // 将主页面设置为应用根页面,此时页面会被加入导航栈 MainPage = mainPage;
方式2:修改导航模块支持延迟设置导航实例
调整TripLogNavModule的实现,让它支持后续传入Navigation实例:
public class TripLogNavModule : NinjectModule { private INavigation _navigation; // 允许构造时不传入Navigation public TripLogNavModule(INavigation navigation = null) { _navigation = navigation; } // 提供方法后续设置Navigation public void SetNavigation(INavigation navigation) { _navigation = navigation; // 重新绑定Navigation服务 Rebind<INavigation>().ToConstant(_navigation); } public override void Load() { if (_navigation != null) { Bind<INavigation>().ToConstant(_navigation); } } }
然后在App.Xaml.cs中这样使用:
var mainPage = new MainPage(); var navModule = new TripLogNavModule(); // 同时加载核心模块和导航模块(此时导航模块未绑定Navigation) Kernel = new StandardKernel(new TripLogCoreModule(), navModule); mainPage.Loaded += (sender, e) => { // 页面加载完成后设置有效的Navigation实例 navModule.SetNavigation(mainPage.Navigation); }; MainPage = mainPage;
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

