<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AbdMaker-dev</title>
    <description>The latest articles on DEV Community by AbdMaker-dev (@abdmakerdev).</description>
    <link>https://dev.to/abdmakerdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1112121%2Ff555221c-db72-4fce-8cb3-0d3a7742ff41.png</url>
      <title>DEV Community: AbdMaker-dev</title>
      <link>https://dev.to/abdmakerdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdmakerdev"/>
    <language>en</language>
    <item>
      <title>Formulaire dynamique en Flutter</title>
      <dc:creator>AbdMaker-dev</dc:creator>
      <pubDate>Sun, 06 Aug 2023 19:05:28 +0000</pubDate>
      <link>https://dev.to/abdmakerdev/formulaire-dynamique-en-flutter-222</link>
      <guid>https://dev.to/abdmakerdev/formulaire-dynamique-en-flutter-222</guid>
      <description>&lt;p&gt;&lt;strong&gt;I-) Introduction&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Bonjour les super-héros du développement mobile !&lt;br&gt;
Nous voilà de retour avec un nouveau tutoriel dans lequel nous allons voir comment générer dynamiquement des formulaires en Flutter. &lt;/p&gt;

&lt;p&gt;Vous travaillez sur un projet flutter dans le quel a un certain moment le continu des formulaires doit être définis par le Back-End du projet et vous ne savais pas comment s’y prendre😩😩😭😭!!!!! Donc ce Tuto est pour toi👍🏾.&lt;/p&gt;

&lt;p&gt;Pour mettre en pratique cette génération des formulaires en Flutter, nous allons essayer de réaliser les pages de connexion et d'inscription d'une application. Avant de commencer, je vous montre les images des deux pages (connexion et inscription) que nous allons créer ensemble.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- PAGE CONNEXION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--18AXS8o1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sz1xfn51fgr64dmakhue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--18AXS8o1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sz1xfn51fgr64dmakhue.png" alt="Image description" width="786" height="1592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- PAGE INSCRIPTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--10QyTjlC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nucyowh6obmijl3helwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--10QyTjlC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nucyowh6obmijl3helwx.png" alt="Image description" width="786" height="1592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;II-) Integration des maquettes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si vous aveZ regardé attentivement les deux images précédentes, vous allez constater que la page de connexion et d'inscription sont quasiment identiques. Elles ont le même agencement de base, les mêmes couleurs, etc.&lt;/p&gt;

&lt;p&gt;Les différences entre ces pages résident dans les textes affichés et le nombre de champs de saisie (Input Fields) dans les formulaires. Afin d'éviter toute redondance dans le code, c'est-à-dire de coder deux ou plusieurs fois la même chose, je vous propose de créer un widget (composant) qui définira la structure et la mise en forme de la page que nous appellerons AuthTemplatePage. Et ce dernier va avoir 3 propriétés qui sont : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;pageTitle&lt;/strong&gt; (String) : qui prend le titre de page où AuthTemplatePage est appelé. &lt;strong&gt;Exemple&lt;/strong&gt; CONNEXION ou INSCRIPTION&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;content&lt;/strong&gt; (Widget) : qui prend le contenu de la page plus précisément les formulaires de connexion et d’inscription.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;fleatingBnt&lt;/strong&gt; (Widget) : qui prend le bouton qui est complètement en bas à droite des pages connexion et inscription.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici le code de &lt;strong&gt;AuthTemplatePage&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jwPWBA9A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/97jwgxksfgofu38jwbuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jwPWBA9A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/97jwgxksfgofu38jwbuy.png" alt="Image description" width="800" height="1367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maintenant que le widget qui défini la form de nos page est créée nous allons juste l’appeler dans la page Connexion et Inscription successivement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Appel de **AuthTemplatePage&lt;/strong&gt; Dans la Page Connexion:**&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Io-KUO9X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/189ivh3ga8ku204x9nfc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Io-KUO9X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/189ivh3ga8ku204x9nfc.png" alt="Image description" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Appel de **AuthTemplatePage&lt;/strong&gt; Dans la Page Inscription:**&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--07xa37Pb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/apwbl7iwzzjkjgc50cq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--07xa37Pb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/apwbl7iwzzjkjgc50cq6.png" alt="Image description" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Après avoir regardé c’est deux images vous allez me demander c’est quoi le widget &lt;strong&gt;RedirectFloatingBtn&lt;/strong&gt; que nous voyons dans le code de nos deux pages?&lt;br&gt;
Hé bien c’est rien d’autre que le code du bouton de redirection qui est en bas à droite. Et ce bouton nous permet de naviguer entre les pages Connexion et Inscription.&lt;/p&gt;

