Migration du navController

Migration du navController  couplage fort en evenemential donc coplage faible avec transfer d'evenement
This commit is contained in:
Chocolaterie
2025-01-31 14:00:10 +01:00
parent 70b7ea7ff8
commit 72987fdb9e
3 changed files with 38 additions and 22 deletions

View File

@@ -32,8 +32,25 @@ fun ArticleActivityPage() {
navController = navController, navController = navController,
startDestination = "list_article" startDestination = "list_article"
) { ) {
composable("list_article") { ListArticleFragmentPage(viewModel, detailViewModel, navController) } composable("list_article") {
composable("article_form") { ArticleFormFragmentPage(viewModel, navController) } ListArticleFragmentPage(viewModel, detailViewModel,
onClickAddArticle = {
navController.navigate("article_form")
},
onClickEditArticle = {
navController.navigate("article_form")
},
onClickShowArticle = {
navController.navigate("article_detail");
}
)
}
composable("article_form") {
ArticleFormFragmentPage(viewModel,
onAddArticleSuccess = {
navController.navigate("list_article")
})
}
composable("article_detail") { DetailArticleFragmentPage(detailViewModel) } composable("article_detail") { DetailArticleFragmentPage(detailViewModel) }
} }
} }

View File

@@ -29,7 +29,7 @@ import com.example.tpfilrouge.ui.theme.EniTextField
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@Composable @Composable
fun ArticleForm(viewModel: ListArticleViewModel, navController : NavController?=null){ fun ArticleForm(viewModel: ListArticleViewModel, onAddArticleSuccess : () -> Unit = {}){
var titleFieldState by remember { mutableStateOf("Un article") } var titleFieldState by remember { mutableStateOf("Un article") }
var descFieldState by remember { mutableStateOf("Une description") } var descFieldState by remember { mutableStateOf("Une description") }
@@ -43,15 +43,13 @@ fun ArticleForm(viewModel: ListArticleViewModel, navController : NavController?=
val newArticle = Article(titleFieldState, descFieldState, val newArticle = Article(titleFieldState, descFieldState,
"https://avatar.iran.liara.run/public"); "https://avatar.iran.liara.run/public");
// Envoyer l'article via une méthode view model // Envoyer l'article via une méthode view model
viewModel.addArticle(newArticle, onSuccess = { viewModel.addArticle(newArticle, onSuccess = onAddArticleSuccess)
navController!!.navigate("list_article")
})
} }
} }
} }
@Composable @Composable
fun ArticleEditForm(viewModel: ListArticleViewModel, navController : NavController?=null){ fun ArticleEditForm(viewModel: ListArticleViewModel){
var titleFieldState by remember { mutableStateOf(viewModel.editedArticle.title) } var titleFieldState by remember { mutableStateOf(viewModel.editedArticle.title) }
var descFieldState by remember { mutableStateOf(viewModel.editedArticle.desc) } var descFieldState by remember { mutableStateOf(viewModel.editedArticle.desc) }
@@ -71,27 +69,27 @@ fun ArticleEditForm(viewModel: ListArticleViewModel, navController : NavControll
} }
@Composable @Composable
fun AddArticleFormPage(viewModel: ListArticleViewModel, navController : NavController?=null){ fun AddArticleFormPage(viewModel: ListArticleViewModel, onAddArticleSuccess : () -> Unit = {}){
Text(text = "Ajouter un article", Text(text = "Ajouter un article",
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = TextStyle(color = Color.White, fontSize = 28.sp) style = TextStyle(color = Color.White, fontSize = 28.sp)
) )
ArticleForm(viewModel, navController) ArticleForm(viewModel, onAddArticleSuccess)
} }
@Composable @Composable
fun EditArticleFormPage(viewModel: ListArticleViewModel, navController : NavController?=null){ fun EditArticleFormPage(viewModel: ListArticleViewModel){
Text(text = "Modifier un article", Text(text = "Modifier un article",
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = TextStyle(color = Color.White, fontSize = 28.sp) style = TextStyle(color = Color.White, fontSize = 28.sp)
) )
ArticleEditForm(viewModel, navController) ArticleEditForm(viewModel)
} }
@Composable @Composable
fun ArticleFormFragmentPage(viewModel: ListArticleViewModel, navController : NavController?=null) { fun ArticleFormFragmentPage(viewModel: ListArticleViewModel, onAddArticleSuccess : () -> Unit = {}) {
// Savoir si je suis en mode edition ou ajout // Savoir si je suis en mode edition ou ajout
val isEdit by viewModel.isEdit.collectAsState(); val isEdit by viewModel.isEdit.collectAsState();
@@ -101,10 +99,10 @@ fun ArticleFormFragmentPage(viewModel: ListArticleViewModel, navController : Nav
modifier = Modifier.padding(40.dp) modifier = Modifier.padding(40.dp)
) { ) {
if (isEdit){ if (isEdit){
EditArticleFormPage(viewModel, navController) EditArticleFormPage(viewModel)
} }
else { else {
AddArticleFormPage(viewModel, navController) AddArticleFormPage(viewModel, onAddArticleSuccess)
} }
} }
} }

