Utkarsh Singh
Estoy usando datos en vivo en mi aplicación para todas las llamadas de red y el manejo de respuestas.
En uno de los escenarios, mi vista de reciclador está cargando algunos datos en el titular de la vista onBind
y la respuesta está actualizando la interfaz de usuario. Para hacerlo, tengo que proporcionar un lifecycleOwner
al observador.
Como la vista del reciclador no tiene ningún propietario de ciclo de vida propio, estoy usando el fragmento principal para eso usando parentFragment.viewlifecycleOwner
pero de alguna manera está dando un error.
¿Cómo puede un titular de vista tener su instancia cuando el fragmento principal no tiene su instancia?
viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
updateUI(it)
})
Excepción fatal: 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()
pandey_shubham
Esto se puede arreglar activando la lógica que genera el error, alrededor del final de onCreateView(...)
devolución de llamada (no onCreate(...)
ni onAttach(...)
).
En getViewLifecycleOwner() documentación, no creo, puedo explicar 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 generará una IllegalStateException si accede al ciclo de vida de la vista pero no devuelve una vista no nula).
El ciclo de vida de la vista sigue siendo válido a través de la llamada a onDestroyView(), después de lo cual getView() devolverá un valor nulo, el ciclo de vida de la vista se destruirá y este método generará una IllegalStateException. Considere usar getViewLifecycleOwnerLiveData() o FragmentTransaction.runOnCommit(Runnable) para recibir una devolución de llamada 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;
}
enfrenté el mismo problema y pude solucionarlo con el siguiente código, solo verifique si la vista es nula o no
if ( view != null)
viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
updateUI(it) })
La solución para mí fue escribir código dentro de onViewCreated en lugar de escribir en onCreateView…. y mi problema se solucionó.
-
Lo estoy usando en mi método onViewCreated y sigo dando error en algunos dispositivos.
-Rohit Jakhar
15 de marzo de 2022 a las 4:35
-
Esto funcionó para mí cuando intentaba agregar una devolución de llamada en un onBackPressedDispatcher
–Leonardo de Oliveira Sibela
13 de marzo a las 15:33
acarrell
El problema es que el observador todavía está activo en el padre. viewLifecycleOwner
incluso después de que se destruya la vista (cuando navega al siguiente fragmento). La forma más confiable de solucionar esto es eliminar a los observadores.
override fun onDestroyView()
viewModel.responseState.removeObservers(parentFragment.viewLifecycleOwner)
super.onDestroyView()
}
La solución para mí fue simplificada. Estoy usando observadores separados: uno para la red que usa Lifecycleowner de la actividad principal (o simplemente de cualquier actividad) y otro para la vista de fragmentos (modelo de vista de vista de modelo).
Sourav Rawat BCA
myModel.getOfflineData().observeForever(new Observer<List<indiaStateModel>>() {
@Override
public void onChanged(List<indiaStateModel> indiaStateModels) {
adapter = new stateAdapter(indiaStateModels);
recyclerView.setAdapter(adapter);
}
});
// use este observador para siempre cuando reciba ese error // principalmente este error ocurre cuando intenta cambiar el tema de su teléfono de oscuro a claro o de claro a oscuro
Anuj Kumar Rai
Mejor para usar Fluir() en lugar de Datos en tiempo real()
Convertir LiveData() a Flow()
Antes
viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
updateUI(it)
})
DESPUÉS
lifecycleScope.launch {
viewModel.responseState.asFlow().collectLatest{
updateUI(it)
l̥
}
}
-
Si tiene una nueva pregunta, hágala haciendo clic en el botón Preguntar. Incluya un enlace a esta pregunta si ayuda a proporcionar contexto. – De la revisión
– Rishabh Deep Singh
14 de septiembre de 2021 a las 8:34
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 visualizador buscaba los datos, la vista del fragmento principal se destruía, y cuando el visualizador recibió la respuesta e intentó adjuntar el observador con el propietario del ciclo de vida del fragmento principal, arroja el error mencionado anteriormente como no quedaba ninguna vista con el fragmento principal.
–Utkarsh Singh
21 de noviembre de 2019 a las 11:05