Flutter : Widget

Si vous avez déjà utilisé Flutter, vous avez sûrement entendu parler des widgets. Mais savez-vous ce que c’est exactement ? Dans cet article, nous allons voir ce que sont les widgets, comment ils fonctionnent et pourquoi ils sont si importants dans Flutter.

Un widget est un élément de base de l’interface utilisateur (UI) dans Flutter. Il peut être un bouton, un texte, une image, une icône, une liste, une grille, etc. Chaque widget a des propriétés qui définissent son apparence et son comportement, comme la couleur, la taille, la position, l’animation, etc.

Les widgets sont organisés en une hiérarchie appelée arbre de widgets (widget tree). Chaque widget est le parent ou l’enfant d’un autre widget. Le widget racine est le widget qui contient tous les autres widgets de l’application. Le widget enfant est le widget qui est contenu dans un autre widget. Par exemple, si vous avez un widget texte dans un widget bouton, le widget texte est l’enfant du widget bouton, et le widget bouton est le parent du widget texte.

L’arbre de widgets est construit à partir du code que vous écrivez dans votre application. Chaque fois que vous créez un nouveau widget, vous l’ajoutez à l’arbre de widgets à un endroit spécifique. Par exemple, si vous voulez créer un écran avec un titre et une liste, vous pouvez écrire quelque chose comme ceci :

import 'package:flutter/material.dart';

// function to trigger build process
void main() => runApp(const ApertoApp());

class ApertoApp extends StatelessWidget {
const ApertoApp({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: Colors.indigoAccent,
title: const Text("Mon application Flutter"),
), // AppBar
body: ListView(
children: const [
Text('Premier élément'),
Text('Deuxième élément'),
Text('Troisième élément'),
],
),
),
); // MaterialApp
}
}

Ici, vous créez un widget Scaffold qui est le widget racine de votre écran. Le widget Scaffold a deux propriétés : appBar et body. La propriété appBar prend un widget AppBar qui contient un widget Text avec le titre de votre écran. La propriété body prend un widget ListView qui contient une liste de widgets Text avec les éléments de votre liste.

widget tree flutter dans Visual Studio Code
widget tree flutter dans Visual Studio Code

Lorsque vous lancez votre application, Flutter va parcourir l’arbre de widgets et afficher chaque widget à l’écran selon ses propriétés. Si vous modifiez une propriété d’un widget, Flutter va reconstruire l’arbre de widgets et mettre à jour l’écran avec le nouveau rendu.

Les widgets sont donc la clé pour créer des interfaces utilisateurs dynamiques et réactives avec Flutter. Ils vous permettent de décrire comment votre application doit s’afficher et se comporter en fonction des données et des événements. Il existe de nombreux types de widgets dans Flutter, chacun avec ses propres caractéristiques et fonctionnalités. Vous pouvez les combiner et les personnaliser pour créer des UI adaptées à vos besoins et à votre style.

Flutter : Comment créer un bouton switch à la manière d’iOS

Dans cet article, je vous montre comment utiliser en programmation Dart et Flutter le widget CupertinoSwitch pour créer un composant interactif qui permet aux utilisateurs de choisir entre deux valeurs.

Un interrupteur (également connu sous le nom de toggle) est un composant interactif qui permet aux utilisateurs de choisir entre une paire de valeurs opposées (par exemple, on/off, vrai/faux, clair/foncé) et présente différentes apparences pour distinguer le choix. Cet article vous montre comment créer un interrupteur de style iOS dans Flutter en utilisant le widget CupertinoSwitch.

Principe

Pour utiliser le widget CupertinoSwitch, vous devez importer la bibliothèque Cupertino :

import 'package:flutter/cupertino.dart';

Le widget CupertinoSwitch requiert 2 paramètres :

  • valeur (bool) : L’état du widget
  • onChanged : Cette fonction de rappel est déclenchée lorsque l’utilisateur modifie l’interrupteur.

Les autres paramètres sont facultatifs.

Constructeur :


