Android Studio 如何在jetpack compose中从onStart活动调用导航

omqzjyyz  于 2023-02-19  发布在  Android
关注(0)|答案(1)|浏览(110)

如果用户已登录,我希望从登录屏幕导航到主屏幕。由于我不熟悉Kotlin和jetpack compose,我不确定如何实现这一点,因为SetContent{}只能从create方法和Navigation调用()组件只能从可组合对象中调用。回到Java+XML格式编码中,我们使用Intent和StartActivity(),但由于jetpack compose推荐单活动多屏幕编程风格,我不明白这一点

class MainActivity : ComponentActivity() {

    //private lateinit var auth: FirebaseAuth
    lateinit var mGoogleSignInClient: GoogleSignInClient
    private lateinit var signInLauncher: ActivityResultLauncher<Intent>


    override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val account = GoogleSignIn.getLastSignedInAccount(this);
        if (account != null) {
//            in XML style , we used to use
//            Intent intent = new Intent(LoginActivity.this, UserHomeActivity.class);
//            startActivity(intent);
            account.getEmail()?.let { Log.d("Signed In: ", it) };
        } else {
            Log.d("Signed In: ", "Not signed in");
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        val gso =
            GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build()

        mGoogleSignInClient = GoogleSignIn.getClient(
            this,
            gso
        )

        signInLauncher = registerForActivityResult(
            ActivityResultContracts.StartActivityForResult(),
            ActivityResultCallback<ActivityResult> { result ->
                val task: Task<GoogleSignInAccount> =
                    GoogleSignIn.getSignedInAccountFromIntent(result.getData())
                handleSignInResult(task)
            })

        super.onCreate(savedInstanceState)

        setContent{

            Navigation(mGoogleSignInClient = mGoogleSignInClient, signInLauncher = signInLauncher)

    }

    private fun handleSignInResult(completedTask: Task<GoogleSignInAccount>
//                                   ,navController: NavController
) {
        try {
            val account = completedTask.getResult(ApiException::class.java)
            val idToken = account.idToken
//            navController.navigate(Screens.UserHomeScreen.route)
//            val intent = Intent(this@LoginActivity, UserHomeActivity::class.java)
//            startActivity(intent)
        } catch (e: ApiException) {
            Log.w("Sign In Error", "signInResult:failed code=" + e.statusCode)
            Toast.makeText(this, "Sign in failed", Toast.LENGTH_SHORT).show()
        }
    }
pkwftd7m

pkwftd7m1#

在主Activity的setContent {}块中调用NavHost()函数。在NavHost()函数中,startDestination应该是登录屏幕。然后将登录逻辑移动到LoginScreen组合对象中。类似于以下内容:

override fun onCreate(savedInstanceState: Bundle?) {
    NavigationHost(navController = rememberNavController())
}

以及

@Composable
fun NavigationHost(navController: NavHostController) {
    NavHost(
        navController = navController,
        startDestination = Screen.LoginScreen.route
    ) {
            ...
    }
}

相关问题