&lt;p&gt;Voici le code de &lt;strong&gt;RedirectFloatingBtn&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--piqcEGH0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wamdfkbee8gn1wyfkxro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--piqcEGH0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wamdfkbee8gn1wyfkxro.png" alt="Image description" width="800" height="1093"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Une fois que tous est en place nous obtenons ce résultat dans nos deux pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WYarQL4u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ns6y71849qz2ctnwp4tb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WYarQL4u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ns6y71849qz2ctnwp4tb.png" alt="Image description" width="786" height="1592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P7WH9roM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0evfiddtg78pyustp7p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P7WH9roM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0evfiddtg78pyustp7p7.png" alt="Image description" width="786" height="1592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maintenant que nous avons nos deux pages il est grand temps maintenant de passer aux choses sérieuses.😎😎😎😉 GÉNÉRER DYNAMIQUEMENT DES FORMULAIRES.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;III -) Formulaire dynamique&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pour commencer nous devons d’abord mettre en place nôtre template de champ de saisie(Input Field) que nous appelleront &lt;strong&gt;DynamicInput&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le code de &lt;strong&gt;DynamicInput&lt;/strong&gt; : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZpGrtbj7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wuyx7gyba2gzf9lnnxzf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZpGrtbj7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wuyx7gyba2gzf9lnnxzf.png" alt="Image description" width="800" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Après cela il nous faut un modèle(Une Classe Dart) dont les attributs de classe vont être presque les mêmes que celle qui sont dans le DynamicInput. Et nous appellerons ce modèle &lt;strong&gt;DynamicInputModel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le code de &lt;strong&gt;DynamicInputModel&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YxL369uy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iurxvsgrfwkifyxv9io6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YxL369uy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iurxvsgrfwkifyxv9io6.png" alt="Image description" width="760" height="904"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et tout en bas déclarons deux tableaux de DynamicInputModel qui vont contenir les champs des formulaires d’inscription et de connexion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SLiIx-aV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5mlslg7m35r5lluxclm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SLiIx-aV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5mlslg7m35r5lluxclm.png" alt="Image description" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Après ça la prochaine étape vas être la définition des différentes types de validations des champs de saisie(Text, Email, Number etc...) des formulaires. Pour cela nous mettons en place la classe &lt;strong&gt;FormValidator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Le code de &lt;strong&gt;FormValidator&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5kfcd6u5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sw2wywit962xrz14drzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5kfcd6u5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sw2wywit962xrz14drzd.png" alt="Image description" width="800" height="922"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et pour conclure cette partie, nous avons ajouté en bas de cette classe une petite fonction &lt;strong&gt;getValidator&lt;/strong&gt; qui renvoie la validation.&lt;/p&gt;

&lt;p&gt;Et voici le code de la fonction &lt;strong&gt;getValidator&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eK83Cnji--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3jac11mzc283n882iq8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eK83Cnji--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3jac11mzc283n882iq8n.png" alt="Image description" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Après cela, nous revenons enfin sur nos deux pages "Connexion" et "Inscription" pour afficher les formulaires de connexion et d'inscription.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Pour la page Connexion *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VPes5Toc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2j7igspodk1pdivrzt4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VPes5Toc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2j7igspodk1pdivrzt4.png" alt="Image description" width="800" height="770"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Pour la page Inscription *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3QkzyZx3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0awjzigoc9wv2kxnmhov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3QkzyZx3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0awjzigoc9wv2kxnmhov.png" alt="Image description" width="800" height="715"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB:&lt;/strong&gt; Si vous avez bien regardé, j'ai utilisé une boucle for pour parcourir les tableaux loginForm et signUpForm, qui sont des tableaux ou des listes de DynamicInputModel. À chaque position i de la boucle, je crée un nouveau widget DynamicInput en passant tous les paramètres. 😍😍😍😍😍 TRÈS SIMPLE, N'EST-CE PAS ? 😍😍😍😍😍&lt;/p&gt;