CupertinoSwitch(
   activeColor: CupertinoColors.activeBlue,
   trackColor: CupertinoColors.inactiveGray,
   thumbColor: CupertinoColors.white,
   value: _showBlueBox,
   onChanged: (value) {
      setState(() {
         _showBlueBox = value;
      });
   },
),

Exemple

Aperçu de l’application

La petite application que nous allons réaliser contient 2 interrupteurs. Le premier, dont la couleur active est le vert (c’est la couleur par défaut), contrôle l’existence de la boîte verte. Le deuxième interrupteur, dont la couleur active est le bleu, contrôle l’existence de la boîte bleue.

Voici comment cela fonctionne :

switch ios off
switch ios off
switch ios on
switch ios on

Le code

Le code source complet dans main.dart avec des explications dans les commentaires :

import 'package:flutter/cupertino.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const CupertinoApp(
      title: "Bouton Switch iOS",
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  bool _showGreenBox = false;
  bool _showBlueBox = false;

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: const CupertinoNavigationBar(
        middle: Text("Bouton Switch iOS"),
      ),
      child: Padding(
        padding: const EdgeInsets.all(20),
        child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
          const SizedBox(
            height: 100,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              const Text('Afficher la boite verte'),
              CupertinoSwitch(
                value: _showGreenBox,
                onChanged: (value) {
                  setState(() {
                    _showGreenBox = value;
                  });
                },
              ),
            ],
          ),
          const SizedBox(
            height: 20,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              const Text('Afficher la boite bleue'),
              CupertinoSwitch(
                activeColor: CupertinoColors.activeBlue,
                trackColor: CupertinoColors.inactiveGray,
                thumbColor: CupertinoColors.white,
                value: _showBlueBox,
                onChanged: (value) {
                  setState(() {
                    _showBlueBox = value;
                  });
                },
              ),
            ],
          ),
          const SizedBox(
            height: 30,
          ),
          if (_showGreenBox)
            Container(
              width: double.infinity,
              height: 200,
              color: CupertinoColors.activeGreen,
            ),
          if (_showBlueBox)
            Container(
              margin: const EdgeInsets.only(top: 30),
              width: double.infinity,
              height: 200,
              color: CupertinoColors.activeBlue,
            ),
        ]),
      ),
    );
  }
}

Vous avez appris les principes de base du widget CupertinoSwitch. Vous aurez peut-être besoin de l’utiliser souvent si vous avez l’intention de développer une application qui se concentre sur les utilisateurs d’iOS.

Partagez en commentaire vos expériences et si ce mini tuto vous a aidé dans vos projets. J’ai hâte de vous lire 😉

 

Flutter : Exemples de boutons d’action flottants

A travers cet article je vous montre comment créer des boutons pour vos applications mobiles Flutter. A travers 3 exemples différents d’utilisation de FloatingActionButton (FAB) dans Flutter. Ces exemples sont classés dans l’ordre, de basique à avancé, de simple à complexe. Commençons…

Grand bouton d’action flottant circulaire

Vous pouvez créer un grand bouton d’action flottant circulaire à l’aide du constructeur FloatingActionButton.large.

Capture d’écran :

Grand bouton d’action flottant circulaire

 

Code :

home: Scaffold(
  appBar: AppBar(
    title: const Text("Exemples de boutons d'\action flottants"),
    backgroundColor: Colors.indigo,
  ),
  floatingActionButton: FloatingActionButton.large(
    onPressed: () {},
    child: const Icon(Icons.waving_hand),
    backgroundColor: Colors.deepOrange,
  ),
  floatingActionButtonLocation: FloatingActionButtonLocation.startFloat,
)

Bouton d’action flottant Pill avec texte et icône

Vous pouvez facilement créer un bouton d’action flottant de type pilule avec du texte et une icône en utilisant le constructeur FloatingActionButton.extended.

Capture d’écran :

Bouton d’action flottant Pill avec texte et icône

Code :

