es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()
                }
            )
        }
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás en el camino correcto en términos de mover la llamada setContent a onViewCreated 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 desde onViewCreated, en lugar de simplemente crearla.

    Aquí tienes una versión actualizada de onViewCreated que debería funcionar:

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?
    ): View {
        navController = findNavController()
        return ComposeView(requireContext()).apply {
            setContent {
                SampleScreen(
                    onNavigationClick = {
                        navController.popBackStack()
                    }
                )
            }
        }
    }
    

    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!

Comments are closed.