mvvmxamarin.formsfreshmvvm

FreshMvvm - PopPageModel not works on Android


I have a Xamarin.Forms app and I am using FreshMvvm framework.

If I do this from ViewIsAppearing method of FirstPageModel:

CoreMethods.PushPageModel<SecondPageModel>();

I go the "SecondPageModel". Then, when I am in the "SecondPageModel" if I do:

CoreMethods.PopPageModel(); 

or press hard back button, or press title bar back button not works in Android (anything happens). I am using FreshMasterDetailNavigationContainer.

In iOS it works OK, I get back to FirstPageModel.


Solution

  • This is because ViewIsAppearing will always be called when the page starts displaying on the screen. When you pop the second page then go to the first page, the first page's ViewIsAppearing will fire again. It caused a dead cycle and prohibited your app from returning to the first page.

    Add a property to avoid that:

    bool isInitialized;
    public FirstPageModel()
    {
        // ...
    
        isInitialized = true;
    }
    
    protected async override void ViewIsAppearing(object sender, EventArgs e)
    {
        base.ViewIsAppearing(sender, e);
    
        if (isInitialized)
        {
            await Task.Delay(100);
            await CoreMethods.PushPageModel<SecondPageModel>();
            isInitialized = false;
        }
    
    }
    

    iOS may optimize this process, but I still recommend you to add this judgment statement.

    Update:

    Call it when your app has reached the main thread.

    protected override void ViewIsAppearing(object sender, EventArgs e)
    {
        base.ViewIsAppearing(sender, e);
    
        if (isInitialized)
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                CoreMethods.PushPageModel<SecondPageModel>();
                isInitialized = false;
            });
        }           
    }