home: Scaffold(
  appBar: AppBar(
    title: const Text("Exemples de boutons d'\action flottants"),
    backgroundColor: Colors.indigo,
  ),
  floatingActionButton: FloatingActionButton.extended(
    onPressed: () {},
    icon: const Icon(Icons.play_arrow),
    label: const Text('Play Video'),
    backgroundColor: Colors.indigoAccent,
  ),
)

FloatingActionButton et BottomNavigationBar à encoche

Dans l’exemple suivant, nous allons créer une barre de navigation inférieure incurvée avec une encoche (une découpe en demi-cercle) au milieu. À cet endroit, nous plaçons un bouton d’action flottant.

Capture d’écran :

FloatingActionButton et BottomNavigationBar à encoche

 

Code :

home: Scaffold(
  appBar: AppBar(
    title: const Text("Exemples de boutons d'\action flottants"),
    backgroundColor: Colors.blueGrey,
  ),
  // The bottom navigation bar
  bottomNavigationBar: BottomAppBar(
    color: Colors.blueGrey,
    // this creates a notch in the center of the bottom bar
    shape: const CircularNotchedRectangle(),
    notchMargin: 6,
    child: Row(
      mainAxisAlignment: MainAxisAlignment.spaceAround,
      children: [
        IconButton(
          icon: const Icon(
            Icons.home,
            color: Colors.white,
          ),
          onPressed: () {},
        ),
        IconButton(
          icon: const Icon(
            Icons.people,
            color: Colors.white,
          ),
          onPressed: () {},
        ),
        const SizedBox(
          width: 20,
        ),
        IconButton(
          icon: const Icon(
            Icons.notifications,
            color: Colors.white,
          ),
          onPressed: () {},
        ),
        IconButton(
          icon: const Icon(
            Icons.settings,
            color: Colors.white,
          ),
          onPressed: () {},
        ),
      ],
    ),
  ),
  // implement the floating button
  floatingActionButton: FloatingActionButton(
      onPressed: () {},
      backgroundColor: Colors.redAccent,
      child: const Icon(Icons.add)),
  floatingActionButtonLocation:
      FloatingActionButtonLocation.centerDocked,
)

 

Merci de votre lecture.

Faites-moi savoir si vous rencontrez des difficultés, n’hésitez pas à commenter ci-dessous j’aime vous aider. Si vous avez une suggestion de nouvel article ou tutoriel alors exprimez-vous en commentant.

N’oubliez pas de partager ce tutoriel avec vos amis sur Facebook et Twitter.

 

 

Flutter : Comment créer une mise en page plein écran ?

Dans les applications smartphones avec une interface utilisateur moderne, vous voyez beaucoup d’applications mobiles avec un style de conception affichant une image plein écran, et vous devez savoir comment le faire. Je vais vous montrer comment créer une image plein écran dans Flutter à travers ce post.

Image plein écran dans Flutter

Pour y parvenir, vous devrez appliquer la propriété de décoration sur le conteneur. Comme il existe de nombreux types de décoration, nous utiliserons BoxDecoration et appliquerons une DecorationImage avec un BoxFit.cover.

Ainsi, le code final pour créer une image plein écran dans Flutter semble assez simple. Le Container se présente ainsi :

Container(
  decoration: BoxDecoration(
    image: DecorationImage(
      image: NetworkImage(
        'https://images.unsplash.com/photo-1517030330234-94c4fb948ebc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1275&q=80'),
      fit: BoxFit.cover,
    ),
  ),
  child: Center(
    child: Text(
      'Mise en page de base',
      style: TextStyle(
        color: Colors.white,
        fontSize: 30,
      ),
    ),
  ),
),

Dans l’exemple de code ci-dessus, je charge une image depuis une URL et je l’affiche.

Flutter Design plein écrana
Flutter Design plein écran

Comme vous pouvez le constater, la barre en haut de l’écran affiche également l’image de fond. Pour se faire, vous devez utiliser la transparence :

child: AppBar(
  title: Text("Transparent AppBar"),
  backgroundColor: Colors.transparent,
  elevation: 0,
  actions: <Widget>[
    IconButton(
      icon: Icon(Icons.share),
      onPressed: () {},
      tooltip: 'Share',
    ),
  ],
),

