FreshMvvm-PopPageModel在Android上不起作用

FreshMvvm-PopPageModel在Android上不起作用,mvvm,xamarin.forms,freshmvvm,Mvvm,Xamarin.forms,Freshmvvm,我有一个Xamarin.Forms应用程序,我使用的是FreshMvvm框架 如果我从FirstPageModel的ViewIsAppearing方法执行此操作: CoreMethods.PushPageModel<SecondPageModel>(); 或者按硬后退按钮,或者按标题栏后退按钮在Android中不起作用(任何事情都会发生)。我正在使用FreshMasterDetailNavigationContainer 在iOS中,它工作正常,我回到FirstPageModel。

我有一个Xamarin.Forms应用程序,我使用的是FreshMvvm框架

如果我从FirstPageModel的ViewIsAppearing方法执行此操作:

CoreMethods.PushPageModel<SecondPageModel>();
或者按硬后退按钮,或者按标题栏后退按钮在Android中不起作用(任何事情都会发生)。我正在使用FreshMasterDetailNavigationContainer


在iOS中,它工作正常,我回到FirstPageModel。

这是因为当页面开始在屏幕上显示时,
视图将始终被调用。当您弹出第二页然后转到第一页时,第一页的
视图将再次启动。它导致了一个死循环,并禁止您的应用程序返回到第一页

添加属性以避免出现以下情况:

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;
    }

}
bool初始化;
公共第一页模型()
{
// ...
isInitialized=true;
}
受保护的异步覆盖无效视图出现(对象发送方,事件参数e)
{
base.viewsappearing(发送方,e);
如果(已初始化)
{
等待任务。延迟(100);
等待corethods.PushPageModel();
i初始化=错误;
}
}
iOS可能会优化这个过程,但我仍然建议您添加这个判断声明

更新:

当你的应用程序到达主线程时调用它

protected override void ViewIsAppearing(object sender, EventArgs e)
{
    base.ViewIsAppearing(sender, e);

    if (isInitialized)
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            CoreMethods.PushPageModel<SecondPageModel>();
            isInitialized = false;
        });
    }           
}
protected override void viewsappearing(对象发送方,事件参数e)
{
base.viewsappearing(发送方,e);
如果(已初始化)
{
Device.beginInvokeMainThread(()=>
{
corethods.PushPageModel();
i初始化=错误;
});
}           
}

这是因为当页面开始在屏幕上显示时,
视图将始终被调用。当您弹出第二页然后转到第一页时,第一页的
视图将再次启动。它导致了一个死循环,并禁止您的应用程序返回到第一页

添加属性以避免出现以下情况:

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;
    }

}
bool初始化;
公共第一页模型()
{
// ...
isInitialized=true;
}
受保护的异步覆盖无效视图出现(对象发送方,事件参数e)
{
base.viewsappearing(发送方,e);
如果(已初始化)
{
等待任务。延迟(100);
等待corethods.PushPageModel();
i初始化=错误;
}
}
iOS可能会优化这个过程,但我仍然建议您添加这个判断声明

更新:

当你的应用程序到达主线程时调用它

protected override void ViewIsAppearing(object sender, EventArgs e)
{
    base.ViewIsAppearing(sender, e);

    if (isInitialized)
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            CoreMethods.PushPageModel<SecondPageModel>();
            isInitialized = false;
        });
    }           
}
protected override void viewsappearing(对象发送方,事件参数e)
{
base.viewsappearing(发送方,e);
如果(已初始化)
{
Device.beginInvokeMainThread(()=>
{
corethods.PushPageModel();
i初始化=错误;
});
}           
}

你能添加相关代码吗?我感觉你是在后台线程中完成的!PushPageModel是在UI线程中完成的,因为它正确地显示了SecondPageModel。但在这种情况下,当我按下“硬后退”按钮时,它总是在UI线程中被调用,不起作用。我认为没有线程问题。但是,我尝试Device.beginInvokeMainThread(()=>{CoreMethods.PopPageModel();});但仍然不起作用。你能添加相关的代码吗?我感觉你是从后台线程来做的!PushPageModel是在UI线程中完成的,因为它正确地显示了SecondPageModel。但在这种情况下,当我按下“硬后退”按钮时,它总是在UI线程中被调用,不起作用。我认为没有线程问题。但是,我尝试Device.beginInvokeMainThread(()=>{CoreMethods.PopPageModel();});但仍然不起作用,它起作用了!但是如果我删除了任务。延迟(100);这条线不行。你能给我解释一下为什么要推迟这个模型吗?谢谢@这是因为
viewsappearing
可能仍在线程中。你可以在我的更新中尝试这种方法。是的,它适用于更新的答案!非常感谢。对不起,我的回答迟了。它有效!但是如果我删除了任务。延迟(100);这条线不行。你能给我解释一下为什么要推迟这个模型吗?谢谢@这是因为
viewsappearing
可能仍在线程中。你可以在我的更新中尝试这种方法。是的,它适用于更新的答案!非常感谢。对不起,我迟了回答。