Призма формирует разницу между INavigatedAware и INavigatingAware? - PullRequest
0 голосов
/ 13 июня 2019

Я использую Prism Forms 7.x в приложении Xamarin Forms. До сих пор я использовал интерфейс INavigatedAware в моделях представления, чтобы проверить, произошла ли навигация к или от соответствующей модели представления. Теперь я увидел, что есть INavigatingAware, который предоставляет только метод OnNavigatingTo (поэтому навигация еще не завершена).

Мои вопросы, касающиеся INavigatingAware.OnNavigatingTo: - Могу ли я использовать INavigatingAware, если меня не интересует вызов OnNavigatedFrom? - Лучше ли с точки зрения производительности загружать данные в OnNavigatingTo (до установки BindingContext; чтобы, например, связывание данных не обновлялось дважды)?

Было бы неплохо поделиться своим опытом и лучшими практиками в отношении этих двух интерфейсов.

1 Ответ

1 голос
/ 13 июня 2019

INavigatingAware.OnNavigatingTo был впервые представлен в Prism, чтобы помочь разработчикам выполнять логику инициализации, аналогичную ViewWillAppear.

Чтобы лучше визуализировать это, события выглядят примерно так в NavigationService:

  • Создать страницу
  • Установить свойство ViewModelLocator.Autowire, если оно равно нулю
  • Применение любого поведения из PageBehaviorFactory
  • Вызовите IConfirmNavigation.CanNavigate (и его асинхронный аналог) на Page / ViewModel, от которой мы уходим от
  • Вызов INavigatingAware.OnNavigatingTo
  • Вставить страницу в стек NavigationStack
  • Call INavigatedAware.OnNavigated {From | To}

BREAKING CHANGE

Теперь, несмотря на все вышесказанное, мы получили огромное количество отзывов о INavigatingAware (суть этого вопроса), в результате чего подавляющая обратная связь от сообщества Prism INavigatingAware была сильно устаревшей в Prism 7.2. Это означает, что он был удален из INavigationAware и выдаст ошибку времени компиляции, если вы непосредственно реализуете его. Для тех случаев, когда вы получили его бесплатно от INavigationAware, он просто не будет вызываться. Продвигаясь вперед, мы ввели ряд интерфейсов, чтобы сделать это проще и более самодокументируемым в отношении намерений.

Новые интерфейсы и API
  • IInitialize.Initialize
  • IInitializeAsync.InitializeAsync
  • IAutoInitialize

Новый интерфейс IInitialize является прямой заменой INavigatingAware. Мы давно получаем отзывы о том, что людям нужна возможность выполнять асинхронные задачи во время инициализации. Проблема здесь заключается в том, что это может вызвать очень заметную задержку навигации, аналогичную IConfirmNavigationAsync. Если вы используете какой-либо из этих асинхронных интерфейсов, вам нужно обязательно включить какое-либо наложение занятости / загрузки на экране.

Наконец самое интересное ... IAutoInitialize - это просто интерфейс маркера. Если установлен ваш ViewModel, он автоматически попытается установить любые свойства в ViewModel на основе того, что содержится в NavigationParameters. Это без учета регистра, и есть дополнительный атрибут, который вы можете пометить в ваших свойствах в случае, если ваше имя свойства будет похоже на Model и ваше имя параметра будет monkey

...