0

有一天,我需要在我的 Jetpack Compose 项目中实现一个 Google Accompanist 库。由于库依赖于当前稳定的 Compose 版本,我不得不将它与navigation-compose库一起更新。事情破裂了。

我将BottomNavigation其用作顶级导航,并从与此相关的选项卡中进行更深入的导航BottomNavigation。每个选项卡都有自己的NavHostController,我想将其保存到一个Bundle以稍后恢复控制器。用例:

  1. 用户打开选项卡 1
  2. 从 Tab 1 内部导航到另一个屏幕
  3. 切换到选项卡 2
  4. 切换回 Tab 1。在第 2 步打开的屏幕是 Tab 1 的当前目标NavGraph

Before 状态中提供的代码按预期工作。

迁移前我的依赖项(撰写版本 1.0.0-alpha12):

    // Compose
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation "androidx.compose.material:material:$compose_version"
    implementation "androidx.compose.ui:ui-tooling:$compose_version"
    implementation "androidx.compose.material:material-icons-extended:$compose_version"
    implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
    implementation "androidx.navigation:navigation-compose:1.0.0-alpha07"

在我的顶级可组合中,在BottomNavigation被调用的地方,我有一个状态:

    val employeesNavState = rememberSaveable { mutableStateOf(Bundle()) }

我将其传递给我的 Tab 可组合:

EmployeesTab(employeesNavState)

这由以下函数描述:

@Composable
fun EmployeesTab(navState: MutableState<Bundle>) {
    val navController = rememberNavController() // The navController responsible for navigation state
    DisposableEffect(null) {
        val callback = NavController.OnDestinationChangedListener { controller, _, _ ->
            // The state is saved on each navigation event
            navState.value = controller.saveState() ?: Bundle()
        }
        navController.addOnDestinationChangedListener(callback)
        // The state is restored from the navState created by the callback
        navController.restoreState(navState.value)

        onDispose {
            navController.removeOnDestinationChangedListener(callback)
            // workaround for issue where back press is intercepted
            // outside this tab, even after this Composable is disposed
            navController.enableOnBackPressed(false)
        }
    }

    NavHost(navController, startDestination = "employees") {
        composable("employees") {
            appBarViewModel.onNavigate(AppScreen.Employees, navController)
            Employees(it.hiltViewModel(), navController)
        }
        composable("employee/{userId}") {
            appBarViewModel.onNavigate(AppScreen.EmployeeDetails, navController)
            Employee(it.hiltViewModel())
        }
    }
}

迁移后我的依赖项(撰写版本 1.0.3):

    // Compose
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation "androidx.compose.material:material:$compose_version"
    implementation "androidx.compose.ui:ui-tooling:$compose_version"
    implementation "androidx.compose.material:material-icons-extended:$compose_version"
    implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
    implementation "androidx.navigation:navigation-compose:2.4.0-alpha10"
    implementation "com.google.accompanist:accompanist-flowlayout:0.19.0"

其他代码的每一位都保持不变。不知何故,这只是停止工作。我做了一些调试,并确保controller.saveState()不返回null。在两个版本中都会触发回调。

我发现唯一不同的是 的navigate()函数NavController,即 中的扩展函数navigation-compose:1.0.0-alpha07和 中的成员函数navigation-compose:2.4.0-alpha10。我从Employees可组合的内部调用它。

问题

API 内部发生了什么变化,它停止工作而没有抛出任何错误?如何改变我的代码以复制“之前”行为?

4

0 回答 0