当前位置: 首页 > 知识库问答 >
问题:

在DialogFragment中将viewModel观察者放在哪里?

秦天宇
2023-03-14

对于片段,建议将liveData观察器放在onActivityCreated方法中。这对片断很有效,但是当我将它应用于dialogFragment时,我会得到以下错误:

IllegalStateException:当getView()为空时,即在onCreateView()之前或onDestroyView()之后,无法访问Fragment视图的LifecycleOwner。

从这个问题中,我了解到dialogFragment在创建时的生命周期是:

onAttach
onCreate
onCreateDialog
onCreateView
onActivityCreated
onStart
onResume
mScheduleViewModel.getTeachers().observe(getViewLifecycleOwner(), new Observer<List<String>>() {
        @Override
        public void onChanged(@Nullable List<String> strings) {
            mStringList = strings;
            aclInputvalue.setThreshold(2);
            aclAdapter.setList(strings);
            aclAdapter.notifyDataSetChanged();
            ....
}

那么为什么我会得到错误呢?

共有1个答案

景才英
2023-03-14

在重写oncreateDialog时,可以在DialogFragment中使用viewmodels,方法如下:

  1. oncreateDialog中膨胀自定义视图时,将对它的引用作为变量存储在DialogFragment中。
  2. 重写OnCreateView返回保存的自定义视图。
  3. OnDestroyView中将视图设置为null(否则泄漏金丝雀报告的内存泄漏)
    override fun onDestroyView() {
        myView = null
        super.onDestroyView()
    }

然后,对话框的行为更像是一个普通的片段,您可以在oncreateviewonviewcreatedonactivitycreated中观察viewmodel

 类似资料:
  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 我正在学习RxJS,对于“听众”在哪里(在可观察的或观察者中),他们是如何订阅/取消订阅的,以及当观察者“不再对”可观察的“不感兴趣”时会发生什么,比如当你使用或。 对于第一部分——什么是订阅什么,什么是倾听者——我对这些陈述之间看似矛盾的地方感到困惑。从http://reactivex.io/rxjs/manual/overview.html我们读到观察者不是观察者的“听众” 这与addEven

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 对于LiveData和MVVM架构,我完全是个新手。我想知道如何观察一个实时数据 我通过以下方式从我的房间数据库中获取实时数据: 我希望ViewModel中的另一个变量,,在列表返回空(null)时进行更新。这将用于从Visible更新片段中的ImageView。去看电视了。看得见的 我如何检查如果是空的同步? 我四处阅读,看到一些人说使用,但是架构指南明确建议不要使用ViewModel中的任何观

  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首