getViewLifecycleOwner () в DialogFragment приводит к сбою - PullRequest
0 голосов
/ 19 февраля 2019

Я использую DialogFragment (onCreateDialog) и ViewModel для него.Но когда я пытаюсь использовать getViewLifecycleOwner () для передачи в методе наблюдать (), я получаю сообщение об ошибке, как показано ниже:

java.lang.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView().

Возможно ли использовать getViewLifecycleOwner () внутри DialogFragment?

Ответы [ 3 ]

0 голосов
/ 14 марта 2019

Существует вероятность этой ошибки, что вы возвращаете нулевой экземпляр LiveData из репозитория / ViewModel в первый раз.убедитесь, что вы инициировали LiveData в репозитории / ViewModel.

0 голосов
/ 19 июля 2019

Ваш случай немного отличается, но я думаю, что концепция примерно такая же.Просто используйте this.getActivity() в вашем диалоговом классе и передайте его как LifeCycleOwner.У меня была такая же проблема, потому что я использовал LiveData, а Retrofit и LiveData нужна ссылка.DialogFragment устанавливает его LifeCycleOwner в некоторый момент, но это не относится ни к одному из методов, упомянутых выше.Используя getActivity(), вы можете использовать своего наблюдателя уже в методе onCreateDialog.Вот некоторая часть моего кода, которая вначале вызвала некоторую проблему, когда я попытался передать нулевое значение this.getViewLifecycleOwner() вместо действия.

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
       FragmentActivity activity = this.getActivity();
       binding = DialogSelectIssuesBinding.inflate(LayoutInflater.from(getContext()));

       RetroRepository.
            getDefault().
            getAllIssues().
            observe(this.getActivity(), listLiveDataResponse -> {
                //ToDo Check for errors and Bind the data here 
            });


       AlertDialog alertDialog = new AlertDialog.Builder(activity)
                            .setView(binding.getRoot())
                            .setTitle("Please select issues from the list below:")
                            .setNegativeButton("CANCEL", null)
                            .setPositiveButton("ADD", null)
                            .create();
       alertDialog.setCanceledOnTouchOutside(false);
       return alertDialog;
}
0 голосов
/ 04 марта 2019

Возможно ли использовать getViewLifecycleOwner () внутри DialogFragment?

Да

Попытаться поместить свою логику в onActivityCreated(), так какна этот раз ваше представление не будет нулевым, что вызвало это исключение.

Также вы можете использовать getViewLifecycleOwnerLiveData() и, прикрепив к нему наблюдаемую, вы можете поместить свою логику в эту наблюдаемую, которая начнется, как только будет инициализирована lifeCycleOwner.

...