我在 Android Studio 中使用 Kotlin 创建了一个简单的应用程序。一切正常,整个应用程序中有 0 个错误。但有一个小问题,请高手帮帮我!所以,我在整个堆栈溢出中回顾了所有类似的问题,但它们根本不是我想要的,它们导致尝试了很多方法,但它们对我没有帮助。这就是我想要的:
我希望当我使用电子邮件和密码登录并进入仪表板活动时,应用程序保留在 DashboardActivity.kt 中,但当我关闭应用程序并重新打开它时,应用程序将注销并开始登录活动。
这是我的代码: ActivityMain.kt:
class MainActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
initData()
}
private fun initData(){
auth = FirebaseAuth.getInstance()
checkIfUserIsLoggedIn()
}
private fun checkIfUserIsLoggedIn(){
val currentUser = auth.currentUser
if (currentUser != null){
startActivity(Intent(this,DashbordActivity::class.java))
finish()
}else{
startActivity(Intent(this,LoginActivity::class.java))
finish()
}
}
}
DashboardActivity.kt:
class DashbordActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
private lateinit var binding: ActivityDashbordBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDashbordBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
initData()
}
private fun initData(){
auth = FirebaseAuth.getInstance()
setUserEmail()
clickListener()
}
private fun clickListener(){
binding.btnSignOut.setOnClickListener {
auth.signOut()
startActivity(Intent(this,LoginActivity::class.java))
finish()
}
}
private fun getCurrentUserEmail():String?{
return auth.currentUser?.email
}
private fun setUserEmail(){
binding.tvUserEmail.text = "welcome " + getCurrentUserEmail()
}
}
登录活动.kt:
class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
private lateinit var auth: FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
initData()
}
private fun initData(){
auth = FirebaseAuth.getInstance()
clickListener()
}
private fun clickListener(){
binding.llNewUser.setOnClickListener {
startActivity(Intent(this,RegisterActivity::class.java))
finish()
}
binding.btnLogin.setOnClickListener {
getUserData()
}
}
private fun getUserData(){
val email = binding.etEmail.text.toString()
val password = binding.etPassword.text.toString()
if (email.isNotEmpty() && password.isNotEmpty()){
authUser(email,password)
}else{
Toast.makeText(this,"All inputs required ...",Toast.LENGTH_LONG).show()
}
}
private fun authUser(email: String, password: String){
auth.signInWithEmailAndPassword(email,password)
.addOnCompleteListener {
checkResult(it.isSuccessful)
}
}
private fun checkResult(isSuccess: Boolean){
if (isSuccess){
startActivity(Intent(this,DashbordActivity::class.java))
finish()
}else{
Toast.makeText(this,"Authentication failed ...",Toast.LENGTH_LONG).show()
}
}
}
注册活动.kt:
class RegisterActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
private lateinit var binding: ActivityRegisterBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
auth = FirebaseAuth.getInstance()
binding = ActivityRegisterBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
initData()
}
private fun initData(){
auth = FirebaseAuth.getInstance()
clickListener()
}
private fun clickListener(){
binding.btnRegister.setOnClickListener {
createUser()
}
binding.llHaveAccount.setOnClickListener {
}
}
private fun createUser(){
val email = binding.etEmail.text.toString()
val password = binding.etPassword.text.toString()
val cPassword = binding.etcPassword.text.toString()
if (email.isNotEmpty() && password.isNotEmpty() && cPassword.isNotEmpty()){
if (password == cPassword){
saveUser(email,password)
}else{
Toast.makeText(this,"Password mismatch",Toast.LENGTH_LONG).show()
}
}else{
Toast.makeText(this,"All inputs required",Toast.LENGTH_LONG).show()
}
}
private fun saveUser(email: String, password: String){
auth.createUserWithEmailAndPassword(email,password)
.addOnCompleteListener {
checkResults(it.isSuccessful)
}
}
private fun checkResults(isSuccess: Boolean){
if (isSuccess){
startActivity(Intent(this,LoginActivity::class.java))
finish()
}else{
Toast.makeText(this,"Create to create your account",Toast.LENGTH_LONG).show()
}
}
}
我再说一遍:没有错误,应用程序工作完美,但是当我登录应用程序时,它会转到 DashboardActivity,但是当我关闭应用程序并重新打开它时,它会从 LoginActivity 开始。我希望登录后,当我关闭并重新打开应用程序时,它会保留在 DashboardActivity 中。
谢谢帮助我的人:)
据我从您的问题和评论中了解到,第二次打开应用程序时,
currentUser
对象是null
,即使您之前已通过身份验证。发生这种情况是因为 currentUser
对象没有及时更新。如果您想跟踪身份验证状态,正如 @FrankvanPuffelen 在他的评论中提到的那样,您必须使用 AuthStateListener,当身份验证状态发生更改时会调用它。因此,根据身份验证状态,您应该将用户重定向到相应的活动。