后台处理程序在jetpack compose中不起作用

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

嘿,我正在使用这个 stackoverflow 中的 BackHandler。当我按下后退按钮时,它不起作用。有人可以指导我吗?

ResultScreen.kt

@Composable
fun ResultScreen(navController: NavHostController, nearestResultList: List<NearestResult>?) {
    SportsResultTheme {
        MainScaffold {
            BackHandler {
                navController.popBackStack()
            }
            LazyColumn {
                if (nearestResultList != null) {
                    items(nearestResultList) { nearestResult ->
                        Text(
                            text = nearestResult.event
                        )
                    }
                }
            }
        }
    }
}

NavigationGraph.kt

@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))
        }
    }
}

初始应用程序加载时,我的启动屏幕无法工作。结果屏幕后退按钮再次不起作用后,它直接打开我的主屏幕。

android kotlin android-jetpack-compose android-jetpack android-jetpack-navigation
2个回答
1
投票

尝试

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"
          ....
        }
.....
}

然后继续之前的方法


0
投票

有点晚了,但可能 BackHandler 没有运行,因为您正在覆盖 Activity 中的 onBackPressed 函数。

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