: Não é possível acessar o LifecycleOwner do Fragment View quando getView () é nulo, ou seja, antes de onCreateView () ou depois de onDestroyView ()

8

Estou usando dados ativos no meu aplicativo para todas as chamadas de rede e manipulação de respostas.

Em um dos cenários, minha visão do reciclador está carregando alguns dados no seu suporte onBinde a resposta está atualizando a interface do usuário. Para fazer isso, eu tenho que fornecer um lifecycleOwnerpara o observador.

Como a exibição do reciclador não possui proprietário de ciclo de vida próprio, estou usando o fragmento pai para isso, parentFragment.viewlifecycleOwnermas, de alguma forma, está dando um erro.

Como um detentor de exibição pode ter sua instância quando o fragmento pai não está tendo sua instância?

viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
    updateUI(it)
})

Exceção fatal: java.lang.IllegalStateException: Não é possível acessar o LifecycleOwner do Fragment View quando getView () é nulo, ou seja, antes de onCreateView () ou depois de onDestroyView ()

Utkarsh Singh
fonte
1
O problema era que meu ViewHolder estava buscando alguns dados do servidor e, depois que a resposta foi recebida, foram criados os dados reais do titular, que novamente teve alguns observadores anexados usando o proprietário do ciclo de vida do fragmento pai. Mas se eu navegasse para longe do fragmento enquanto meu espectador buscava os dados, a visualização do fragmento pai foi destruída e, quando o espectador obteve a resposta e tentou anexar o observador ao proprietário do ciclo de vida do fragmento pai, ele emitiu o erro mencionado acima como não havia mais vista com o fragmento pai.
Utkarsh Singh

Respostas:

0

A solução para mim foi simplificada. Estou usando observadores separados - um para a rede que está usando o Lifecycleowner da atividade principal (ou apenas de qualquer atividade) e outro para a exibição de fragmentos (modelo de exibição de modelo).

Trajce Arsovski
fonte
0

Na documentação de getViewLifecycleOwner ( ), acho que não posso explicar melhor:

O primeiro método no qual é seguro acessar o ciclo de vida da visualização é onCreateView (LayoutInflater, ViewGroup, Bundle) sob a condição de que você deva retornar uma visualização não nula (uma IllegalStateException será lançada se você acessar o ciclo de vida da visualização, mas não retornar uma visualização não nula).

O ciclo de vida da visualização permanece válido por meio da chamada para onDestroyView (), após o qual getView () retornará nulo, o ciclo de vida da visualização será destruído e esse método lançará uma IllegalStateException. Considere usar getViewLifecycleOwnerLiveData () ou FragmentTransaction.runOnCommit (Runnable) para receber um retorno de chamada para quando o ciclo de vida da exibição do Fragmento estiver disponível.

public LifecycleOwner getViewLifecycleOwner() {
    if (mViewLifecycleOwner == null) {
        throw new IllegalStateException("Can't access the Fragment View's LifecycleOwner when "
                + "getView() is null i.e., before onCreateView() or after onDestroyView()");
    }
    return mViewLifecycleOwner;
}
pandey_shubham
fonte
-1

A solução, como seu comentário, é garantir que a exibição do fragmento não seja nula. Isso aconteceu comigo com um fragmento dentro de um ViewPager.

Emmanuel Guerra
fonte