将viewModel观察者放在dialogFragment中的位置?

Kvd*_*gen 15 android android-livedata

对于片段,建议将liveData观察者放在onActivityCreated方法中.这适用于片段,但当我将其应用于dialogFragment时,我收到以下错误:

java.lang.IllegalStateException:当getView()为null时,即在onCreateView()之前或onDestroyView()之后,无法访问Fragment View的LifecycleOwner.

从这个问题我在创建时读取了dialogFragment的生命周期:

onAttach
onCreate
onCreateDialog
onCreateView
onActivityCreated
onStart
onResume
Run Code Online (Sandbox Code Playgroud)

因此,将观察者放在onActivityCreated中应该没有问题,因为它在onCreateView或onCreateDialog之后.我使用后者,因为我使用自己的布局的Alertdialog.

这是我的观察者的代码:

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();
            ....
}
Run Code Online (Sandbox Code Playgroud)

此代码模式在片段中正常工作,但在dialogFragment中不起作用.我必须将lifecycleOwner设置为'this'.

那么为什么我会收到错误?

Car*_*mer 7

当您通过执行以下操作覆盖时,您可以ViewModels在 a中使用:DialogFragmentonCreateDialog

  1. 当您在 中扩充自定义视图时onCreateDialog,将对其的引用作为变量存储在DialogFragment.
  2. 覆盖onCreateView并简单地返回您保存的自定义视图。
  3. onDestroyView完全像这样将视图设置为 null (否则 Leak Canary 报告内存泄漏)
    override fun onDestroyView() {
        myView = null
        super.onDestroyView()
    }
Run Code Online (Sandbox Code Playgroud)

然后,对话框的行为更像一个普通的片段,您可以观察您的ViewModelin onCreateViewonViewCreated或者随意观察onActivityCreated

  • 传递“this”是正确的方法,如此处(https://developer.android.com/guide/fragments/dialogs#lifecycle)中突出显示的框中所述 (5认同)
  • 如果你在`onCreateView`中膨胀了一个布局,它会调用`onViewCreated`。如果您只在`onCreateDialog`中提供对话框,它将不会调用`onViewCreated`,因为`onCreateView`之前返回了`null`。 (4认同)
  • 一个小问题 - 我不相信 DialogFragment 会调用 onViewCreated() (3认同)