android - 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 中保存回调/接口吗?请帮帮我。
解决方案
在mvvm
架构模式中你viewModel
不应该知道view
,这意味着你应该有任何接口可以与之通信view
。View
应该订阅/收听发生的任何变化viewModel
并对其做出反应。
根据您的问题,无法保存您的回调。他与碎片相连,将与他一起被摧毁。
推荐阅读
- r - 合并data.tables,同时保持R中的原始顺序
- vue.js - 在 vue.js 应用程序中,为什么 public 文件夹保留在 src 文件夹之外?
- r - 使用 R 将数据帧与部分匹配合并
- testing - 在简历中展示/链接使用测试管理工具制作的 QA 项目
- vue.js - 未捕获的类型错误:routes.forEach 不是函数
- python - 为什么python显示不能分配给字典中的文字?
- java - Java String 在此代码段中创建了多少个对象
- qt - 如何在 Ubuntu 1804 中同时安装 Qt4 和 Qt5
- javascript - 如何仅触发一个复选框检查操作
- python - 与枚举的多对多关系