Conceptos y la implementación de Jetpack Compose
En esta página, se presentan varias recomendaciones y prácticas recomendadas para la arquitectura. Adopta estas funciones para mejorar la calidad, la solidez y la escalabilidad de tu app. También facilitan el mantenimiento y la prueba de tu app.
Capa de la IU
La función de la capa de la IU es mostrar los datos de la aplicación en la pantalla y servir como punto principal de interacción con el usuario. Estas son algunas prácticas recomendadas para la capa de la IU:
- Debes crear repositorios incluso si solo contienen una sola fuente de datos.
- En las apps pequeñas, puedes colocar tipos de capas de datos en un módulo o paquete
data.
Recomendación |
Descripción |
Sigue el Flujo unidireccional de datos. Muy recomendado |
Sigue los principios del flujo unidireccional de datos, en el que los ViewModels exponen el estado de la IU usando el patrón del observador y reciben acciones de la IU a través de llamadas de método. |
Usa AAC de ViewModels si sus beneficios se aplican a tu app. Muy recomendado |
Usa AAC ViewModels para controlar la lógica empresarial y recuperar datos de la aplicación a fin de exponer el estado de la IU a la IU. Consulta más prácticas recomendadas para ViewModel aquí. Consulta los beneficios de ViewModels aquí. |
Usa la recopilación de estado de la IU optimizada para ciclos de vida. Muy recomendado |
Recopila el estado de la IU con el compilador de corrutinas optimizado para ciclos de vida adecuado, Obtén más información sobre |
No envíes eventos del ViewModel a la IU. Muy recomendado |
Procesa el evento inmediatamente en ViewModel y genera una actualización de estado con el resultado del control del evento. Obtén más información sobre los eventos de IU aquí. |
Usa una aplicación de una sola actividad. Recomendado |
Usa Navigation Fragments para navegar entre pantallas y establecer vínculos directos a tu app si esta tiene más de una. |
En el siguiente fragmento, se describe cómo recopilar el estado de la IU de manera optimizada para los ciclos de vida:
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModel()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect {
// Process item
}
}
}
}
}
ViewModel
Los ViewModels son responsables de proporcionar el estado de la IU y el acceso a la capa de datos. Estas son algunas prácticas recomendadas para ViewModels:
Recomendación |
Descripción |
Los ViewModels deben ser independientes del ciclo de vida de Android. Muy recomendado |
Los ViewModels no deben contener referencias a ningún tipo relacionado con el ciclo de vida. No pases |
Usa corrutinas y flujos. Muy recomendado |
ViewModel interactúa con los datos o las capas de dominio mediante lo siguiente:
|
Usa ViewModels a nivel de la pantalla. Muy recomendado |
No uses ViewModels en piezas de IU reutilizables. Debes usar ViewModels en lo siguiente:
|
No uses Muy recomendado |
Usa la clase |
Expón un estado de IU. Recomendado |
Los ViewModels deben exponer datos a la IU a través de una única propiedad llamada
|
En el siguiente fragmento, se describe cómo exponer el estado de la IU desde un ViewModel:
@HiltViewModel
class BookmarksViewModel @Inject constructor(
newsRepository: NewsRepository
) : ViewModel() {
val feedState: StateFlow<NewsFeedUiState> =
newsRepository
.getNewsResourcesStream()
.mapToFeedState(savedNewsResourcesState)
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = NewsFeedUiState.Loading
)
// ...
}
Ciclo de vida
Las siguientes son algunas recomendaciones para trabajar con el ciclo de vida de Android:
Recomendación |
Descripción |
No anules los métodos de ciclo de vida de objetos Activity ni Fragment. Muy recomendado |
No anules métodos del ciclo de vida, como |
En el siguiente fragmento, se describe cómo realizar operaciones en función de un determinado estado de ciclo de vida:
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
// ...
}
override fun onPause(owner: LifecycleOwner) {
// ...
}
}
}
}