作者:年小个大
链接:https://juejin.cn/post/6925331537399382030
1. Navigation到底该如何正确的使用
相信大家对 Navigation都有所耳闻,我不细说怎么用了,官方的讲解也很详细。我是想说一下到底该如何更好的使用这个组件。
这个组件其实是需要配合官方的MVVM架构使用的,ViewModel+LiveData结合才能更好的展现出Navigation的优势。
在官方的讲解示例中没有用到ViewModel和LiveData,官方只是演示了Navigation怎么用怎么在页面之间传值,和这个组件的一些特性之类的。但真正用好还是要结合ViewModel和LiveData。
2. Navigation大家都以为的缺陷
起初我用Navigation的时候,最头疼的是当按下返回键回到上个页面的时候整个页面被重建了,这是开发中不想要的结果,很多时候大家都会去寻求一种方式:将官方的replace
方式替换为Hide
和Show
。起初也是想到这个方式,然后结合在网上得到的资料自己写了一个方式FragmentNavigatorHideShow。
3. 然而这不是缺陷
但是很快啊,我发现这个方式(Hide
和Show
)存在严重的逻辑问题。
这里可以看到,有一些场景下,我们有某个页面可以打开和自己相同的页面,只不过是展示的数据不同而已。当我用hide
和show
的方式展示下个页面的时候,会发现打开的还是上个页面。当按下返回键之后,上个相同的页面不见了,新打开的页面和上个页面尽然是同一个对象,这肯定不符合业务逻辑。于是我又开始研究起replace
的方式,当然我在使用这个Navigation的时候就采用了MVVM + ViewModel+LiveData,这时候我想起ViewModel是不受Fragment重建影响的。于是我打印了一下在使用replace
方式下页面生命周期的变化。
从HomeFragment
进入MyFragmen
t生命周期变化:
可以看到,在replace
之后HomeFragment
并没有执行onDestory
而是执行了onDestoryView
这也使得页面必须要重建。而onDestoryView
不会导致 ViewModel的销毁。也就是说 ViewModel还在,ViewModel中的LiveData所保存的数据也是存在的。当我按下返回键,重新回到HomeFragment
页面理所当然的执行了onViewCreated