如何在 Jetpack compose 中导航到其他屏幕时进行多个呼叫

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

在我的应用程序中,每当我们导航到另一个屏幕时,我都会添加动画:

  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。

  • 我将请求添加到 ViewModel 范围,它取消了,但有时调用仍然成功,这看起来不是一个好主意。我们有正确的方法吗?

谢谢!

android android-jetpack-compose android-navigation android-jetpack-navigation jetpack-compose-navigation
1个回答
0
投票

我看到您正在使用

lifecycle
作为
LaunchedEffect
的钥匙。大多数时候,如果我只想在 compose 中执行一次代码,我会使用
LaunchedEffect(Unit){}

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