hegaojian / JetpackMvvm

:chicken::basketball:一个Jetpack结合MVVM的快速开发框架,基于MVVM模式集成谷歌官方推荐的JetPack组件库:LiveData、ViewModel、Lifecycle、Navigation组件 使用Kotlin语言,添加大量拓展函数,简化代码 加入Retrofit网络请求,协程,帮你简化各种操作,让你快速开发项目
https://github.com/hegaojian/JetpackMvvm
Apache License 2.0
3.13k stars 610 forks source link

重要更新:关于使用了navigation且升级到1.2.3以后的版本 #74

Open hegaojian opened 3 years ago

hegaojian commented 3 years ago

在1.2.3之前的版本,使用navigation,虽然达到了切换fragment,不会销毁的作用,但是切换时生命周期不会走 onResume,onPause,而只能用 onHideChange方法去处理,这样的体验会不太友好,经过Alexxiaopang的建议,使用了新的方式替代.,从而达到了跟普通fragment一样的生命周期。从1.2.3版本前升级到1.2.3后需要修改name属性的配置,具体代码如下

<fragment
            android:id="@+id/host_fragment"
            android:name="me.hgj.jetpackmvvm.navigation.NavHostFragmentHideShow"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/main_navation" />
zhushenwudi commented 3 years ago

作者大大,关于AFragment跳转到 BFragment A -> B -> A -> B

其中 第一次 A -> B 传了一个 true 的bundle,第二次 A -> B 传了一个 false 的 bundle,但是在 B 中的 onResume 回调的都是第一次的 true,值没有改变。

代码:

 <fragment
    android:id="@+id/AFragment"
    android:name="xxx.AFragment"
    android:label="AFragment">
    <action
        android:id="@+id/action_AFragment_to_BFragment"
        app:destination="@id/BFragment" />
</fragment>
<fragment
    android:id="@+id/BFragment"
    android:name="xxx.BFragment"
    android:label="BFragment">
    <action
        android:id="@+id/action_BFragment_to_AFragment"
        app:destination="@id/AFragment"/>
</fragment>

第一次 A -> B

val bundle = Bundle()
bundle.putBoolean("isUser", true)
navigate(R.id.action_AFragment_to_BFragment, bundle)

B -> A

navigate(R.id.action_BFragment_to_AFragment)

第二次 A -> B

val bundle = Bundle()
bundle.putBoolean("isUser", false)
navigate(R.id.action_AFragment_to_BFragment, bundle)

BFragment.kt:

override fun onResume() {
    super.onResume()
    arguments?.run {
        val a = getBoolean("isUser")
        "$a".loge()
    }
}
18810951092 commented 3 years ago

从A->B->C,最后从C->A是不是有问题 博主

18810951092 commented 3 years ago

会创建出新的Fragment 用popBackStack指定到fragment失效

hegaojian commented 3 years ago

你popBackStack 是如何配置的

hegaojian commented 3 years ago
 <action
            android:id="@+id/action_CFrgment_to_AFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right"
            app:popUpToInclusive="false"
            app:popUpTo="@id/Afragment" />

你C到A时可以这么调用 nav().navigateAction(R.id.action_CFrgment_to_AFragment)

18810951092 commented 3 years ago

nav().popBackStack(R.id.action_CFrgment_to_AFragment,true) 用的它的这个方法 貌似有bug

hegaojian commented 3 years ago

你按照我上面的那种写法去试试吧,代码调用popBackStack 我还没有这么写过

18810951092 commented 3 years ago

666 nav().navigateAction(R.id.action_CFrgment_to_AFragment) 试了下这个方法有效 嗯

SaltedFish-Extreme commented 2 years ago

老哥,请问navigation+BottomNavigationView支持滑动切换页面吗?就像ViewPager2一样

SaltedFish-Extreme commented 2 years ago

老哥,话说我在FragmentContainerView中使用你的NavHostFragmentHideShow出了bug,不知道是不是页面重复缓存了😢

https://user-images.githubusercontent.com/54784104/146944981-a23f20b9-ce70-42b7-b502-138a099d9194.mp4

SaltedFish-Extreme commented 2 years ago

老哥,话说我在FragmentContainerView中使用你的NavHostFragmentHideShow出了bug,不知道是不是页面重复缓存了😢

搞了一个晚上加半个上午终于弄好了,使用FragmentContainerView时需要使用自定义的NavHostFragment还有navGraphnavGraph的标签要用自定义FragmentNavigator的注解,还有在activity中不能使用bottomNavigationView.setupWithNavController方法,要用

bottomNavigationView.setOnItemSelectedListener {
            navHostFragment.navController.navigate(it.itemId)
            return@setOnItemSelectedListener true
        }

坑是真的多,走了很多弯路,但是用过之后就感觉就没那么难了🤔在这感谢自定义FragmentNavigator解决Navigation重复创建的问题还有何老哥自定义的FragmentNavigator和NavHostFragment了😉

LYChunGit commented 2 years ago

@zhushenwudi 你的问题最近我在看项目出现过,官方有文档可以解决这个问题,这个应该跟fragment栈内复用有关,你可以使用官网《嵌套导航图》这个栏目 把重复的fragment多放在嵌套图里边,这样可以解决你的问题 https://developer.android.google.cn/guide/navigation/navigation-nested-graphs