&lt;p&gt;Voici le code complet de la Page Connexion et Inscription&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GWKmue_g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvax8p91v2x89apbupsa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GWKmue_g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvax8p91v2x89apbupsa.png" alt="Image description" width="800" height="1147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0zDYQBb1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dw2e840sqwjoz9wy15tu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0zDYQBb1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dw2e840sqwjoz9wy15tu.png" alt="Image description" width="800" height="1089"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Donc, avec cela, nous venons d'obtenir les pages d'inscription et de connexion avec des formulaires dynamiques, bien validés.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G_H_v8zb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n74ne56qhx2s68i47oas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G_H_v8zb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n74ne56qhx2s68i47oas.png" alt="Image description" width="788" height="1592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9aaU8LQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h9crk46hsn11ek7rsznc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9aaU8LQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h9crk46hsn11ek7rsznc.png" alt="Image description" width="788" height="1592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Les formulaires dynamiques peuvent être un peu compliqués à réaliser parfois, mais avec une bonne approche et une bonne séparation du code, on peut simplifier la complexité des formulaires dynamiques. Dans ce tutoriel, vous avez tout le nécessaire pour créer des formulaires dynamiques adaptés à vos besoins. Merci 🙏.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>form</category>
    </item>
    <item>
      <title>Faire du Flutter Comme les pro du DFB(Dakar Flutter Brigade)</title>
      <dc:creator>AbdMaker-dev</dc:creator>
      <pubDate>Wed, 05 Jul 2023 21:23:26 +0000</pubDate>
      <link>https://dev.to/abdmakerdev/faire-du-flutter-comme-abd-2lip</link>
      <guid>https://dev.to/abdmakerdev/faire-du-flutter-comme-abd-2lip</guid>
      <description>&lt;p&gt;&lt;strong&gt;I - Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dans ce tutoriel, je souhaite partager un petit projet Flutter que j'ai réalisé avec des étudiants que je forme au développement mobile. Je tiens à le partager car il a été bénéfique pour mes étudiants en leur permettant de comprendre la technologie Flutter. L'architecture que j'ai utilisée est le modèle MVP (Modèle-Vue-Contrôleur), qui est une architecture simple, efficace et facile à utiliser et à comprendre. Avant de commencer à coder, nous allons prendre un bref aperçu de l'architecture MVP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;II - L’architecture MVP (Modèle-Vue-Contrôleur)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--So3FPf8x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d840phzpkichs45mo5ep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--So3FPf8x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d840phzpkichs45mo5ep.png" alt="Image description" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comme vous pouvez le voir sur l'image, l'architecture MVC est un modèle de conception largement utilisé dans le développement d'applications, y compris les applications mobiles. Elle divise l'application en trois composants principaux : le modèle, la vue et le contrôleur. Chaque composant a un rôle spécifique dans le fonctionnement global de l'application.&lt;/p&gt;

&lt;p&gt;Voici une brève explication de chaque composant de l'architecture MVC :&lt;/p&gt;

&lt;p&gt;Modèle (Model) :&lt;br&gt;
Le modèle représente les données de l'application et les règles métier associées. Il gère la logique de l'application, les opérations de manipulation des données et la persistance des données. Le modèle est généralement indépendant de la vue et du contrôleur, ce qui signifie qu'il peut être réutilisé dans d'autres parties de l'application ou dans d'autres applications.&lt;/p&gt;

&lt;p&gt;Vue (View) :&lt;br&gt;
La vue est responsable de l'affichage de l'interface utilisateur (UI) de l'application. Elle présente les données au format approprié pour l'utilisateur et affiche les éléments graphiques tels que les boutons, les champs de saisie, etc. La vue est généralement passive et ne contient pas de logique métier complexe. Elle se met à jour en fonction des modifications apportées au modèle.&lt;/p&gt;

&lt;p&gt;Contrôleur (Controller) :&lt;br&gt;
Le contrôleur est responsable de la gestion des interactions entre l'utilisateur, la vue et le modèle. Il reçoit les entrées de l'utilisateur via la vue, interroge et met à jour le modèle en fonction de ces entrées, puis met à jour la vue en conséquence. Le contrôleur agit comme un médiateur entre la vue et le modèle, en veillant à ce que les deux restent synchronisés.&lt;/p&gt;

&lt;p&gt;Très bien, après cela, je pense que nous pouvons commencer à coder notre petit projet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;III - Codons notre projet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;III - 1 - Création et Structuration du projet Flutter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pour cree un projet un projet flutter lance la commande suivant sur votre terme :&lt;/p&gt;

&lt;p&gt;&amp;lt;&amp;lt;&amp;lt;== flutter create nom__du_projet ==&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;

&lt;p&gt;Après avoir créé le projet en utilisant la commande précédente, j'ai organisé le dossier "lib" de la manière suivante :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HBLLqHG4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vhqt6qa5x3t0ewjgjn9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HBLLqHG4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vhqt6qa5x3t0ewjgjn9v.png" alt="Image description" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et après création des différentes composantes de mon projet voici ce que ça donne:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ssa-2aWK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wdrh1diegv24d5qh84c2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ssa-2aWK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wdrh1diegv24d5qh84c2.png" alt="Image description" width="800" height="747"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;III - 2 - Mise en Place de l'interface de notre Application&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;voici à  quoi ressemble l’interface  de notre application :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m6LC9tyX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uuqterlrk5cxg0m1ugkw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m6LC9tyX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uuqterlrk5cxg0m1ugkw.png" alt="Image description" width="800" height="1693"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comme vous pouvez le constater, l'application est un jeu très simple. C'est un jeu dans lequel le joueur qui aligne ces trois objets en premier a gagné.&lt;/p&gt;

