Where to put viewModel Observers in a dialogFragment?
Update: See Farid's link below, this answer is probably not recommended.
You can use ViewModels
in a DialogFragment
when you are overriding onCreateDialog
by doing this:
- When you inflate your custom view in
onCreateDialog
, store a reference to it as a variable in yourDialogFragment
. - Override
onCreateView
and simply return your saved custom view. - Set the view to null in
onDestroyView
exactly like this (otherwise Leak Canary reported memory leaks)
override fun onDestroyView() {
myView = null
super.onDestroyView()
}
Then, the dialog behaves more like a normal fragment and you can observe your ViewModel
in onCreateView
, onViewCreated
or onActivityCreated
as you please.
KvdLingen
Updated on June 25, 2022Comments
-
KvdLingen about 2 years
For fragments it is advised to put liveData observers in the onActivityCreated method. This works fine for fragments, but when I apply this to a dialogFragment I get the following error:
java.lang.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView().
From this question I read the lifecycle of the dialogFragment at creation is:
onAttach onCreate onCreateDialog onCreateView onActivityCreated onStart onResume
So putting the observers in onActivityCreated should be fine as it is after onCreateView or onCreateDialog. I use the latter as I use a Alertdialog with my own layout.
This is the code for my observer:
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(); .... }
This code pattern works fine in a fragment but not in a dialogFragment. There I have to set the lifecycleOwner to 'this'.
So why do I get the error?