嘿,我正在使用这个 stackoverflow 中的 BackHandler。当我按下后退按钮时,它不起作用。有人可以指导我吗?
@Composable
fun ResultScreen(navController: NavHostController, nearestResultList: List<NearestResult>?) {
SportsResultTheme {
MainScaffold {
BackHandler {
navController.popBackStack()
}
LazyColumn {
if (nearestResultList != null) {
items(nearestResultList) { nearestResult ->
Text(
text = nearestResult.event
)
}
}
}
}
}
}
@Composable
internal fun NavigationGraph() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = ScreenRoute.Home.route) {
composable(ScreenRoute.Home.route) {
SetupMainActivityView { nearestResult ->
val nearestResultJson = Uri.encode(Json.encodeToString(nearestResult))
navController.navigate(ScreenRoute.Result.route + "/$nearestResultJson")
}
}
composable(
ScreenRoute.Result.route + "/{$NEAREST_RESULT_JSON}",
arguments = listOf(
navArgument(NEAREST_RESULT_JSON) { type = NearestResultParamType() }
)
) { backStackEntry ->
ResultScreen(navController, backStackEntry.arguments?.getParcelableArrayList(NEAREST_RESULT_JSON))
}
}
}
如果您想了解更多信息,请访问我的存储库。
更新
您可以观看我的视频链接。有人知道当我按回键时为什么屏幕会闪烁吗?
更新2
我在导航中添加了启动画面
@Composable
internal fun NavigationGraph() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = ScreenRoute.Splash.route) {
composable(route = ScreenRoute.Splash.route) {
SplashScreen(navController = navController)
}
composable(ScreenRoute.Home.route) {
SetupMainActivityView { nearestResult ->
val nearestResultJson = Uri.encode(Json.encodeToString(nearestResult))
navController.navigate(ScreenRoute.Result.route + "/$nearestResultJson") {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
}
}
composable(
ScreenRoute.Result.route + "/{$NEAREST_RESULT_JSON}",
arguments = listOf(
navArgument(NEAREST_RESULT_JSON) { type = NearestResultParamType() }
)
) { backStackEntry ->
ResultScreen(navController, backStackEntry.arguments?.getParcelableArrayList(NEAREST_RESULT_JSON))
}
}
}
更新3
navController.navigate(ScreenRoute.Result.route + "/$nearestResultJson") {
popUpTo(ScreenRoute.Home.route) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
添加启动画面时返回无法正常工作
更新4
@Composable
internal fun NavigationGraph() {
val navController = rememberNavController()
var home by remember {
mutableStateOf<String?>(null)
}
NavHost(navController = navController, startDestination = home ?: ScreenRoute.Splash.route) {
composable(route = ScreenRoute.Splash.route) {
home = ScreenRoute.Home.route
SplashScreen(navController = navController)
}
composable(ScreenRoute.Home.route) {
SetupMainActivityView { nearestResult ->
val nearestResultJson = Uri.encode(Json.encodeToString(nearestResult))
navController.navigate(ScreenRoute.Result.route + "/$nearestResultJson") {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
}
}
composable(
ScreenRoute.Result.route + "/{$NEAREST_RESULT_JSON}",
arguments = listOf(
navArgument(NEAREST_RESULT_JSON) { type = NearestResultParamType() }
)
) { backStackEntry ->
ResultScreen(navController, backStackEntry.arguments?.getParcelableArrayList(NEAREST_RESULT_JSON))
}
}
}
初始应用程序加载时,我的启动屏幕无法工作。结果屏幕后退按钮再次不起作用后,它直接打开我的主屏幕。
尝试
navController.navigateUp()
堆栈可能有很多条目,请尝试使用单例导航到该堆栈不充满不需要的条目,例如
navController.navigate("destination") {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
尝试使用动态启动目的地,如
var home by remember {
mutableStateOf<String?>(null)
}
NavHost(
navController = navController,
startDestination = home?:"splash_destination",
modifier = modifier
) {
composable("splash) {
home = "home_destination"
....
}
.....
}
然后继续之前的方法
有点晚了,但可能 BackHandler 没有运行,因为您正在覆盖 Activity 中的 onBackPressed 函数。