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

如何解决使用底部导航 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?