导航回可组合项时避免 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
,您可以将其注入视图模型。
我想做的是避免在从另一个可组合项按回时进行在可组合项中调用的 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
,您可以将其注入视图模型。