From 72987fdb9e64c579737713993da2999f03500587 Mon Sep 17 00:00:00 2001 From: Chocolaterie <110991127+Chocolaterie@users.noreply.github.com> Date: Fri, 31 Jan 2025 14:00:10 +0100 Subject: [PATCH] Migration du navController Migration du navController couplage fort en evenemential donc coplage faible avec transfer d'evenement --- .../tpfilrouge/article/ArticleActivity.kt | 21 ++++++++++++++++-- .../tpfilrouge/article/ArticleFormFragment.kt | 22 +++++++++---------- .../tpfilrouge/article/ListArticleFragment.kt | 17 +++++++------- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/example/tpfilrouge/article/ArticleActivity.kt b/app/src/main/java/com/example/tpfilrouge/article/ArticleActivity.kt index a72ee59..c3c79b2 100644 --- a/app/src/main/java/com/example/tpfilrouge/article/ArticleActivity.kt +++ b/app/src/main/java/com/example/tpfilrouge/article/ArticleActivity.kt @@ -32,8 +32,25 @@ fun ArticleActivityPage() { navController = navController, startDestination = "list_article" ) { - composable("list_article") { ListArticleFragmentPage(viewModel, detailViewModel, navController) } - composable("article_form") { ArticleFormFragmentPage(viewModel, navController) } + composable("list_article") { + 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) } } } diff --git a/app/src/main/java/com/example/tpfilrouge/article/ArticleFormFragment.kt b/app/src/main/java/com/example/tpfilrouge/article/ArticleFormFragment.kt index 25f42b7..5166a18 100644 --- a/app/src/main/java/com/example/tpfilrouge/article/ArticleFormFragment.kt +++ b/app/src/main/java/com/example/tpfilrouge/article/ArticleFormFragment.kt @@ -29,7 +29,7 @@ import com.example.tpfilrouge.ui.theme.EniTextField import kotlinx.coroutines.flow.MutableStateFlow @Composable -fun ArticleForm(viewModel: ListArticleViewModel, navController : NavController?=null){ +fun ArticleForm(viewModel: ListArticleViewModel, onAddArticleSuccess : () -> Unit = {}){ var titleFieldState by remember { mutableStateOf("Un article") } var descFieldState by remember { mutableStateOf("Une description") } @@ -43,15 +43,13 @@ fun ArticleForm(viewModel: ListArticleViewModel, navController : NavController?= val newArticle = Article(titleFieldState, descFieldState, "https://avatar.iran.liara.run/public"); // Envoyer l'article via une méthode view model - viewModel.addArticle(newArticle, onSuccess = { - navController!!.navigate("list_article") - }) + viewModel.addArticle(newArticle, onSuccess = onAddArticleSuccess) } } } @Composable -fun ArticleEditForm(viewModel: ListArticleViewModel, navController : NavController?=null){ +fun ArticleEditForm(viewModel: ListArticleViewModel){ var titleFieldState by remember { mutableStateOf(viewModel.editedArticle.title) } var descFieldState by remember { mutableStateOf(viewModel.editedArticle.desc) } @@ -71,27 +69,27 @@ fun ArticleEditForm(viewModel: ListArticleViewModel, navController : NavControll } @Composable -fun AddArticleFormPage(viewModel: ListArticleViewModel, navController : NavController?=null){ +fun AddArticleFormPage(viewModel: ListArticleViewModel, onAddArticleSuccess : () -> Unit = {}){ Text(text = "Ajouter un article", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = TextStyle(color = Color.White, fontSize = 28.sp) ) - ArticleForm(viewModel, navController) + ArticleForm(viewModel, onAddArticleSuccess) } @Composable -fun EditArticleFormPage(viewModel: ListArticleViewModel, navController : NavController?=null){ +fun EditArticleFormPage(viewModel: ListArticleViewModel){ Text(text = "Modifier un article", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = TextStyle(color = Color.White, fontSize = 28.sp) ) - ArticleEditForm(viewModel, navController) + ArticleEditForm(viewModel) } @Composable -fun ArticleFormFragmentPage(viewModel: ListArticleViewModel, navController : NavController?=null) { +fun ArticleFormFragmentPage(viewModel: ListArticleViewModel, onAddArticleSuccess : () -> Unit = {}) { // Savoir si je suis en mode edition ou ajout val isEdit by viewModel.isEdit.collectAsState(); @@ -101,10 +99,10 @@ fun ArticleFormFragmentPage(viewModel: ListArticleViewModel, navController : Nav modifier = Modifier.padding(40.dp) ) { if (isEdit){ - EditArticleFormPage(viewModel, navController) + EditArticleFormPage(viewModel) } else { - AddArticleFormPage(viewModel, navController) + AddArticleFormPage(viewModel, onAddArticleSuccess) } } } diff --git a/app/src/main/java/com/example/tpfilrouge/article/ListArticleFragment.kt b/app/src/main/java/com/example/tpfilrouge/article/ListArticleFragment.kt index 6b2df8f..3b6fff6 100644 --- a/app/src/main/java/com/example/tpfilrouge/article/ListArticleFragment.kt +++ b/app/src/main/java/com/example/tpfilrouge/article/ListArticleFragment.kt @@ -46,7 +46,8 @@ import com.example.tpfilrouge.ui.theme.EniPage import kotlinx.coroutines.flow.MutableStateFlow @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( elevation = CardDefaults.cardElevation(defaultElevation = 6.dp), shape = RoundedCornerShape(0.dp), @@ -69,9 +70,8 @@ fun ArticleCard(article: Article, viewModel: ListArticleViewModel, detailViewMod Text(article.desc, style = TextStyle(color = Color.White)) Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) { IconButton(onClick = { - detailViewModel.article.value = article; - navController!!.navigate("article_detail"); + onClickShowArticle(); }) { 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 viewModel.editedArticleId = article.id; // naviguer dans le formulaire - navController!!.navigate("article_form") + onClickEditArticle(); }) { Icon(imageVector = Icons.Filled.Edit, tint = Color.White, contentDescription = "Edit") } @@ -102,7 +102,9 @@ fun ArticleCard(article: Article, viewModel: ListArticleViewModel, detailViewMod } @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 val articlesState by viewModel.articles.collectAsState(); @@ -118,8 +120,7 @@ fun ListArticleFragmentPage(viewModel: ListArticleViewModel, detailViewModel: De EniButton("Ajouter un Article") { // Passer le edit à false pour revenir en mode ajout dans le form viewModel.isEdit.value = false; - - navController!!.navigate("article_form") + onClickAddArticle(); } EniButton("Rafraichir") { // Appeler l'api du viewmodel @@ -127,7 +128,7 @@ fun ListArticleFragmentPage(viewModel: ListArticleViewModel, detailViewModel: De } LazyColumn { items(articlesState) { article -> - ArticleCard(article, viewModel, detailViewModel, navController) + ArticleCard(article, viewModel, detailViewModel, onClickEditArticle, onClickShowArticle) } } }