热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Kotlin和MVVM的Firebase授权

使用Kotlin使用MVVP架构设置应用程序时,我感到非常困惑。具体来说,我正

使用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时我错过了一些内容,但是看不到!!任何帮助,不胜感激!





推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
郑云雪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有