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())
这是应用程序先前版本中必需的引导方法。在引入了如此截然不同的引导过程之后,调用此方法会干扰新的初始化代码。
该方法仍然有效,因为它没有被标记为过时,因此从未被编译器标记为有问题。
我正在将应用程序从 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())
这是应用程序先前版本中必需的引导方法。在引入了如此截然不同的引导过程之后,调用此方法会干扰新的初始化代码。
该方法仍然有效,因为它没有被标记为过时,因此从未被编译器标记为有问题。