Middle
Comment peut-on implémenter différents états dans une application Android en utilisant des classes scellées?
sobes.tech IA
Réponse de l'IA
Les classes scellées sont idéales pour modéliser un ensemble fini d'états. Chaque état secondaire peut contenir ses propres données uniques.
Exemple:
sealed class UiState {
object Loading : UiState() // État de chargement sans données
data class Success(val data: List<Item>) : UiState() // État réussi avec données reçues
data class Error(val message: String) : UiState() // État d'erreur avec message
object Idle : UiState() // État initial ou neutre
}
Application:
- Dans
ViewModel, on peut mettre à jourMutableStateFlow(ou un autre type observable) avec leUiStateactuel. - Dans
FragmentouActivity, s'abonner aux changements deUiStateet utiliserwhenpour gérer chaque état possible, en mettant à jour l'UI en conséquence.
// Dans ViewModel
class MyViewModel : ViewModel() {
private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
fun loadData() {
viewModelScope.launch {
_uiState.value = UiState.Loading
try {
val result = fetchData() // Votre fonction pour obtenir des données
_uiState.value = UiState.Success(result)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Erreur inconnue")
}
}
}
}
// Dans Fragment/Activity (en utilisant Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Afficher l'écran initial */ }
UiState.Loading -> { /* Afficher l'indicateur de chargement */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Afficher les données
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Afficher le message d'erreur
}
}
}
Avantages:
- Vérification exhaustive: Le compilateur exige de gérer toutes les sous-classes de la classe scellée dans l'expression
when. Cela empêche les omissions et augmente la fiabilité du code. - Modélisation claire des états: Définit explicitement tous les états possibles du composant UI.
- Sécurité de type: Chaque état a ses propres données, accessibles en toute sécurité sans besoin de cast.
- Meilleure lisibilité: Le code utilisant des classes scellées pour les états est plus compréhensible et facile à maintenir.
Cette approche est particulièrement utile avec Flow et Compose, mais fonctionne également bien avec LiveData et View Binding.