我是一名初学者android开发人员,希望编写一个完全jetpack的应用程序。我想知道与ViewModel中的片段进行通信以说,显示对话框或导航至另一个片段的最佳方法。
我有这样的东西:
class Foo: ViewModel() {
interface Callbacks {
fun doSomethingWithUI()
fun showBaz()
}
var callbacks: Callbacks? = null
}
然后在onCreate的片段中,它将自身设置为viewmodels回调对象。
查看文档,它指出ViewModel不应保留任何相关的视图或生命周期,或具有对活动的引用。考虑到这一点,ViewModel引用了具有活动的片段。
我想知道,这为什么不好。一切似乎都正常运行,如果只有一项活动可以开始,那么我们将泄漏什么呢?为什么Google明确表示不保留这些内容,但从未真正说出为什么不保留。
此外,由于我的工作还不正常,因此让ViewModel告诉片段说“显示此错误的对话框”的“正确”方法是什么
答案 0 :(得分:0)
您可以将Livedata与观察者一起使用。例如,您可以使用
Mutablelivedata<Boolean>
并为其添加观察者。
您可以在片段中获得Viewmodel,并将观察者附加到Mutablelivedata<Boolean>
,当Mutablelivedata<Boolean>
更改为true
时,该观察者将显示一个对话框。第一次将Observer附加到Livedata时,以及数据更改时,都会调用Observer。
答案 1 :(得分:0)
这是一个非常广泛的主题,您绝对应该检查google的体系结构示例,但总之这是个主意。假设您希望有一些通知渠道来报告各种错误。然后:
private val errorsLiveData: MutableLiveData<Exception> = MutableLiveData()
myViewModel.getErrorsLiveData().observe(viewLifecycleOwner, Observer {
showError(it)
})
getErrorsLiveData().value = MyException(it)
答案 2 :(得分:0)
...我们到底要泄漏什么?
发生配置更改时,ViewModel
将保持“活动”状态。另一方面,Activity
或Fragment
将被销毁并重新创建。如果您的ViewModel
坚持使用过时的Fragment
实例,则可能导致您的应用无法按预期运行。
ViewModel告诉片段说“显示有此错误的对话框”的“正确”方法是什么
让ViewModel
有一个方法LiveData<String> getErrrorMessage()
。 Fragment
可以注册Observer
并显示Dialog
,并将消息传递到Observer
的{{1}}