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,
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) }
}
}

View File

@@ -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)
}
}
}

View File

@@ -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)
}
}
}