Je vous illustre ici comment déterminer quel est le plus petit ancêtre commun des composables qui ont besoin du ViewModel.
class MainActivity : ComponentActivity() {
// instanciation du ViewModel
// *** 1 : Le ViewModel n'est pas utilisé ici, il est seulement instancié
// puis passé en paramètre à un composable.
// Sommes-nous dans le plus petit ancêtre commun?
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
TestPlusPetitAncetreCommunTheme {
MainScreen(_viewModel)
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainScreen(viewModel: HomeViewModel) {
// *** 2 : Le ViewModel n'est pas utilisé ici, il est seulement reçu en paramètre
// puis repassé à un composable.
// Sommes-nous dans le plus petit ancêtre commun?
Scaffold(
modifier = Modifier
.fillMaxSize(),
topBar = {
CenterAlignedTopAppBar(
title = {
Text(text = "Test plus petit ancêtre commun")
},
)
}
) { innerPadding ->
MainContent(innerPadding, viewModel)
}
}
@Composable
fun MainContent(innerPadding: PaddingValues, viewModel: HomeViewModel) {
// *** 3 : Le ViewModel est utilisé ici pour initialiser le uiState
// afin de passer le uiState en paramètre.
// Ceci est le plus petit ancêtre commun des composables qui ont besoin du ViewModel (ou du UiState).
// Le ViewModel aurait dû être instancié ici.
// création d'un observateur de l'état
val uiState by viewModel.uiState.collectAsState()
Column(
modifier = Modifier
.padding(innerPadding)
.fillMaxWidth().fillMaxHeight(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top,
) {
MonBouton(viewModel, uiState)
MaListe(uiState)
}
}
@Composable
fun MonBouton(viewModel: HomeViewModel, uiState: HomeUiState) {
Button(
onClick = {
viewModel.ajouterHeure()
},
enabled = !uiState.partieTerminee
) {
Text(text = "Enregistrer")
}
}
@Composable
fun MaListe(uiState: HomeUiState) {
val dateTimeFormatter = DateTimeFormatter.ofPattern("H:mm:ss.SSS")
Column(
modifier = Modifier
.padding(all = 25.dp)
.verticalScroll(rememberScrollState())
) {
uiState.heures.forEach { heure ->
Text(heure.format(dateTimeFormatter))
}
}
if (uiState.partieTerminee) {
Text("Bravo!")
}
}
▼Publicité