fantastischIdee
fantastischIdee

Reputation: 577

Xamarin forms Navigation issue. Popped page stays active

I have a page "PageA" which listens to a Changed event on a global object. The page is added in the navigation stack like this: await Navigation.PushAsync(new PageA()); The page is removed by clicking the back button in the navigation bar. When I do the same x times, I have x times PageA instances listening to the Changed event. So PageA is created over and over again, but is never really removed. How do I really get rid of the PageA when clicking the back button?

Upvotes: 0

Views: 1908

Answers (2)

user2767141
user2767141

Reputation: 132

another reason: NavigationPage.CurrentNavigationTask.Result still refer to the popped page instance. that is why GC will not collect it. unless you navigate to other pages.

Upvotes: 0

ClintL
ClintL

Reputation: 1453

Example of what you are doing

public partial class MyPage : ContentPage
{

    MyPage()
    {
        this.SomeEvent += SomeEventBeyondTheScopeOfThisPage();
    }

    protected override void OnDisappearing()
    {
       //You should add this
       this.SomeEvent -= SomeEventBeyondTheScopeOfThisPage();
    }
}

Which even if the page is popped from your navigation stack does not remove the reference from MyPage.SomeEvent to SomeEventBeyondTheScopeOfThisPage. So when the Garbage Collector comes along this page is going to stay and this event is going to continue to be listened for.

Just detach the event in OnDisappearing for the simple answer. You dont dispose the page you just detach all references and events outside of its scope. A better idea would be to make your code more modular and not worry about detaching the event. If the event source were coming from within the page itself it would not need to be detached.

public partial class MyPage : ContentPage
{

    MyPage()
    {
        this.SomeEvent += SomeEventWithinPagesScope();
    }

    private Task SomeEventWithinPagesScope()
    {
       //My cool event goes here           
    }
}

If it does have to be global another option would be Messaging Center. I do not believe you have to detach those listeners but I could be wrong.

https://developer.xamarin.com/guides/xamarin-forms/messaging-center/

Upvotes: 1

Related Questions