棱镜在INavigatedAware和INavigatingAware之间形成区别?

时间:2019-06-13 13:37:36

标签: xamarin.forms navigation prism

我在Xamarin Forms应用程序中使用Prism Forms7.x。到目前为止,我在视图模型中使用了INavigatedAware接口来检查是否发生了到相应视图模型的导航或从相应视图模型的导航。现在,我看到有INavigatingAware,它仅提供OnNavigatingTo方法(因此,导航尚未完成)。

有关INavigatingAware.OnNavigatingTo的问题: -我可以在对OnNavigatedFrom调用不感兴趣的地方使用INavigatingAware吗? -在OnNavigatingTo内加载数据是否在性能上更好(在设置BindingContext之前;这样,数据绑定不需要更新两次)?

很高兴与您分享这两个界面的经验和最佳实践。

1 个答案:

答案 0 :(得分:1)

INavigatingAware.OnNavigatingTo最初是引入Prism的,以帮助开发人员执行类似于ViewWillAppear的初始化逻辑。

为了更好地可视化此事件,在NavigationService中事件如下所示:

  • 创建页面
  • 设置ViewModelLocator.Autowire属性是否为空
  • 应用PageBehaviorFactory中的任何行为
  • 在我们要离开的Page / ViewModel上调用IConfirmNavigation.CanNavigate(及其异步对象)
  • 致电INavigatingAware.OnNavigatingTo
  • 将页面推送到NavigationStack上
  • 致电INavigatedAware.OnNavigated {发|至}

BREAKING CHANGE

现在所有这些都表明,我们已经收到了有关INavigatingAware的大量反馈(这个问题的本质),这是由于Prism社区的压倒性反馈使得InavigatingAware在Prism 7.2中已经过时了。这意味着它已从INavigationAware中删除,如果直接实现它,将抛出编译时错误。在那些您可以从INavigationAware免费获得的情况下,根本不会调用它。展望未来,我们引入了一系列接口,以使此操作更容易且更能自我记录。

新接口和API
  • IInitialize.Initialize
  • IInitializeAsync.InitializeAsync
  • IAutoInitialize

新的IInitialize接口可以直接替代INavigatingAware。我们早已得到反馈,人们希望在初始化过程中执行异步任务。这里的问题是,这可能会导致类似于IConfirmNavigationAsync的导航中非常明显的延迟。如果您使用这些异步接口中的任何一个,则需要确保在屏幕上包括某种忙/闲叠加层。

最后一个有趣的... IAutoInitialize只是一个标记界面。如果设置了ViewModel,它将基于NavigationParameters中包含的内容自动尝试设置ViewModel中的任何属性。这是不区分大小写的,在属性名称为Model且参数名称为monkey

的情况下,您可以在属性上标记一个附加属性