En résumé :

Comme nous l’avons vu, c’est assez simple et direct de créer une page intégrant une image plein écran dans Flutter avec quelques lignes de code.

Le code est disponible sur GitLab : Flutter basic layout

 

 

Application mobile : Liste de tâches

En cette fin d’année, pendant mes congés, je décidé de suivre le cours “The Complete Flutter App Development Course for Android, iOS” chez Udemy.

Comme je me suis bien amusé pendant cette formation je vous livre le résultat : un projet d’application mobile de prise de notes permettant de mettre en œuvre une base locale SQFLite (exercice à but de formation et non publiée dans les stores Apple et Android).
Suivant l’avancée de ce projet, je pourrai un jour la publier sur Google Play (Android) ou l’App Store (iPhone ou iPad).
Stay tuned 😉

Présentation de l’application mobile Liste de tâches

L’application mobile permet de gérer une liste de tâches facilement repérable par priorité.
Elle utilise une base de données locale SQFLite permettant de stocker vos tâches composées d’une description et de la date de création.
Vous pouvez également supprimer les tâches qui ne vous conviennent plus ou que vous avez réalisé (évolution possible : conserver les tâches achevées en mémoire).

News de l’application mobile Liste de tâches

  • 28 décembre 2019 : Conception de la logique en relation avec une base de données locale SQFLite pour sauvegarder et conserver en mémoire les tâches. Dans cette itération, j’ai également créé le design graphique.

Les sources du projets sont disponibles librement sur mon compte GitLab

 

 

 

 

Photo by freestocks.org from Pexels

Flutter : Comment créer un formulaire et une SnackBar ?

Avec ce tutoriel Flutter, je vais vous présenter la manière de construire un formulaire avec vérification pour éviter que la saisie soit non-nulle associé à un message d’alerte via une SnackBar d’alerte. Comme d’habitude je partage le code dans ce billet consacré à Flutter.

Le formulaire avec validation

Les applications demandent souvent aux utilisateurs de saisir des informations dans un champ de texte. Par exemple, vous pouvez demander aux utilisateurs de saisir un identifiant et un mot de passe pour valider l’accès à un espace privé.

Pour que votre application soit sûres et faciles à utiliser, vous devez vérifier si les informations fournies par l’utilisateur sont valides. Si l’utilisateur a correctement rempli le formulaire, traitez les informations. Si l’utilisateur soumet des informations incorrectes, affichez un message d’erreur convivial pour lui faire savoir ce qui ne s’est pas passé.

C’est à ce moment qu’intervient la SnackBar.

Champ formulaire Flutter stylé

Le code du champ de formulaire :

TextFormField(
  maxLength: 25,
  decoration: const InputDecoration(
      labelText: 'Champ de formulaire',
      hintText: 'Entrer du texte',
      border: OutlineInputBorder()),
  validator: (value) {
    if (value.isEmpty) {
      return 'Veuillez saisir un texte';
    }
    return null;
  },
)

La SnackBar

Elle permet d’informer brièvement vos utilisateurs lorsque certaines actions ont lieu. Par exemple, lorsqu’un utilisateur glisse un message dans une liste, vous pouvez l’informer que le message a été supprimé.

Vous pourriez même leur donner une option pour annuler l’action.

Snackbar de validation suite à action sur le bouton

Le code du bouton de validation et de la snackbar de confirmation :

child: RaisedButton(
  onPressed: () {
    // Retourne true si le formulaire est valide, sinon false
    if (_formKey.currentState.validate()) {
      // Affiche le Snackbar si le formulaire est valide
      Scaffold.of(context).showSnackBar(
          SnackBar(content: Text('Traitement en cours')));
    }
  },
  child: Text('Envoyer'),
)

Construire un formulaire et une SnackBar d’alerte

Dans l’exemple que je vous propose dans ce tutoriel Flutter, vous allez apprendre comment ajouter une validation à un formulaire qui comporte un seul champ de texte en suivant les étapes suivantes :

  • Créer un formulaire avec une clé globale.
  • Ajouter un champ de type TextFormField avec une logique de validation.
  • Créez un bouton pour valider et soumettre le formulaire.
  • Afficher une SnackBar lorsque la saisie est valide (non-nulle)
  • Fournir une action facultative