View File

@@ -46,7 +46,8 @@ import com.example.tpfilrouge.ui.theme.EniPage
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@Composable @Composable
fun ArticleCard(article: Article, viewModel: ListArticleViewModel, detailViewModel: DetailArticleViewModel, navController: NavController?=null){ fun ArticleCard(article: Article, viewModel: ListArticleViewModel, detailViewModel: DetailArticleViewModel,
onClickEditArticle : () -> Unit = {}, onClickShowArticle : () -> Unit = {}){
ElevatedCard( ElevatedCard(
elevation = CardDefaults.cardElevation(defaultElevation = 6.dp), elevation = CardDefaults.cardElevation(defaultElevation = 6.dp),
shape = RoundedCornerShape(0.dp), shape = RoundedCornerShape(0.dp),
@@ -69,9 +70,8 @@ fun ArticleCard(article: Article, viewModel: ListArticleViewModel, detailViewMod
Text(article.desc, style = TextStyle(color = Color.White)) Text(article.desc, style = TextStyle(color = Color.White))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) { Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
IconButton(onClick = { IconButton(onClick = {
detailViewModel.article.value = article; detailViewModel.article.value = article;
navController!!.navigate("article_detail"); onClickShowArticle();
}) { }) {
Icon(imageVector = Icons.Filled.Info, tint = Color.White, contentDescription = "Voir") Icon(imageVector = Icons.Filled.Info, tint = Color.White, contentDescription = "Voir")
@@ -84,7 +84,7 @@ fun ArticleCard(article: Article, viewModel: ListArticleViewModel, detailViewMod
// Dire au viewmodel quel Id d'article en cours de proccessus // Dire au viewmodel quel Id d'article en cours de proccessus
viewModel.editedArticleId = article.id; viewModel.editedArticleId = article.id;
// naviguer dans le formulaire // naviguer dans le formulaire
navController!!.navigate("article_form") onClickEditArticle();
}) { }) {
Icon(imageVector = Icons.Filled.Edit, tint = Color.White, contentDescription = "Edit") Icon(imageVector = Icons.Filled.Edit, tint = Color.White, contentDescription = "Edit")
} }
@@ -102,7 +102,9 @@ fun ArticleCard(article: Article, viewModel: ListArticleViewModel, detailViewMod
} }
@Composable @Composable
fun ListArticleFragmentPage(viewModel: ListArticleViewModel, detailViewModel: DetailArticleViewModel, navController: NavController? = null) { fun ListArticleFragmentPage(viewModel: ListArticleViewModel, detailViewModel: DetailArticleViewModel,
onClickAddArticle : () -> Unit = {}, onClickEditArticle : () -> Unit = {},
onClickShowArticle : () -> Unit = {}) {
// Ecouter les changements de la liste d'article dans le ViewModel // Ecouter les changements de la liste d'article dans le ViewModel
val articlesState by viewModel.articles.collectAsState(); val articlesState by viewModel.articles.collectAsState();
@@ -118,8 +120,7 @@ fun ListArticleFragmentPage(viewModel: ListArticleViewModel, detailViewModel: De
EniButton("Ajouter un Article") { EniButton("Ajouter un Article") {
// Passer le edit à false pour revenir en mode ajout dans le form // Passer le edit à false pour revenir en mode ajout dans le form
viewModel.isEdit.value = false; viewModel.isEdit.value = false;
onClickAddArticle();
navController!!.navigate("article_form")
} }
EniButton("Rafraichir") { EniButton("Rafraichir") {
// Appeler l'api du viewmodel // Appeler l'api du viewmodel
@@ -127,7 +128,7 @@ fun ListArticleFragmentPage(viewModel: ListArticleViewModel, detailViewModel: De
} }
LazyColumn { LazyColumn {
items(articlesState) { article -> items(articlesState) { article ->
ArticleCard(article, viewModel, detailViewModel, navController) ArticleCard(article, viewModel, detailViewModel, onClickEditArticle, onClickShowArticle)
} }
} }
} }