INavigatedAware 和 INavigatingAware 之间的棱镜形式区别?

tho*_*ker 2 navigation prism xamarin.forms

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

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

很高兴分享您关于这两个接口的经验和最佳实践。

Dan*_* S. 6

INavigatingAware.OnNavigatingTo 首次引入 Prism 以帮助开发人员执行类似于ViewWillAppear.

为了帮助更好地形象化这一点,NavigationService 中的事件看起来像这样:

  • 创建页面
  • 如果为空,则设置 ViewModelLocator.Autowire 属性
  • 应用来自 PageBehaviorFactory 的任何行为
  • 在我们导航离开的 Page/ViewModel 上调用 IConfirmNavigation.CanNavigate(它是异步对应的)
  • 调用 INavigatingAware.OnNavigatingTo
  • 将页面推送到 NavigationStack
  • 调用 INavigatedAware.OnNavigated{From|To}

突破性变化

现在,所有这些都说,我们已经收到了大量关于 INavigatingAware(这个问题的本质)的反馈,结果是来自 Prism 社区的压倒性反馈 INavigatingAware 在 Prism 7.2 中已经过时了。这意味着它已从 INavigationAware 中删除,如果您直接实现它,则会引发编译时错误。对于从 INavigationAware 免费获得它的那些时候,它根本不会被调用。展望未来,我们引入了一系列接口,使这更容易和更自我记录的意图。

新接口和 API
  • IInitialize.Initialize
  • IInitializeAsync.InitializeAsync
  • 自动初始化

新的 IInitialize 接口是 INavigatingAware 的直接替代品。我们早就收到反馈,人们希望能够在初始化期间执行异步任务。这里的问题是,这会导致类似于 IConfirmNavigationAsync 的 Navigation 出现非常明显的延迟。如果您使用这些异步接口中的任何一个,您将需要确保在屏幕上包含某种忙碌/加载覆盖。

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