Первый вид не отображается должным образом, когда Akavache используется ранее - PullRequest
0 голосов
/ 13 апреля 2020

Если я извлекаю объект из кэша, прежде чем показывать мой первый просмотр, тогда приложение просто покажет пустую белую страницу (на Android, не тестировал другие платформы). Если я заблокирую экран и разблокирую его, то мой вид показывает. Воспроизвести довольно просто:

  • Создайте новое приложение Xamarin.Forms (для этого примера я выбрал макет с вкладками).
  • Добавьте пакет nuget akavache во все проекты.
  • В 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();
        }
    }
}

Итак, что происходит здесь, и что более важно - есть ли исправление или обходной путь для этого?

1 Ответ

0 голосов
/ 13 апреля 2020

Что касается обходных путей go, мне удалось его найти. Если я установлю 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();
}

Так что мы на самом деле ждем результат от Акаваче до установки MainPage. В то время как другой обходной путь работал, немного расточительно установить страницу (что приводит к ее отображению), просто установить другую страницу почти сразу после.

...