首页 > 解决方案 > SaveStateHandle ViewModel:保存接口(回调)

问题描述

存储库:

fun interface AllUsersQueryCallback{
fun getAllUsers(allUsers: LiveData<ArrayList<User>>)
}

private const val TAG = "SearchRepository"

class SearchRepository @Inject constructor(
val auth: FirebaseAuth,
val db: FirebaseDatabase,
val storage: FirebaseStorage
) {


fun fetchAllUsers(userID: String, callback: AllUsersQueryCallback) {
    var allUser: MutableLiveData<ArrayList<User>>
    val users: ArrayList<User> = ArrayList()


    val reference = db.reference.child(USERS).orderByChild("username")
    reference.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            Log.d(TAG, "Query All Users: OnDataChange triggered")
            users.clear()
            for (singleUser in snapshot.children) {
                val user = singleUser.getValue(User::class.java)
                if (user!!.userID != userID) {
                    users.add(user)
                }

            }
            allUser = MutableLiveData(users)
            callback.getAllUsers(allUser)


        }

        override fun onCancelled(error: DatabaseError) {
            TODO("Not yet implemented")
        }

    })


}


}

我的视图模型:

class SearchViewModel @ViewModelInject constructor(private val repository: SearchRepository, 
@Assisted val savedStateHandle: SavedStateHandle): ViewModel() {

//getting a list of all the users
fun fetchAllUsers(userID: String, callback: AllUsersQueryCallback) {
    
    savedStateHandle.set("user",userID)

    repository.fetchAllUsers(savedStateHandle.get("user")!!,callback)
}
}

分段:

    searchViewModel.fetchAllUsers(auth.currentUser!!.uid) {
        Log.d(TAG, "All users search data changed. Callback initiated")
      
        if(getView()!=null){
           it.observe(viewLifecycleOwner) { allUsers ->                   

               adapter.submitAllUserList(allUsers.toList())
               

           }
        }
    }

视图模型调用查询 Firebase 数据库以获取所有用户的存储库。由于我无法返回用户的实时数据列表,因为数据库查询是异步的,所以我传递了一个回调,该回调会在查询完成后更新回收器视图列表。

一切正常。但是在进程死亡时,我不知道如何保存回调。我只能保存用户 ID 字符串。甚至可以在 SavedStateHandle 中保存回调/接口吗?请帮帮我。

标签: androidmvvmviewmodelandroid-viewmodelsavestate

解决方案


mvvm架构模式中你viewModel不应该知道view,这意味着你应该有任何接口可以与之通信viewView应该订阅/收听发生的任何变化viewModel并对其做出反应。

根据您的问题,无法保存您的回调。他与碎片相连,将与他一起被摧毁。


推荐阅读