Jetpack Compose + Navigation - navigate() 上的无限循环[重复]

2024-01-01

我正在使用 Jetpack Compose + Navigation(单一活动,无片段),并且我正在尝试执行如下导航路线:

SplashScreen---(延迟)--->AuthScreen---(如果成功)-->MainScreen

不幸的是,当我执行登录时,该功能navigate() in the LoginScreen可组合项会导致无限循环。我不明白我是否正在触发重组或会发生什么。 不幸的是,很难共享所有代码,但请记住:

  • 这个问题似乎与LoginScreen and MainScreen可组合项(您可以假设它们只是一个简单的Text可组合)
  • 这似乎与NavigationGraph也。事实上,如果我只是做SplashScreen --> MainScreen过渡没有问题发生
  • 如果我删除该行navController.navigate("main")不再有循环;
  • 该代码基于(几乎复制粘贴)this https://github.com/AseemWangoo/hands_on_kotlin/tree/master/app/src/main/java/com/aseemwangoo/handsonkotlin example

这是AuthScreen出现问题的代码。

@Composable
fun AuthScreen(navController: NavController) {
    val signInRequestCode = 1
    val context = LocalContext.current

    val mSignInViewModel: SignInGoogleViewModel = viewModel(
        factory = SignInGoogleViewModelFactory(context.applicationContext as Application)
    )

    val state = mSignInViewModel.googleUser.observeAsState()
    val user = state.value

    val isError = rememberSaveable { mutableStateOf(false) }


    val authResultLauncher =
        rememberLauncherForActivityResult(contract = GoogleApiContract()) { task ->
            try {
                val gsa = task?.getResult(ApiException::class.java)

                if (gsa != null) {
                    mSignInViewModel.fetchSignInUser(gsa.email, gsa.displayName)
                } else {
                    isError.value = true
                }
            } catch (e: ApiException) {
                Log.e("Authscreen", e.toString())
            }
        }

    AuthView(
        onClick = { authResultLauncher.launch(signInRequestCode) },
        isError = isError.value,
        mSignInViewModel
    )

    Log.d("TEST", "Loop check")  //THIS GOES LIKE CRAZY IN THE LOGCAT!

    user?.let {
        mSignInViewModel.hideLoading()

        //Create JSON adapter to move data
        val moshi = Moshi.Builder().build()
        val jsonAdapter = moshi.adapter(GoogleUserModel::class.java).lenient()
        val userJson = jsonAdapter.toJson(user)

        //Navigate to main screen
        navController.navigate("main")
    }

}

这是导航图代码:

const val ROOT_ROUTE = "root_route"

@Composable
fun SetupRootNavGraph(navController: NavHostController) {
    NavHost(
        navController = navController,
        startDestination = Screen.SplashScreen.route,
        route = ROOT_ROUTE
    ) {
        composable(Screen.SplashScreen.route) { SplashScreen(navController)}
        composable(Screen.AuthScreen.route) { AuthScreen(navController)}
        composable(Screen.MainScreen.route) {MainScreen(navController)}
    }
}

这是因为您正在尝试从可组合项进行导航。请参阅文档 https://developer.android.com/jetpack/compose/navigation

您应该仅将 navigator() 作为回调的一部分调用,而不是作为可组合项本身的一部分,以避免在每次重组时调用 navigator()。

你可以使用LaunchEffect例如

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack Compose + Navigation - navigate() 上的无限循环[重复] 的相关文章

随机推荐