在我的应用程序中,每当我们导航到另一个屏幕时,我都会添加动画:
NavHost(
navController = navController,
startDestination = startDestination,
enterTransition = {
slideIntoContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Companion.Left,
animationSpec = tween(TRANSITION_ANIMATION_DURATION)
)
},
exitTransition = {
slideOutOfContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Companion.Left,
animationSpec = tween(TRANSITION_ANIMATION_DURATION)
)
},
popEnterTransition = {
slideIntoContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Companion.Right,
animationSpec = tween(TRANSITION_ANIMATION_DURATION)
)
},
popExitTransition = {
slideOutOfContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Companion.Right,
animationSpec = tween(TRANSITION_ANIMATION_DURATION)
)
}
) {
composable(route = AppDestination.Recent.destination) { nav ->
AbcRoute(navController = navController, entry = nav)
}
}
在路线中:
@Composable
fun AbcRoute(
navController: NavController,
entry: NavBackStackEntry,
) {
val objectA = entry.arguments?.getString(AppDestination.Abc.objectA)?.let {
Json.decodeFromString<A>(it)
} ?: return
val viewModel = hiltViewModel<AbcViewModel>()
val lifecycle = LocalLifecycleOwner.current.lifecycle
val state = viewModel.enhanceState.collectAsStateWithLifecycle()
LaunchedEffect(lifecycle) {
viewModel.initialize(objectA)
}
在 ViewModel 中,每次用户打开屏幕时我都会开始调用 API。 但问题是,因为它有动画,所以屏幕多次重组 -> 多次调用 API。
谢谢!
我看到您正在使用
lifecycle
作为 LaunchedEffect
的钥匙。大多数时候,如果我只想在 compose 中执行一次代码,我会使用 LaunchedEffect(Unit){}