如何解决使用底部导航 android kotlin 在片段中实现 MVVM 的最佳实践
我正在使用带有 firebase 的底部导航在片段中实现 MVVM。但这在我的情况下不起作用。我搜索了很多解决方案,但没有解决我的问题。
我在片段中实现了 viewmodel 并将观察者应用于它。在 viewmodel 类中,从存储库调用返回类型为 LiveData 的方法(从 firebase 获取数据)。
我正在使用这些依赖项
依赖
// Fragment Navigation using JetPack
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
Repository.kt
// Get emergency requests
fun getEmergencyRequests(): LiveData<MutableList<EmergencyRequests>> {
val mutableData = mutablelivedata<MutableList<EmergencyRequests>>()
val requestListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
if (dataSnapshot.exists() && dataSnapshot.hasChildren()) {
// Get Post object and use the values to update the UI
val listData = mutablelistof<EmergencyRequests>()
for (snapshot in dataSnapshot.children) {
val model = snapshot.getValue(EmergencyRequests::class.java)
model?.let {
model.requestId = snapshot.ref.key.toString()
listData.add(it)
}
}
listData.sortByDescending { it.timestamp }
mutableData.value = listData
}
}
override fun onCancelled(error: DatabaseError) {
Log.e("EMERGENCIES_FAIL",error.message)
}
}
emergencyRequestRef?.addValueEventListener(requestListener)
return mutableData
}
viewmodel.kt
private val repository: HomeRepository = HomeRepository()
fun getRequests(): LiveData<MutableList<EmergencyRequests>> {
repository.getEmergencyRequests()
val mutableData = mutablelivedata<MutableList<EmergencyRequests>>()
repository.getEmergencyRequests().observeForever {
mutableData.value = it
}
return mutableData
}
片段.kt
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
// Initialize
initialization()
// Recyclerview
binding.recyclerView.layoutManager = linearlayoutmanager(mContext)
adapter = EmergenciesAdapter(mContext,object : OnRequestClick {
override fun onClick(model: EmergencyRequests) {
}
})
binding.recyclerView.adapter = adapter
// Get emergencies
// getEmergencies()
viewmodel = viewmodelProvider(mContext).get(Homeviewmodel::class.java)
observer()
}
private fun observer() {
viewmodel.getRequests().observe(viewLifecycleOwner,{
adapter.setDataList(it)
adapter.notifyDataSetChanged()
})
}
解决方法
不确定这是否会为您解决问题,但如果您使用 bottom navigation view
并希望 fragments
为访问的目的地维护 backstack
,那么使用此版本的 {{ 1}} 您可以自动保存 Navigation dependency
,使用这些 backstacks
:
Navigation dependencies
更新
在您的存储库中,您能取回数据吗?因为该函数可能会在从 firebase 获取数据之前返回。我建议像这样重构它:
Repository.kt
implementation 'androidx.navigation:navigation-fragment-ktx:2.4.0-alpha01'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.0-alpha01'
ViewModel.kt
private val _data: MutableLiveData<MutableList<EmergencyRequests>> = MutableLiveData()
val data: LiveData<MutableList<EmergencyRequests>> get() = _data
// Get emergency requests
fun getEmergencyRequests() {
val requestListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
if (dataSnapshot.exists() && dataSnapshot.hasChildren()) {
// Get Post object and use the values to update the UI
val listData = mutableListOf<EmergencyRequests>()
for (snapshot in dataSnapshot.children) {
val model = snapshot.getValue(EmergencyRequests::class.java)
model?.let {
model.requestId = snapshot.ref.key.toString()
listData.add(it)
}
}
listData.sortByDescending { it.timestamp }
_data.value = listData
}
}
override fun onCancelled(error: DatabaseError) {
Log.e("EMERGENCIES_FAIL",error.message)
}
}
emergencyRequestRef?.addValueEventListener(requestListener)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。