【问题标题】:Jetpack Compose NavHost recomposition composable multiple timesJetpack Compose NavHost 重组可多次组合
【发布时间】:2021-09-14 11:07:28
【问题描述】:

我发现可组合屏幕在从 Navhost compose 导航期间多次重新组合 以下示例显示了我如何将导航与日志集成以确定函数被调用的次数,

internal sealed class Screen(val route: String) {
  object Splash : Screen("splash")
  object Login : Screen("login")
  object Credentials : Screen("credentials/{type}") {
    fun createRoute(type: String) = "credentials/$type"
  }
}

@Composable
fun HostNavGraph(
  modifier: Modifier = Modifier,
  startDestination: String = Splash.route,
) {
  val navController = rememberNavController()
  val vm: CredentialsViewModel = getViewModel()
  NavHost(navController = navController, startDestination = startDestination, modifier = modifier) {
    composable(route = Splash.route) {
      Log.e("composable", " Splash")
      SplashScreen(openLogin = {
        navController.navigate(Login.route)
      }, openRegistration = { type ->
        navController.navigate(Credentials.createRoute(type))
      })
    }
    composable(route = Login.route) {
      Log.e("composable", " Login")
      val context = LocalContext.current
      LoginScreen(openRegistration = { type ->
        navController.navigate(Credentials.createRoute(type))
        {
          popUpTo(Splash.route) { inclusive = false }
        }

      }, openWebView = {
        openWebView(context, it)
      })
    }
    //..
  }
}

运行代码后,这就是打开 Splash 一次然后打开 LoginScreen 一次后导航的行为方式

15:05:14 E/composable:  Splash 
15:05:14 E/composable:  Splash 
15:05:25 E/composable:  Splash 
15:05:25 E/composable:  Login  
15:05:26 E/composable:  Splash 
15:05:26 E/composable:  Login  
15:05:26 E/composable:  Login  

我还尝试了一些带有 Navigation compose 的 Google 示例,它的行为方式相同,所以这是预期的行为吗?或者它是一个错误
navigation_version = '2.4.0-alpha08'

【问题讨论】:

    标签: android android-jetpack-compose android-jetpack-navigation jetpack-compose-navigation


    【解决方案1】:

    我不确定,但我认为 NavHost 有一个内置动画,只要有过渡。并且对于动画,重组可以像每一帧一样频繁地发生。

    一个可组合函数可能会非常频繁地运行,就像每个 动画帧。

    **Android compose

    【讨论】:

      【解决方案2】:

      这是 Android Compose 工作方式的一般性质。每当它发现有必要时,可组合重组自身。阅读文档了解更多详情。

      【讨论】:

      • 如果您要建议某人“阅读文档”,最好在答案中提供相关文档的链接。
      • 如果你希望你的代码只执行一次并且没有副作用,你可以使用 LaunchedEffect() 方法... LaunchedEffect(Unit){ //你的代码在这里 }
      猜你喜欢
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 2021-10-13
      • 2021-01-05
      • 1970-01-01
      • 2022-11-25
      • 2022-11-06
      • 1970-01-01
      相关资源
      最近更新 更多