: No se puede acceder al LifecycleOwner de Fragment View cuando getView () es nulo, es decir, antes de onCreateView () o después de onDestroyView ()

8

Estoy usando datos en vivo en mi aplicación para todas las llamadas de red y manejo de respuestas.

En uno de los escenarios, mi vista de reciclador está cargando algunos datos en su titular de vista onBindy la respuesta está actualizando la interfaz de usuario. Para hacerlo, tengo que proporcionar un lifecycleOwneral observador.

Como la vista de reciclador no tiene ningún propietario de ciclo de vida propio, estoy usando el fragmento padre para eso usando parentFragment.viewlifecycleOwnerpero de alguna manera está dando un error.

¿Cómo puede un titular de vista tener su instancia cuando el fragmento padre no tiene su instancia?

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

Excepción grave: java.lang.IllegalStateException: no se puede acceder al LifecycleOwner de Fragment View cuando getView () es nulo, es decir, antes de onCreateView () o después de onDestroyView ()

Utkarsh Singh
fuente
1
El problema era que mi ViewHolder estaba obteniendo algunos datos del servidor y después de recibir la respuesta se crearon los datos reales para el titular, que nuevamente tenía algunos observadores que se adjuntaron utilizando el propietario del ciclo de vida del fragmento principal. Pero si me alejé del fragmento mientras mi lector visualizaba los datos, la vista del fragmento padre se destruyó, y cuando el lector obtuvo la respuesta e intentó conectar al observador con el propietario del ciclo de vida del fragmento padre, arroja el error mencionado anteriormente como no quedaba ninguna vista con el fragmento padre.
Utkarsh Singh

Respuestas:

0

La solución para mí fue simplificada. Estoy utilizando observadores separados, uno para la red que está utilizando Lifecycleowner de la actividad principal (o simplemente de cualquier actividad) y otro para la vista de fragmentos (vista de modelo, vista, modelo).

Trajce Arsovski
fuente
0

En la documentación de getViewLifecycleOwner ( ), no creo que pueda explicarlo mejor:

El primer método en el que es seguro acceder al ciclo de vida de la vista es onCreateView (LayoutInflater, ViewGroup, Bundle) con la condición de que debe devolver una vista no nula (se lanzará una IllegalStateException si accede al ciclo de vida de la vista pero no regresa) una vista no nula).

El ciclo de vida de la vista sigue siendo válido mediante la llamada a onDestroyView (), después de lo cual getView () devolverá nulo, el ciclo de vida de la vista se destruirá y este método arrojará una IllegalStateException. Considere usar getViewLifecycleOwnerLiveData () o FragmentTransaction.runOnCommit (Runnable) para recibir una devolución de llamada para cuando el ciclo de vida de la vista del Fragmento esté disponible.

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
fuente
-1

La solución, como su comentario, es garantizar que la vista del fragmento no sea nula. Esto me sucedió con un Fragmento dentro de un ViewPager.

Emmanuel Guerra
fuente