&lt;p&gt;Si vous avez un design à intégrer, la première chose à faire est de décomposer chaque interface du design en composants indépendants. Pour notre cas, voici comment l'interface peut être décomposée :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Elkg4B2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uh589snmainc36d2ns5q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Elkg4B2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uh589snmainc36d2ns5q.png" alt="Image description" width="771" height="951"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vu que nous utilisons un gestionnaire d'état (State Management) appelé &lt;strong&gt;Riverpod&lt;/strong&gt;, chaque composant de l'interface peut être codé de manière indépendante. Cela signifie que nous ne sommes pas obligés de regrouper tout le code de chaque composant dans la même page. Au lieu de cela, nous pouvons les coder séparément et les appeler dans la page de l'interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;III - 2 - 1 - En tête&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SwOGPhl1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4tkefcul4d4067v3hx3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SwOGPhl1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4tkefcul4d4067v3hx3w.png" alt="Image description" width="800" height="127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et voici le code de l'en tête&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z4zkiP63--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v3skccdd2u6gisnjpwp1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z4zkiP63--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v3skccdd2u6gisnjpwp1.png" alt="Image description" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;III - 2 - 2 - Les information des joueurs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ofW_xdxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iwsjrgmy7fwg99a3z044.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ofW_xdxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iwsjrgmy7fwg99a3z044.png" alt="Image description" width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et voici le code pour afficher les informations des joueurs :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZsE3DpSW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qpbnhtb8do3tk4iw7nf4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZsE3DpSW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qpbnhtb8do3tk4iw7nf4.png" alt="Image description" width="800" height="704"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si vous avez remarqué, dans le code des informations des joueurs, j'ai fait appel à un autre composant appelé PlayerWidget. J'ai utilisé ce composant pour éviter la redondance du code qui affiche l'icône et le nom d'utilisateur des joueurs.&lt;/p&gt;

&lt;p&gt;Voici le code du composant PlayerWidget :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lq3bQaE2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vuawqpuomtyphe536qs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lq3bQaE2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vuawqpuomtyphe536qs.png" alt="Image description" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;III - 2 - 3 - Le Jeux&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uzU4EMeh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vzo77dtarxhgid4kda4w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uzU4EMeh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vzo77dtarxhgid4kda4w.png" alt="Image description" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voici le code du jeux&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LLUhKT68--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nfbok9t59k6bnoepehx9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LLUhKT68--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nfbok9t59k6bnoepehx9.png" alt="Image description" width="800" height="1107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si vous avez remarqué, j'ai également fait appel à un autre composant appelé ItemGame que j'ai créé afin de ne pas regrouper tout le code dans le même fichier. Voici le code de &lt;strong&gt;ItemGame&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DIqBo30L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bk7qdbwdivhsg5pym7m4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DIqBo30L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bk7qdbwdivhsg5pym7m4.png" alt="Image description" width="800" height="762"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;III - 2 - 4 - Le Bouton&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3-_t77xn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/toea0na4vx65qnl62u78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3-_t77xn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/toea0na4vx65qnl62u78.png" alt="Image description" width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voici le code du bouton &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uYCg8ZEc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sdqlipyp7qyvu7q9i256.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uYCg8ZEc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sdqlipyp7qyvu7q9i256.png" alt="Image description" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;III - 2 - 4 - Appels de tous les Composants sur l’interface *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JEB7pFJ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qgks00db0mjgh12zbt69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JEB7pFJ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qgks00db0mjgh12zbt69.png" alt="Image description" width="800" height="786"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et ainsi, nous obtenons l'interface de notre application.&lt;/p&gt;

&lt;p&gt;Si vous êtes intéressés à voir le reste de l'application et à obtenir de l'assistance pour le développement de vos applications, veuillez nous contacter :&lt;/p&gt;

&lt;p&gt;Email : &lt;a href="mailto:aliounebadaradiouf7@gmail.com"&gt;aliounebadaradiouf7@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LinkedIn : &lt;a href="https://www.linkedin.com/in/alioune-badara-diouf-b82245192/"&gt;https://www.linkedin.com/in/alioune-badara-diouf-b82245192/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>riverpod</category>
      <category>mvc</category>
    </item>
  </channel>
</rss>
