0

I am trying get users list from Firebase. I use repository and viewmodel. I am newcomer in the clean architecture and I think, that I made error , when have made viewModel method.

`class UserRepository {
private var usersList: ArrayList<User>? = ArrayList()
fun readUsers(): ArrayList<User> {
    var firebaseUser: FirebaseUser? = FirebaseAuth.getInstance().currentUser
    var databaseReference: DatabaseReference =
        FirebaseDatabase.getInstance().getReference("Users")

    databaseReference.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            usersList?.clear()
            for (data: DataSnapshot in dataSnapshot.children) {
                val user: User? = data.getValue(User::class.java)
                if (!user?.id.equals(firebaseUser?.uid)) {
                    usersList?.add(user!!)
                }
            }
        }

        override fun onCancelled(error: DatabaseError) {
            // Failed to read value
        }
    })

    return usersList!!
}

}`

when I am debugging I see that usrlist is not empty

class UserViewModel(application: Application) : AndroidViewModel(application){

    private var userRepository: UserRepository? = UserRepository()
    private var mutableLiveData: MutableLiveData<List<User>>? = MutableLiveData()

    init {
        mutableLiveData?.value=userRepository?.readUsers()
    }

    fun getAllUsers(): MutableLiveData<List<User>>? {
        return mutableLiveData
    }
}

and in fragment I call:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
    userViewModel?.getAllUsers()?.observe(viewLifecycleOwner,
        { t ->
            userAdapter = UserAdapter(requireContext(), t!!, false)
            recyclerView?.adapter = userAdapter
        })
}

I dont understand, why firstly calls init() from ViewModel.class then getAllUsers() from ViewModel.class then onActivityCreated(savedInstanceState: Bundle?) from fragment and then calls readUsers() from repository???

Monica
  • 384
  • 2
  • 4
  • 16
  • Y that if condition user.id equals f.uid – Gobu CSG Jul 06 '22 at 17:59
  • That mean getting current user data only!? – Gobu CSG Jul 06 '22 at 17:59
  • 1
    There is absolutely no way you can return the `usersList` as a result of a method. Firebase API is asynchronous. So please check the duplicate to see how can you solve this using a callback. You might also be interested in reading this [resource](https://medium.com/firebase-tips-tricks/how-to-read-data-from-firebase-realtime-database-using-get-269ef3e179c5). – Alex Mamo Jul 06 '22 at 18:43
  • you are absolutely right! thank you very much! I am stupid! – Monica Jul 07 '22 at 13:24

0 Answers0