Voici le code complet du tuto Flutter :

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Formulaire et Snackbar',
      theme: ThemeData(
        primarySwatch: Colors.orange,
      ),
      home: MyHomePage(title: 'Formulaire et Snackbar'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(
        child: MyCustomForm(),
      ),
    );
  }
}

class MyCustomForm extends StatefulWidget {
  @override
  MyCustomFormState createState() {
    return MyCustomFormState();
  }
}

class MyCustomFormState extends State<MyCustomForm> {
  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    // Construire le formulaire avec _formKey créé au-dessus
    return Form(
      key: _formKey,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          TextFormField(
            validator: (value) {
              if (value.isEmpty) {
                return 'Veuillez saisir un texte';
              }
              return null;
            },
          ),
          Padding(
            padding: const EdgeInsets.symmetric(vertical: 16.0),
            child: RaisedButton(
              onPressed: () {
                // Retourne true si le formulaire est valide, sinon false
                if (_formKey.currentState.validate()) {
                  // Affiche le Snackbar si le formulaire est valide
                  Scaffold.of(context).showSnackBar(
                      SnackBar(content: Text('Traitement en cours')));
                }
              },
              child: Text('Envoyer'),
            ),
          ),
        ],
      ),
    );
  }
}

Retrouvez le code de ce tuto sur GitLab

J’espère que ce projet vous aidera à mieux comprendre comment construire un formulaire et une SnackBar avec Flutter. N’hésitez pas à ajouter vos commentaires ou questions ci-dessous, je me ferai un plaisir d’y répondre.

 

 

 

Photo by Josh Hild from Pexels

Application mobile : Frais kilométriques

Aperto App - Indemnités kilométriques - Projet personnel développé en Flutter pour iPhone et Android

Présentation de l’app. mobile

Optimisez la gestion de vos frais kilométriques avec FraisKilo, votre allié intelligent pour le calcul précis des coûts liés à vos déplacements professionnels. Notre application simplifie le processus en se basant sur le barème officiel de l’URSSAF, garantissant une conformité totale.

Caractéristiques Clés

  1. Calcul Précis : FraisKilo utilise le barème officiel de l’URSSAF pour assurer des calculs précis des frais kilométriques, prenant en compte la puissance du véhicule et le nombre de kilomètres parcourus.
  2. Personnalisation Facile : Saisissez simplement la puissance de votre véhicule et le nombre de kilomètres, et laissez FraisKilo faire le reste. L’application s’adapte à vos caractéristiques spécifiques pour des résultats individualisés.
  3. Gain de Temps : Oubliez les calculs manuels fastidieux. FraisKilo automatise le processus, vous permettant de consacrer votre temps à des tâches plus importantes.
  4. Suivi Efficace : Gardez une trace de vos dépenses kilométriques avec facilité. FraisKilo vous offre un suivi clair et organisé de toutes vos données de déplacement.
  5. Conformité Assurée : Avec FraisKilo, vous bénéficiez de la certitude d’une conformité totale aux normes fiscales et aux barèmes officiels, évitant ainsi les erreurs coûteuses.

Soyez maître de vos dépenses kilométriques avec FraisKilo. Téléchargez l’application dès aujourd’hui et transformez la gestion de vos déplacements professionnels. Simplifiez, optimisez, et économisez avec FraisKilo Calculatrice.

Actualités de l’app. mobile

Mises à jour

  • 22 février 2019 – Conception du design et de la logique de calcul avec le langage de développement d’applications Flutter

News sur les indemnités kilométriques

Publication sur les stores

  • Android – Google Play : app. mobile non publiée
  • iPhone – App Store : app. mobile non publiée

Informations techniques

  • Après la publication de mon billet sur le calcul des indemnités kilométriques, j’ai eu l’idée de développer une application mobile pour Android et iOS en utilisant le langage de développement Flutter.