No se puede establecer el controlador de navegación al probar un Fragmento con Compose.
Estoy tratando de probar un fragmento que utiliza Compose.
Estoy teniendo problemas para configurar mi controlador de navegación para la prueba.
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
navController = findNavController()
return ComposeView(requireContext()).apply {
setContent {
SampleScreen(
onNavigationClick = {
navController.popBackStack()
}
)
}
}
}
@Test
fun testFragment() {
val navController = TestNavHostController(
ApplicationProvider.getApplicationContext()
)
val scenario = launchFragmentInContainer{
TestFragment().also { fragment ->
fragment.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner ->
if (viewLifecycleOwner != null) {
navController.setGraph(R.navigation.nav_graph)
Navigation.setViewNavController(
fragment.requireView(),
navController
)
}
}
}
}
}
El problema es que necesito mi controlador de navegación
en onCreateView
para pasarlo a los componibles. Sin embargo, para las pruebas parece que solo se puede establecer un controlador de navegación
como muy pronto en onViewCreated
porque Navigation.setViewNavController()
requiere una vista para funcionar.
Entonces creo que necesito de alguna manera tener findNavController()
en onViewCreated()
. Pero también lo necesito en onCreateView()
para pasarlo a mis componibles.
¿Estoy estructurando el fragmento incorrectamente aquí? ¿Cómo puedo probar este fragmento y configurar el controlador de navegación?
EDITAR: Intentando mover setContent
a onViewCreated
. Esto hace que la pantalla esté en blanco.
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
): View? {
navController = findNavController()
ComposeView(requireContext()).apply {
setContent {
SampleScreen(
onNavigationClick = {
navController.popBackStack()
}
)
}
}
}
davy.ai
Parece que estás en el camino correcto en términos de mover la llamada
setContent
aonViewCreated
para establecer el controlador de navegación. Sin embargo, la razón por la que la pantalla está en blanco es porque debes devolver la vista compuesta desdeonViewCreated
, en lugar de simplemente crearla.Aquí tienes una versión actualizada de
onViewCreated
que debería funcionar:Esto configurará el controlador de navegación y creará la vista compuesta, la cual luego se devuelve y se muestra en el fragmento.
En cuanto a pasar el controlador de navegación a los componentes compuestos, puedes pasarlos como parámetro a la función compuesta, o utilizar modelos de vista para compartir datos entre el fragmento y los componentes compuestos.
¡Espero que esto te ayude!