우선 addSnapshot은 한번 붙여주면 계속 실행이 되고 있기때문에 그 리스너가 붙어있는 activity가 꺼지더라도 지속적으로 켜져있는 이상한 친구다.. vm을 어떻게 만들지 계속 고민하다가 이렇게 만들었음.
구현하고 싶은 것
1) activity에 viewModel을 생성해서 지속적으로 사용자의 정보를 업데이트 해주는 방식을 구현하고 싶음. 만약에 사용자가 닉네임을 바꾸게 되면 그것을 라이브데이터로 받아서 바꿔주는 방식으로 구현
2) activity가 꺼지게 되면 viewModel에 있는 Listener로 같이 꺼지도록 만들기
1.viewModel
@HiltViewModel
class UserViewModel @Inject constructor() : ViewModel() {
private val TAG = "USER VIEWMODEL"
private var fireStore: FirebaseFirestore = FirebaseFirestore.getInstance()
private lateinit var listnerBasic : ListenerRegistration
private lateinit var listnerPrivate : ListenerRegistration
var userBasicData = MutableLiveData<BasicUser>()
fun setUserBasicData (value : BasicUser){
userBasicData.value = value
}
init {
listenToUserData()
}
private fun listenToUserData() {
listnerBasic = fireStore.collection("user_basic")
.document(uid).addSnapshotListener { snapshot, error ->
if (error != null) {
Log.w(TAG, "User ViewModel is not listen to User Basic", error)
return@addSnapshotListener
}
if (snapshot != null) {
val userBasicDataSnap = snapshot.toBasicUser() ?: LoginObject.userData
setUserBasicData(userBasicDataSnap)
}
}
}
override fun onCleared() {
listnerBasic.remove()
super.onCleared()
}
}
2.data class
data class User(
var fid :String = "",
var nickname : String ="",
var gender : Int = 0,
var birthday : String = ""
){
companion object{
fun DocumentSnapshot.toUser(): User?{
try{
val fid = getString("fid") ?: ""
val nickname = getString("nickname") ?: ""
val gender = getLong("gender")?.toInt() ?: 0
val birthday = getString("birthday") ?: ""
return User(
fid = fid ,
nickname = nickname ,
gender = gender ,
birthday = birthday ,
)
}catch (e:Exception){
Log.e(TAG," Error converting User",e)
return null
}
}
private const val TAG = "User"
}
}
끝
'어플 개발일기' 카테고리의 다른 글
android wating for debugger 계속 뜨는 문제 (0) | 2021.06.14 |
---|---|
data binding 에서 setonclicklistener 안먹혀서 고생함 (0) | 2021.06.14 |
listadapter position 변경되는 현상?. (0) | 2021.06.08 |
dialog에서 반응 받아오기 시행착오 (0) | 2021.06.08 |
flow는 왜 코루틴 스코프를 직접 안써도 되나?(android) (0) | 2021.05.21 |