导航回可组合项时避免 API 调用可组合项

Avoid API call in composable when navigating back to it

我想做的是避免在从另一个可组合项按回时进行在可组合项中调用的 api 调用。

我有可组合的 DetailScreen,可以调用 api 并获取一些数据,然后导航到可组合的 EpisodeScreen,事情是这样的,当我按回它时,它会导航回可组合的 DetailScreen,但它使 api 再次打电话,这就是我要避免的。

这是我的可组合 DetailScreen:

@Composable
fun DetailScreen(
    viewModel: DetailViewModel = hiltViewModel(),
    id: Int,
    name: String,
    picture: String,
    onClickBack: () -> Unit,
    onClickEpisode: (Int) -> Unit
) {

   
    LaunchedEffect(key1 = Unit) {
        //this is the line I'm trying to avoid when navigate back from composable EpisodeScreen
        viewModel.getCharacterDetail(id)
    }

...

这是可组合 EpisodeScreen 的导航:

private fun NavGraphBuilder.addDetailGraph(navController: NavHostController) {
    composable(
        route = Screen.Detail.route,
        arguments = listOf(
            navArgument("id") { type = NavType.IntType },
            navArgument("name") { type = NavType.StringType },
            navArgument("image") { type = NavType.StringType }
        )
    ) { backStackEntry ->
        val id = backStackEntry.arguments?.getInt("id") ?: 0
        val name = backStackEntry.arguments?.getString("name") ?: ""
        val image = backStackEntry.arguments?.getString("image") ?: ""

        DetailScreen(
            id = id,
            picture = image,
            name = name,
            onClickBack = {
                navController.popBackStack()
            },
            onClickEpisode = { episodeId ->
                navController.navigate(
                    Screen.Episode.createRoute(id = episodeId)
                ) 
            }
        )
    }
}

我尝试使用 remember 和 remembersaveable 保持状态并将其作为参数放入 LaunchEffect() 但没有任何信息,我找不到信息或者我可以看到它

谁能帮我解决这个问题??提前致谢:)

当您导航到 Episode 屏幕时,您的 DetailViewModel 实例仍然存在,因此您可以在那里放置一些逻辑。您可以执行以下操作之一:

  • 在您的 ViewModel 中创建一个布尔值,初始设置为 false。在 setCharacter 函数内,检查此变量的值。如果它是 true 只是 return 否则将其更改为 true 并执行其余代码。或者,如果您在 ViewModel 中已经有一个在 setCharacter 中初始化的变量,您可以使用它来代替那个布尔值。

  • 另一种选择是在视图模型的 init 块内调用 setCharacter 函数。您可以从 SavedStateHandle 中获取 id,您可以将其注入视图模型。