如果用户已登录,我希望从登录屏幕导航到主屏幕。由于我不熟悉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()
}
}
1条答案
按热度按时间pkwftd7m1#
在主Activity的
setContent {}
块中调用NavHost()
函数。在NavHost()
函数中,startDestination
应该是登录屏幕。然后将登录逻辑移动到LoginScreen组合对象中。类似于以下内容:以及