Xamarin.Forms SharedTransitions插件集成后导航返回异常如何解决?
问题成因
该异常由SharedTransitions插件Android端原生渲染器的已知缺陷触发:
- 旧版本插件的
SharedTransitionPageRenderer未实现Xamarin.Android要求的(IntPtr, JniHandleOwnership)构造函数,当Shell返回导航触发页面实例回收重建、系统需要从native句柄恢复托管渲染器实例时,找不到对应构造函数就会抛出MissingMethodException,进而连锁触发NotSupportedException和JavaLocationException - Shell的返回导航逻辑会复用页面栈上下文,比传统NavigationPage导航更容易命中渲染器实例回收重建的场景,所以仅集成基础Shell功能就会触发异常
排查步骤
- 确认当前使用的SharedTransitions插件版本,低于2.2.0的版本均存在该构造函数缺失问题
- 验证Android项目的目标框架版本是否不低于Android 10.0 (API 29),低版本API和新版插件的兼容性问题也会触发同类异常
- 临时注释SharedTransitionAppShell的注册逻辑,改用默认AppShell测试返回导航功能,确认异常确实由插件集成导致
解决方案
- 优先升级SharedTransitions插件到2.2.0及以上的最新稳定版,官方已在该版本修复了渲染器构造函数缺失的问题
- 若因项目依赖限制无法升级插件,可在Android项目中新增自定义渲染器,手动补充缺失的构造函数:
using Android.Runtime; using Plugin.SharedTransitions.Platforms.Android; using Xamarin.Forms; // 若项目使用了FlyoutPage、TabbedPage等其他页面类型,需针对对应页面类型单独注册渲染器 [assembly: ExportRenderer(typeof(ContentPage), typeof(YourAppNamespace.Droid.CustomSharedTransitionPageRenderer))] namespace YourAppNamespace.Droid { public class CustomSharedTransitionPageRenderer : SharedTransitionPageRenderer { public CustomSharedTransitionPageRenderer(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership) { } } }
- 若以上方案均无效,检查导航逻辑是否混用了
INavigation.PopAsync()和Shell的GoToAsync("..")两种返回方法,统一使用Shell自带的导航方法即可。
内容的提问来源于stack exchange,提问作者Brett Nguyen
相关产品推荐
相关产品推荐

