在 kotlin android 项目中集成 Jetpack Compose 后,未在 Backpressed 上重新创建片段

问题描述 投票:0回答:1

在我使用片段的Android项目中。一切都按预期工作,直到我将 Jetpack Compose 集成到项目中。添加 Compose 后,我遇到了一个问题,即我的片段在导航过程中行为不正确,尤其是在背面。

  • 集成 Compose 之前

    • FragmentOne
      导航到
      FragmentTwo
      效果很好。
    • 当我按下后退按钮时,会重新创建
      FragmentOne
      ,并且我会看到预期的生命周期回调(
      onCreate
      onViewCreated
      onStart
      onResume
      )。
  • 集成 Compose 后

    • 导航至
      FragmentTwo
      仍然有效。
    • 按后退按钮只会重新创建
      FragmentOne
      ,但
      FragmentOne
      内的子片段不会重新创建
    • 子片段的生命周期回调(
      onCreate
      onViewCreated
      等)不会被调用,并且其视图不会恢复。

集成 Compose 之前(按回重新创建两个片段):

onViewCreated -> FragmentOne
onViewCreated -> ChildFragment
onStart -> FragmentOne
onStart -> ChildFragment
onResume -> FragmentOne
onResume -> ChildFragment

集成 Compose 后(按回键仅重新创建 FragmentOne):

onViewCreated -> FragmentOne
onStart -> FragmentOne
onResume -> FragmentOne

分片交易代码:

// Navigating to FragmentOne
fun presentFragmentOne() {
    val fragment = FragmentOne()
    supportFragmentManager.beginTransaction()
        .replace(R.id.fragmentContainer, fragment, "fragmentOne")
        .commit()
}

// Navigating to FragmentTwo
fun presentFragmentTwo() {
    val fragment = FragmentTwo()
    supportFragmentManager.beginTransaction()
        .setCustomAnimations(
            R.anim.slide_in_right,
            R.anim.slide_out_left,
            R.anim.slide_in_left,
            R.anim.slide_out_right
        )
        .replace(R.id.fragmentContainer, fragment, "fragmentTwo")
        .addToBackStack(null)
        .commit()
}

我尝试过的:

  • 将 Compose 和相关依赖项更新到最新的稳定版本。
  • 确保我不会无意中从堆栈中删除片段。

问题:

  1. 为什么集成 Jetpack Compose 后没有重新创建
    FragmentOne
    的子片段?
  2. Jetpack Compose 是否会干扰片段生命周期或返回堆栈操作?
  3. 如何确保在向后导航时正确重新创建
    FragmentOne
    中的子片段?

附加信息:

  • 仅在添加 Jetpack Compose 依赖项后才开始出现此问题。
  • 我还没有添加任何 Compose UI 代码。我只将 Compose 依赖项添加到项目中。
  • 活动布局使用简单的
    FragmentContainerView
    来托管片段。

提前致谢!

kotlin android-fragments android-jetpack-compose fragment-backstack
1个回答
0
投票

Kotlin 扩展导致了此问题。由于 kotlin 合成物已贬值,该行为正在发生。只需简单地删除合成并替换为视图绑定即可解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.