迁移到 FormsApplicationActivity 导致 NavigationRenderer 出现异常

Migrating to FormsApplicationActivity causing exceptions in NavigationRenderer

在我的应用程序中,我用 FormsAppCompatActivity 替换了 AndroidActivity。

现在在扩展 NavigationRenderer 的自定义呈现器中,我得到一个异常,该异常可追溯到方法 Xamarin.Forms.Platform.Android.NavigationRenderer.SwitchContentAsync:

[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.InvalidCastException: Cannot cast from source type to destination type.
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.SwitchContentAsync (Xamarin.Forms.Page,bool,bool) <IL 0x000bd, 0x003fe>
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.OnPushAsync (Xamarin.Forms.Page,bool) <IL 0x00004, 0x0003f>
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.PushViewAsync (Xamarin.Forms.Page,bool) <IL 0x00003, 0x00036>
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.<OnElementChanged>b__4_0 (Xamarin.Forms.Page) <IL 0x00003, 0x00033>
[MonoDroid] at Xamarin.Forms.EnumerableExtensions.ForEach<Xamarin.Forms.Page> (System.Collections.Generic.IEnumerable`1<Xamarin.Forms.Page>,System.Action`1<Xamarin.Forms.Page>) <0x000bf>
[MonoDroid] at Xamarin.Forms.Platform.Android.NavigationRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs`1<Xamarin.Forms.NavigationPage>) <IL 0x000ea, 0x006ff>
[MonoDroid] at Boats.Droid.PageFancyRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs`1<Xamarin.Forms.NavigationPage>) [0x00001] in d:\Code\Boats\Droid\Renderers\NavigationPageFancy.cs:33

我无法进入它,因为我没有 Xamarin.Forms 的源代码。该方法的反编译是here

有什么想法吗?

这是因为 AppCompat 引入了一个新的 NavigationRenderer,所以我应该使用 class 而不是 Xamarin.Forms.Platform.Android 中的 NavigationRenderer。

所以,解决方案是:

public class PageFancyRenderer : Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer

而不是:

public class PageFancyRenderer : Xamarin.Forms.Platform.Android.NavigationPageRenderer

为什么会出现这个错误:

在NavigationPageRenderer.SwitchContentAsync里面有这样一行:

          ((Platform) this.Element.Platform).NavAnimationInProgress = false;

这是对 Android.Platform class 的转换,因为我是 subclassing Android.NavigationRenderer

正确的渲染器 Android.AppCompat.NavigationRenderer 将投射到元素的正确平台(使用 AppCompatActivity 时),即 Android.AppCompat.Platform

如果 Xamarin.Forms 是开源的,这会更容易捕捉到,因为我可以实际调试代码,但相反,我必须查看 IL 反汇编以找到该行导致错误。

为了社区的利益请开源Xamarin.Forms