Android:getActivity()在从ViewModel调用它作为回调时为null



我用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可能会导致许多问题和挫折。

相关内容

  • 没有找到相关文章

最新更新