Xamarin.forms 以前使用Akavache时第一视图未正确显示

Xamarin.forms 以前使用Akavache时第一视图未正确显示,xamarin.forms,akavache,Xamarin.forms,Akavache,如果我在显示第一个视图之前从缓存中提取一个对象,那么该应用程序只会在Android上显示一个空白的白页,而不会测试其他平台。如果我锁定屏幕并将其解锁,则显示我的视图。复制非常简单: 创建新的Xamarin.Forms应用程序我为此示例选择了选项卡式布局。 将akavache nuget包添加到所有项目中。 在App.xaml.cs中,在设置MainPage属性之前初始化akavache并获取对象。 启动应用程序-将是完全白色的屏幕。 锁定屏幕,并显示解锁-界面。这部分似乎只适用于我的物理手机,而

如果我在显示第一个视图之前从缓存中提取一个对象,那么该应用程序只会在Android上显示一个空白的白页,而不会测试其他平台。如果我锁定屏幕并将其解锁,则显示我的视图。复制非常简单:

创建新的Xamarin.Forms应用程序我为此示例选择了选项卡式布局。 将akavache nuget包添加到所有项目中。 在App.xaml.cs中,在设置MainPage属性之前初始化akavache并获取对象。 启动应用程序-将是完全白色的屏幕。 锁定屏幕,并显示解锁-界面。这部分似乎只适用于我的物理手机,而不适用于模拟器。 下面是一个示例App.xaml.cs,它将重现该问题

using System.Reactive.Linq;
using Akavache;
using Xamarin.Forms;
using AkavacheTest.Services;
using AkavacheTest.Views;

namespace AkavacheTest
{
    public partial class App : Application
    {

        public App()
        {
            InitializeComponent();

            DependencyService.Register<MockDataStore>();
        }

        protected override async void OnStart()
        {
            Akavache.Registrations.Start("Test");
            var test = await BlobCache.LocalMachine.GetOrFetchObject("Settings", async () => "New");
            MainPage = new MainPage();
        }
    }
}

那么这里发生了什么,更重要的是,有没有解决方法呢?

就解决方法而言,我设法找到了一个。如果我在从缓存获取之前设置主页面,那么我可以在获取缓存后重新设置主页面,而不会出现问题

这两种方法都有效:

    protected override async void OnStart()
    {
        MainPage = new Page();
        Akavache.Registrations.Start("Test");
        var test = await BlobCache.LocalMachine.GetOrFetchObject("Settings", async () => "New");
        MainPage = new MainPage();
    }

    protected override async void OnStart()
    {
        Akavache.Registrations.Start("Test");
        MainPage = new Page();
        var test = await BlobCache.LocalMachine.GetOrFetchObject("Settings", async () => "New");
        MainPage = new MainPage();
    }
不过,我还是很好奇为什么会发生这种情况。见@BenReierson的评论

考虑到这些信息,更好的解决方法是:

protected override void OnStart()
{
    Akavache.Registrations.Start("Test");
    var test = BlobCache.LocalMachine.GetOrFetchObject("Settings", async () => "New").GetAwaiter().GetResult();
    MainPage = new MainPage();
}

所以我们实际上是在设置主页之前等待来自Akavache的结果。虽然其他解决方法可行,但设置一个导致其呈现的页面是有点浪费的,仅仅是在之后立即设置另一个页面。

您对此进行了调试吗?您是否已通过代码查看您的主页是否被调用?是否存在任何错误、异常或日志消息?我已花了一些时间进行调试。我看不出有任何错误。MainPage正在构造中,OnAppearing也在MainPage上被调用。因为OnStart没有被等待,因为它通常不是异步方法,也不会返回任务。调用者在设置主页之前看到它返回,这很可能是导致问题的原因。@BenReierson这是有道理的。为了检验你的理论,我检验了你的理论,它似乎是正确的。我会用更好的方法更新这个答案。你刚刚救了我的命。。。我花了太多时间在这件事上,但最后我还是成功了。我想补充一点,我最终选择了另一个类似的解决方法。在我的应用程序类中,我导航到加载页面。在这个页面上,我写了一些类似于加载的东西,并在这里进行初始化。初始化完成后,我加载缓存并使用它来决定导航到哪个页面。