作者:郑云雪 | 来源:互联网 | 2023-05-17 12:56
使用Kotlin使用MVVP架构设置应用程序时,我感到非常困惑。
具体来说,我正在尝试使用此结构来设置Firebase Auth。
我一直在关注这篇出色的Java文章:https://medium.com/firebase-tips-tricks/how-to-create-a-clean-firebase-authentication-using-mvvm-37f9b8eb7336
因此,我建立了一个简单的启动画面,并在此之后创建了:
SplashRepository -连接到Firestore数据库
SplashViewModel -观察存储库
Splashactivity -遵守ViewModel
以下代码:
class SplashRepository {
private val firebaseAuth = FirebaseAuth.getInstance()
private val firestore = FirebaseFirestore.getInstance()
private val usersCollectiOnRef= firestore.collection("users")
private val user: UserObject = UserObject()
fun checkIfUserIsAuthenticatedInFirebase(): MutableLiveData {
val isUserauthenticateInFirebaseMutableLiveData = MutableLiveData()
val firebaseUser = firebaseAuth.currentUser
if (firebaseUser == null) {
user.isAuthenticated = false
isUserauthenticateInFirebaseMutableLiveData.setvalue(user)
} else {
user.userID= firebaseUser.uid
user.isAuthenticated = true
isUserauthenticateInFirebaseMutableLiveData.setvalue(user)
}
return isUserauthenticateInFirebaseMutableLiveData
}
fun addUserToLiveData(userID: String): MutableLiveData {
val userMutableLiveData: MutableLiveData = MutableLiveData()
usersCollectionRef.document(userID).get()
.addOnCompleteListener(OnCompleteListener { userTask: Task ->
if (userTask.isSuccessful) {
val document = userTask.result
if (document!!.exists()) {
val user: UserObject? = document.toObject(UserObject::class.java)
userMutableLiveData.setvalue(user)
}
} else {
Log.d(TAG,userTask.exception!!.message)
}
})
return userMutableLiveData
}
}
class SplashViewModel(application: Application) : AndroidViewModel(application) {
private val splashRepository: SplashRepository
lateinit var isUserauthenticatedLiveData: LiveData
lateinit var userLiveData: LiveData
fun checkIfUserIsAuthenticated() {
isUserauthenticatedLiveData = splashRepository.checkIfUserIsAuthenticatedInFirebase()
}
fun setUid(userID: String) {
userLiveData = splashRepository.addUserToLiveData(userID)
}
init {
splashRepository = SplashRepository()
}
}
class Splashactivity : AppCompatactivity() {
var splashViewModel: SplashViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupSplashViewModel()
checkIfUserIsAuthenticated()
}
private fun setupSplashViewModel() {
splashViewModel = ViewModelProviders.of(this).get(SplashViewModel::class.java)
}
private fun checkIfUserIsAuthenticated() {
splashViewModel?.checkIfUserIsAuthenticated()
splashViewModel?.isUserauthenticatedLiveData?.observe(this,Observer{
fun onChanged(user: UserObject) {
if (!user.isAuthenticated) {
this@Splashactivity.goToLoginNewUseractivity()
finish()
} else {
// this@Splashactivity.goToLoginactivity(user.userID)
this@Splashactivity.goToLoginNewUseractivity() // just while testing go to same activity
}
}
})
}
private fun goToLoginNewUseractivity() {
val intent = Intent(this@Splashactivity,LoginNewUseractivity::class.java)
startactivity(intent)
}
private fun goToLoginactivity() { // Would go to Sites activity
val intent = Intent(this@Splashactivity,LoginNewUseractivity::class.java)
startactivity(intent)
}
哦,这是用户POJO:
class UserObject : Serializable {
var userID: String? = null
var username: String? = null
var userEmail: String? = null
var userMobile: String? = null
@Exclude
var isAuthenticated = false
@Exclude
var isnew = false
@Exclude
var isCreated = false
}
该应用程序仅停留在启动屏幕上,所以我认为在尝试转换为Kotlin时我错过了一些内容,但是看不到!!任何帮助,不胜感激!