Xamarin.Forms动态链接跳转功能Xamarin.Android端失效问题求解
问题根因分析
- 订阅取消逻辑错误
你在Android端第一次完成跳转后直接调用了MessagingCenter.Unsubscribe,会直接导致后续所有动态链接事件无法被接收;同时原有的重复监听报错本质是MainPage被多次实例化,导致同一个dynamicLink消息被多次订阅,一次触发多次PushAsync操作,和是否需要用完就取消订阅无关,你的修复方向完全错误。
- 订阅取消逻辑错误
- 跳转操作未在UI主线程执行
Android端动态链接的回调默认运行在后台线程,MessagingCenter的回调会和发送线程保持一致,直接在后台线程调用Navigation.PushAsync会导致UI操作不生效,iOS端回调本身运行在主线程所以没有该问题。
- 跳转操作未在UI主线程执行
- 缺少Page实例有效性校验
你没有判断目标Page是否已经被加入导航栈,重复推送同一个Page实例就会抛出Page must not already have a parent.异常。
- 缺少Page实例有效性校验
修复方案
第一步:修复重复订阅问题
不要在跳转后取消订阅,保证订阅逻辑全局只执行一次即可:可以将订阅逻辑放到App.xaml.cs的构造函数中注册,或者在MainPage的OnAppearing生命周期中订阅、OnDisappearing生命周期中取消订阅,避免页面销毁后残留无效订阅。
第二步:修正跳转逻辑
强制跳转操作在UI主线程执行,同时增加Page有效性校验,修改后的getUrl代码如下:
private async void getURl(App sourece, TestModel model) { if(model?.page == null) return; // 强制所有UI跳转操作在主线程执行 Device.BeginInvokeOnMainThread(async () => { // 校验Page是否已经关联父容器,避免重复推送报错 if(model.page.Parent != null) { // 已关联父容器则重新创建对应页面实例 var pageType = model.page.GetType(); model.page = (Page)Activator.CreateInstance(pageType); } Console.WriteLine($"{model.page} - {Device.RuntimePlatform}"); await Navigation.PushAsync(model.page); }); }
第三步:优化MainPage初始化逻辑
检查App.xaml.cs中MainPage的赋值逻辑,确保全局仅初始化一次MainPage,不要每次应用从后台恢复、冷启动时都重新创建MainPage实例,从根源避免重复订阅问题。
内容的提问来源于stack exchange,提问作者장주명
相关产品推荐
相关产品推荐

