Xamarin Forms + MvvmCross平台渲染器问题

时间:2018-09-21 16:19:15

标签: xamarin xamarin.forms xamarin.android mvvmcross

我正在将应用程序从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安装程序类中,我有以下代码:

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\1\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\1\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

1 个答案:

答案 0 :(得分:1)

对于以后发现它的任何人...

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

就我而言,在代码迁移期间,我忽略了删除CSharpSyntaxTree中的旧代码行:

MainActivity.cs

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

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