Android ViewModel参考片段

时间:2019-11-18 19:11:40

标签: android android-fragments kotlin android-lifecycle android-jetpack

我是一名初学者android开发人员,希望编写一个完全jetpack的应用程序。我想知道与ViewModel中的片段进行通信以说,显示对话框或导航至另一个片段的最佳方法。

我有这样的东西:

class Foo: ViewModel() {

    interface Callbacks {
        fun doSomethingWithUI()
        fun showBaz()
    }

    var callbacks: Callbacks? = null
}

然后在onCreate的片段中,它将自身设置为viewmodels回调对象。

查看文档,它指出ViewModel不应保留任何相关的视图或生命周期,或具有对活动的引用。考虑到这一点,ViewModel引用了具有活动的片段。

我想知道,这为什么不好。一切似乎都正常运行,如果只有一项活动可以开始,那么我们将泄漏什么呢?为什么Google明确表示不保留这些内容,但从未真正说出为什么不保留。

此外,由于我的工作还不正常,因此让ViewModel告诉片段说“显示此错误的对话框”的“正确”方法是什么

3 个答案:

答案 0 :(得分:0)

您可以将Livedata与观察者一起使用。例如,您可以使用
    Mutablelivedata<Boolean>并为其添加观察者。 您可以在片段中获得Viewmodel,并将观察者附加到Mutablelivedata<Boolean>,当Mutablelivedata<Boolean>更改为true时,该观察者将显示一个对话框。第一次将Observer附加到Livedata时,以及数据更改时,都会调用Observer。

答案 1 :(得分:0)

这是一个非常广泛的主题,您绝对应该检查google的体系结构示例,但总之这是个主意。假设您希望有一些通知渠道来报告各种错误。然后:

  1. 在您的视图模型下,您可以定义private val errorsLiveData: MutableLiveData<Exception> = MutableLiveData()
  2. 在您的片段下,您可以像这样订阅流:
        myViewModel.getErrorsLiveData().observe(viewLifecycleOwner, Observer {
            showError(it)
        })
  1. 视图模型如何报告错误:getErrorsLiveData().value = MyException(it)

答案 2 :(得分:0)

  

...我们到底要泄漏什么?

发生配置更改时,ViewModel将保持“活动”状态。另一方面,ActivityFragment将被销毁并重新创建。如果您的ViewModel坚持使用过时的Fragment实例,则可能导致您的应用无法按预期运行。

  

ViewModel告诉片段说“显示有此错误的对话框”的“正确”方法是什么

ViewModel有一个方法LiveData<String> getErrrorMessage()Fragment可以注册Observer并显示Dialog,并将消息传递到Observer的{​​{1}}