0

如果我在显示我的第一个视图之前从缓存中获取一个对象,那么应用程序将只显示一个空白页(在 Android 上,没有测试其他平台)。如果我锁定屏幕并解锁它,那么我的视图就会显示出来。重现非常简单:

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

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

那么这里发生了什么,更重要的是 - 是否有解决方案或解决方法?

4

1 回答 1

1

就解决方法而言,我设法找到了一个。如果我设置了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。虽然其他解决方法有效,但设置一个页面(这会导致它被呈现)有点浪费,只是在之后几乎立即设置另一个页面。

于 2020-04-12T22:23:33.407 回答