Xamarin Forms + Mvvm跨平台渲染器问题

Xamarin Forms + MvvmCross Platform Renderers Issue

我正在将应用程序从 Xamarin Forms 2.4 更新到 3.2,并将 MvvmCross 6.2 集成到 Xamarin Forms 应用程序中。

Forms 3.2 的更新很顺利,更新后的应用程序 运行 很好。但是我在 MvvmCross 集成过程中迷路了。

当尝试调试应用程序时,它在我的代码中的这一行遇到断点:

return NavigationService.Navigate<LoginViewModel>();

当我进入 LoginViewModel 代码时,MvvmCross 似乎很高兴。但是,当它尝试呈现屏幕时,应用程序会出现以下异常情况。

异常 - 亮点

NullReferenceException
Xamarin.Forms.Platform.Android.IPlatformLayout.OnLayout(...)
Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:214

查看line 214 here显示:

Android.Platform.GetRenderer(Page).UpdateLayout();

我做的第一件事是检查自定义渲染器中的所有代码,一切看起来都很好。

然后我从 LoginView Xaml 中删除了自定义渲染器的所有实例,但问题仍然存在。这让我认为这是我缺少的配置。

在我的 Android 设置中 class 我有这个代码:

protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
    return new MvxAppCompatViewPresenter(AndroidViewAssemblies);
}

我已经将我的设置代码与 this example 进行了比较,它们似乎都一致。我不知道下一步该看哪里。

任何关于要检查的事情或已知解决方案的想法都将不胜感激。我还没有设法配置东西,所以我可以单步执行 Xamarin.Forms 代码,因此处理 null 被证明很尴尬。

异常 - 更多信息

 UNHANDLED EXCEPTION:
 System.NullReferenceException: Object reference not set to an instance of an object.
   at Xamarin.Forms.Platform.Android.AppCompat.Platform.Xamarin.Forms.Platform.Android.IPlatformLayout.OnLayout (System.Boolean changed, System.Int32 l, System.Int32 t, System.Int32 r, System.Int32 b) [0x00017] in D:\a\s\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:214
   at Xamarin.Forms.Platform.Android.PlatformRenderer.OnLayout (System.Boolean changed, System.Int32 l, System.Int32 t, System.Int32 r, System.Int32 b) [0x0000e] in D:\a\s\Xamarin.Forms.Platform.Android\PlatformRenderer.cs:73 
   at Android.Views.ViewGroup.n_OnLayout_ZIIII (System.IntPtr jnienv, System.IntPtr native__this, System.Boolean changed, System.Int32 l, System.Int32 t, System.Int32 r, System.Int32 b) [0x00009] in <b72bf8f25b8d497a89864a71b1ed8899>:0 
   at (wrapper dynamic-method) System.Object.40(intptr,intptr,bool,int,int,int,int)
JNI RegisterNativeMethods: attempt to register 0 native methods for android.runtime.JavaProxyThrowable

对于以后发现此问题的其他人...

我围绕这个所做的所有阅读表明这个例外本质上是误导性的。在我在线阅读的所有解决方案中,每一个都是不同的,这意味着有一大堆根本原因最终导致相同的错误。

就我而言,在代码迁移过程中,我忽略了删除 MainActivity.cs:

中的旧代码行
LoadApplication(new App())

这是应用程序先前版本中必需的引导方法。在引入了如此截然不同的引导过程之后,调用此方法会干扰新的初始化代码。

该方法仍然有效,因为它没有被标记为过时,因此从未被编译器标记为有问题。