有一天,我需要在我的 Jetpack Compose 项目中实现一个 Google Accompanist 库。由于库依赖于当前稳定的 Compose 版本,我不得不将它与navigation-compose
库一起更新。事情破裂了。
我将BottomNavigation
其用作顶级导航,并从与此相关的选项卡中进行更深入的导航BottomNavigation
。每个选项卡都有自己的NavHostController
,我想将其保存到一个Bundle
以稍后恢复控制器。用例:
- 用户打开选项卡 1
- 从 Tab 1 内部导航到另一个屏幕
- 切换到选项卡 2
- 切换回 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 内部发生了什么变化,它停止工作而没有抛出任何错误?如何改变我的代码以复制“之前”行为?