Можно ли отложить загрузку компонентов PRISM / Xamarin Forms, которые не нужны сразу? - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть следующий AppDelegate, который загружается довольно долго:

      Syncfusion.ListView.XForms.iOS.SfListViewRenderer.Init();
        new Syncfusion.SfNumericUpDown.XForms.iOS.SfNumericUpDownRenderer();
        Syncfusion.SfCarousel.XForms.iOS.SfCarouselRenderer.Init();
        Syncfusion.XForms.iOS.Buttons.SfSegmentedControlRenderer.Init();
        Syncfusion.XForms.iOS.Buttons.SfCheckBoxRenderer.Init();

        new Syncfusion.XForms.iOS.ComboBox.SfComboBoxRenderer();
        //Syncfusion.XForms.iOS.TabView.SfTabViewRenderer.Init();
        new Syncfusion.SfRotator.XForms.iOS.SfRotatorRenderer();
        new Syncfusion.SfRating.XForms.iOS.SfRatingRenderer();
        new Syncfusion.SfBusyIndicator.XForms.iOS.SfBusyIndicatorRenderer();
  • Какие варианты следует учитывать, когда я знаю, что некоторые из этих компонентов не нужны для основногоэкран, но для подэкранов?

  • Я использую PRISM, и кажется, что каждая вкладка предварительно загружается непосредственно перед разрешением отображения или взаимодействия с конечным пользователем.Что я могу сделать, чтобы отложить предварительный рендеринг, который выполняет Prism TabView перед отображением интерфейса?

  • Должен ли я использовать Lazy<T>?Каков правильный подход?

  • Должен ли я переместить эти компоненты в другой раздел инициализации?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Метод Init () для пользовательских средств визуализации просто включает собственные сборки для упомянутых элементов управления при упаковке файла IPA.Это не влияет на время загрузки ваших страниц пользовательского интерфейса.

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

Спасибо, Самсудин

0 голосов
/ 30 сентября 2018

Есть несколько способов, которыми вы можете в конечном итоге достичь этого, и все зависит от ваших реальных целей.

Если ваша цель - как можно быстрее попасть на страницу Xamarin.Forms, чтобы у вас был какой-то индикатор активности, который, по сути, говорит пользователю: «Это нормально, я незаморожены, мы просто делаем некоторые вещи, чтобы подготовиться к вам ", тогда вы можете попробовать создать страницу" SpashScreen ", где вы делаете дополнительную загрузку.Настройка может выглядеть примерно так:

public partial class AppDelegate : FormsApplicationDelegate
    {
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();
            LoadApplication(new App(new iOSInitializer()));

            return base.FinishedLaunching(app, options);
        }
    }
}

public class iOSInitializer : IPlatformInitializer, IPlatformFinalizer
{
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterInstance<IPlatformFinalizer>(this);
    }

    public void Finalize()
    {
        new Syncfusion.SfNumericUpDown.XForms.iOS.SfNumericUpDownRenderer();
        Syncfusion.SfCarousel.XForms.iOS.SfCarouselRenderer.Init();
        Syncfusion.XForms.iOS.Buttons.SfSegmentedControlRenderer.Init();
        Syncfusion.XForms.iOS.Buttons.SfCheckBoxRenderer.Init();
    }
}

public class App : PrismApplication
{
    protected override async void OnInitialized()
    {
        await NavigationService.NavigateAsync("SplashScreen");
    }
}

public class SplashScreenViewModel : INavigationAware
{
    private IPlatformFinalizer _platformFinalizer { get; }
    private INavigationService _navigationService { get; }

    public SplashScreenViewModel(INavigationService navigationService, IPlatformFinalizer platformFinalizer)
    {
        _navigationService = navigationService;
        _platformFinalizer = platformFinalizer;
    }

    public async void OnNavigatedTo(INavigationParameters navigationParameters)
    {
        _platformFinalizer.Finalize();
        await _navigationService.NavigateAsync("/MainPage");
    }
}

Если вы работаете с модулями, вы можете использовать аналогичный подход, хотя любые модули, которые будут инициализироваться при запуске, будут по-прежнему выполнять этот вызов для инициализаторов перед их отображением.Вы установили страницу для навигации.Тем не менее, работа с модулями дает вам ряд преимуществ, так как вам только когда-либо придется инициализировать то, что на самом деле требуется приложению на тот момент.

Все это говорит о том, что я был бы удивлен, если вы увидитеЭто очень выгодно, поскольку эти Init вызовы, как правило, являются пустыми методами, предназначенными только для того, чтобы компоновщик не мог их связать ... если у вас нет ссылок или у вас есть файл компоновщика, вы можете просто дать указание компоновщику покинуть Syncfusion.и другие библиотеки в одиночку.

...