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

2023-12-03

嘿我正在使用 BackHandler堆栈溢出。当我按下后退按钮时,它不起作用。有人可以指导我吗?

结果屏幕.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
                        )
                    }
                }
            }
        }
    }
}

导航图.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))
        }
    }
}

如果你想看更多请访问我的存储库.

UPDATE

你可以看我的视频link。有人知道当我按回键时为什么屏幕闪烁吗?

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

UPDATE 3

navController.navigate(ScreenRoute.Result.route + "/$nearestResultJson") {
                    popUpTo(ScreenRoute.Home.route) {
                        saveState = true
                    }
                    launchSingleTop = true
                    restoreState = true
                }

添加启动画面时返回无法正常工作

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

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


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

然后继续之前的方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

后台处理程序在jetpack compose中不起作用 的相关文章

随机推荐