Android端点击页面屏幕返回键时如何取消MessagingCenter订阅
实现方案
你只需要区分「Push新页面导致当前页面隐藏」和「Pop当前页面导致页面销毁」两种场景,仅在Pop场景下执行取消订阅逻辑即可,有两种常用实现路径:
方案1:监听导航事件判断导航类型(通用性最强)
该方案兼容Shell、传统NavigationPage两种导航模式,同时自动覆盖硬件返回、左上角导航返回、iOS侧滑返回等所有回退场景,无需单独适配。
传统NavigationPage场景代码示例
protected override void OnAppearing() { base.OnAppearing(); // 订阅当前导航栈的导航事件 Navigation.Navigating += OnNavigating; } protected override void OnDisappearing() { base.OnDisappearing(); // 取消导航事件订阅,避免内存泄漏 Navigation.Navigating -= OnNavigating; } private void OnNavigating(object sender, NavigatingEventArgs e) { // 仅当导航类型为Pop(当前页面被弹出栈)时,取消MessagingCenter订阅 if (e.NavigationMode == NavigationMode.Pop) { MessagingCenter.Unsubscribe<App, string>(this, "Trolley"); } }
Shell导航场景代码示例
protected override void OnAppearing() { base.OnAppearing(); Shell.Current.Navigating += OnShellNavigating; } protected override void OnDisappearing() { base.OnDisappearing(); Shell.Current.Navigating -= OnShellNavigating; } private void OnShellNavigating(object sender, ShellNavigatingEventArgs e) { // 判断为当前页面被弹出的回退操作时执行取消订阅 if (e.NavigationMode == NavigationMode.Pop) { MessagingCenter.Unsubscribe<App, string>(this, "Trolley"); } }
方案2:自定义导航栏返回按钮(精准绑定点击操作)
如果需要严格只在点击左上角返回按钮时触发取消逻辑,可以替换系统默认返回按钮,自定义点击事件:
public 你的页面类名() { InitializeComponent(); // 隐藏系统默认返回按钮 NavigationPage.SetHasBackButton(this, false); // 新增自定义返回按钮 var backToolbarItem = new ToolbarItem { IconImageSource = "你的返回图标资源名", Order = ToolbarItemOrder.Primary, Priority = 0 }; backToolbarItem.Clicked += async (s, e) => { // 先执行取消订阅 MessagingCenter.Unsubscribe<App, string>(this, "Trolley"); // 再执行返回逻辑 await Navigation.PopAsync(); }; ToolbarItems.Add(backToolbarItem); }
注意:该方案需要同时保留你原有的
OnBackButtonPressed硬件返回逻辑,否则硬件返回不会触发取消订阅。
内容的提问来源于stack exchange,提问作者Elgate
相关产品推荐
相关产品推荐

