在 android 上使用屏幕上的后退按钮时如何取消订阅消息中心?

How to unsubscribe from messaging center when using the ON SCREEN back button on android?

当用户使用某个页面上的后退按钮(左上角)时,我试图从消息中心退订。我已经在为硬件后退按钮做这件事

protected override bool OnBackButtonPressed()
        {

            MessagingCenter.Unsubscribe<App, string>(this, "Trolley");
            return base.OnBackButtonPressed();
        }

但它不适用于屏幕上显示的后退按钮。 我知道“OnDisappearing”的存在,但它在我的情况下不起作用,因为我实际上需要它在进入新页面时起作用。

我在第 1 页并订阅“手推车”,然后加载第 2 页,发送消息“手推车”,最后关闭第 2 页。加载第 2 页时会触发 OnDisappearing,因此我无法接收如果我在 OnDisappearing 中取消订阅的消息。

首先,您需要了解Xamarin Life Cycle。并且通过覆盖 OnBackButtonPressed() 将仅在您点击 Android 设备上的物理后退按钮(靠近主页按钮)时起作用 .

对于你的情况,我认为你需要使用PageAppearing订阅,当你想退订时使用PageDisappearing

非模态页面没有 OnPushedOnPopped。如果你想要这样的方法,你需要自定义你的逻辑。

编辑

我找到了一个方法示例 https://gist.github.com/housecode/33c11faecff2d7be39f3b7503a686527

这里是要点中的代码

扩展 Xamarin.Forms NavigationPage 以添加 OnPushedOnPopped 事件。只需对任何 Page 实施 IPageEvent 即可添加这些方法,并将 NavigationPage 更改为 ExtNavPage

public class ExtNavPage : NavigationPage
{
    public ExtNavPage(Page page) : base(page)
    {
        this.AddNavigationEvent();
    }

    private void AddNavigationEvent()
    {
        Popped += (s, e) => NavEventHandle(e, true);
        PoppedToRoot += (s, e) => NavEventHandle(e, true);
        Pushed += (s, e) => NavEventHandle(e);
    }

    private void NavEventHandle(NavigationEventArgs e, bool isPop = false)
    {
        if (e.Page is IPageEvent pe) {
            if (isPop)
                pe.OnPopped();
            else
                pe.OnPushed();
        }
    }
}

public interface IPageEvent
{
    void OnPopped();
    void OnPushed();
}