使用底部导航 android kotlin 在片段中实现 MVVM 的最佳实践

2024-01-09

我正在使用 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'

存储库.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对于访问过的目的地,然后使用此版本Navigation dependency你可以保存backstacks自动,使用这些Navigation dependencies:

implementation 'androidx.navigation:navigation-fragment-ktx:2.4.0-alpha01'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.0-alpha01'

UPDATE

在您的存储库中,您能够取回数据吗?因为该函数可能会在从 firebase 获取数据之前返回。我建议像这样重构它:

存储库.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)
}

ViewModel.kt

private val repository: HomeRepository = HomeRepository()

fun getRequests(): LiveData<MutableList<EmergencyRequests>> {
    repository.getEmergencyRequests()
    
    return repository.data
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用底部导航 android kotlin 在片段中实现 MVVM 的最佳实践 的相关文章

随机推荐