我用DataBinding设置了我的项目,所以点击了RecyclerView项,Fragment的ViewModel获得了数据,需要更改Fragment。因此,我创建了一个回调,该回调在Fragment本身中实现以更改它,但当它被调用时,getActivity((函数(或下面写的"activity?"(为null。
回调接口
interface FragmentCallBack {
fun fragmentCallBack(object: Object?)
}
碎片
class MainFragment : Fragment(), FragmentCallBack {
override fun fragmentCallBack(object: Object?) {
val fragment = NewFragment.newInstance()
// Here is the issue <------------------------
activity?.supportFragmentManager?.beginTransaction()?.replace(R.id.container, fragment)?.commit()
}
}
片段视图模型
class FragmentViewModel : ViewModel() {
val callback: FragmentCallBack = MainFragment()
private fun getData(string: String) {
val liveData = Repository.getData(string)
callback.fragmentCallBack(liveData.value)
}
}
您可以在ViewModel中手动构建MainFragment,而无需将其正确添加到任何容器中。在这种情况下,它与任何活动都没有关联,因此NPE是预期的结果。
这个代码有几个问题:
- 碎片应添加到容器中。最好的方法是使用一些片段管理库
- ViewModel不应该"知道";关于碎片的一切
- 从外部调用碎片上的方法(例如
fragmentCallback
(总是会产生问题 - [最佳实践]如果您有一个名为
getData
的方法,那么调用导致导航的回调可能不是最佳设计。这不是名字所暗示的,命名很重要
坦率地说,这段代码表明您对Fragments和ViewModels不是很有经验,所以我建议您仔细阅读文档。否则,使用这两个复杂的API可能会导致许多问题和挫折。