3 votes

Comment implémenter un menu latéral apparaissant de la droite vers la gauche sur Flutter?

Je sais que je peux utiliser Drawer pour le menu de gauche mais comment puis-je le personnaliser pour le côté droit. J'ai besoin de deux menus des deux côtés.

4voto

user2179571 Points 15

Vous pouvez utiliser endDrawer
Vous pouvez copier coller le code complet ci-dessous

Extrait de code

endDrawer: Drawer(
        elevation: 16.0,
        child: Column(
          children: [
            UserAccountsDrawerHeader(
              accountName: Text("xyz"),
              accountEmail: Text("xyz@gmail.com"),
              currentAccountPicture: CircleAvatar(
                backgroundColor: Colors.white,
                child: Text("xyz"),
              ),
              otherAccountsPictures: [
                CircleAvatar(
                  backgroundColor: Colors.white,
                  child: Text("abc"),
                )
              ],
            ),
            ListTile(
              title: new Text("Toutes les boîtes de réception"),
              leading: new Icon(Icons.mail),
            ),

Démonstration en direct

description de l'image ici

Code complet

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // Ce widget est la racine de votre application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Exemple Flutter',
      theme: ThemeData(
        // C'est le thème de votre application.
        //
        // Essayez de lancer votre application avec "flutter run". Vous verrez
        // que l'application a une barre d'outils bleue. Ensuite, sans quitter l'application, essayez
        // de changer le primarySwatch ci-dessous en Colors.green puis invoquez
        // le "hot reload" (appuyez sur "r" dans la console où vous avez lancé "flutter run",
        // ou simplement enregistrez vos modifications pour un "hot reload" dans un IDE Flutter).
        // Remarquez que le compteur n'est pas remis à zéro; l'application
        // n'est pas redémarrée.
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Exemple de page d'accueil Flutter'),
    );
  }
}

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

  // Ce widget est la page d'accueil de votre application. Il est stateful, ce qui signifie
  // qu'il contient un objet State (défini ci-dessous) qui contient des champs qui affectent
  // son apparence.

  // Cette classe est la configuration pour l'état. Elle contient les valeurs (dans ce
  // cas le titre) fournies par le parent (dans ce cas le widget App) et
  // utilisées par la méthode build de l'État. Les champs d'une sous-classe de Widget
  // sont toujours marqués "final".

  final String title;

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

class _MyHomePageState extends State {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // Cet appel à setState indique au framework Flutter qu'il y a quelque chose de
      // qui a changé dans cet État, ce qui le force à relancer la méthode build ci-dessous
      // pour que l'affichage puisse refléter les valeurs mises à jour. Si nous avions changé
      // _counter sans appeler setState(), alors la méthode build ne serait pas
      // relancée, et donc il semblerait qu'il ne se passe rien.
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    // Cette méthode est relancée à chaque fois que setState est appelé, par exemple comme ceci
    // par la méthode _incrementCounter ci-dessus.
    //
    // Le framework Flutter a été optimisé pour rendre les méthodes de construction plus rapides
    // de sorte que vous pouvez simplement reconstruire tout ce qui a besoin d'être mis à jour plutôt
    // que de devoir modifier individuellement les instances de widgets.
    return Scaffold(
      appBar: AppBar(
        // Ici, nous prenons la valeur de l'objet MyHomePage qui a été créé
        // par la méthode build de l'App, et l'utilisons pour définir le titre de notre appbar.
        title: Text(widget.title),
      ),
      drawer: Drawer(
        elevation: 16.0,
        child: Column(
          children: [
            UserAccountsDrawerHeader(
              accountName: Text("xyz"),
              accountEmail: Text("xyz@gmail.com"),
              currentAccountPicture: CircleAvatar(
                backgroundColor: Colors.white,
                child: Text("xyz"),
              ),
              otherAccountsPictures: [
                CircleAvatar(
                  backgroundColor: Colors.white,
                  child: Text("abc"),
                )
              ],
            ),
            ListTile(
              title: new Text("Toutes les boîtes de réception"),
              leading: new Icon(Icons.mail),
            ),
            Divider(
              height: 0.1,
            ),
            ListTile(
              title: new Text("Primaire"),
              leading: new Icon(Icons.inbox),
            ),
            ListTile(
              title: new Text("Social"),
              leading: new Icon(Icons.people),
            ),
            ListTile(
              title: new Text("Promotions"),
              leading: new Icon(Icons.local_offer),
            )
          ],
        ),
      ),
      endDrawer: Drawer(
        elevation: 16.0,
        child: Column(
          children: [
            UserAccountsDrawerHeader(
              accountName: Text("xyz"),
              accountEmail: Text("xyz@gmail.com"),
              currentAccountPicture: CircleAvatar(
                backgroundColor: Colors.white,
                child: Text("xyz"),
              ),
              otherAccountsPictures: [
                CircleAvatar(
                  backgroundColor: Colors.white,
                  child: Text("abc"),
                )
              ],
            ),
            ListTile(
              title: new Text("Toutes les boîtes de réception"),
              leading: new Icon(Icons.mail),
            ),
            Divider(
              height: 0.1,
            ),
            ListTile(
              title: new Text("Primaire"),
              leading: new Icon(Icons.inbox),
            ),
            ListTile(
              title: new Text("Social"),
              leading: new Icon(Icons.people),
            ),
            ListTile(
              title: new Text("Promotions"),
              leading: new Icon(Icons.local_offer),
            )
          ],
        ),
      ),
      body: Center(
        // Center est un widget de mise en page. Il prend un seul enfant et le positionne
        // au milieu du parent.
        child: Column(
          // Column est également un widget de mise en page. Il prend une liste d'enfants et
          // les arrange verticalement. Par défaut, il se redimensionne pour s'adapter à
          // horizontalement à ses enfants, et essaie d'être aussi haut que son parent.
          //
          // Invoquez "debug painting" (appuyez sur "p" dans la console, choisissez
          // l'action "Toggle Debug Paint" de l'inspecteur Flutter dans Android Studio,
          // ou la commande "Toggle Debug Paint" dans Visual Studio Code)
          // pour voir le wireframe de chaque widget.
          //
          // Column a diverses propriétés pour contrôler comment il se redimensionne et
          // comment il positionne ses enfants. Ici, nous utilisons mainAxisAlignment pour
          // centrer les enfants verticalement; l'axe principal ici est l'axe vertical
          // car les colonnes sont verticales (l'axe transversal serait
          // horizontal).
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'Vous avez appuyé sur le bouton autant de fois :',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Incrémenter',
        child: Icon(Icons.add),
      ), // Cette virgule finale rend la mise en forme automatique plus agréable pour les méthodes de construction.
    );
  }
}

1voto

Boby Points 687

Vous pouvez utiliser `endDrawer, https://api.flutter.dev/flutter/material/Scaffold/endDrawer.html

Scaffold(
   endDrawer:populateDrawer()
);

et voici le populateDrawer()

  populateDrawer() {
    return Theme(
      data: Theme.of(context).copyWith(canvasColor: Colors.white),
      child: Drawer(
        child: Column(
          children: [
            DrawerHeader(
              child: Center(
                child: Image.asset("assets/images/lf_logo.png",
                    height: 100, width: 100),
              ),
            ),
            Divider(color: Configuration.PrimaryColor),
            ListTile(
              leading: Icon(Icons.access_time),
              title: Text('Your Activity'),
              onTap: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => ActivityPage(),
                  ),
                );
              },
            ),
            ListTile(
              leading: Icon(Icons.lock_outline),
              title: Text('Change Password'),
              onTap: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => ChangepasswordPage(userId: userId),
                  ),
                );
              },
            ),
            ListTile(
              leading: Icon(Icons.feedback),
              title: Text('Feedback'),
              onTap: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => FeedbackPage(),
                  ),
                );
              },
            ),
            ListTile(
              leading: Icon(Icons.map),
              title: Text('Address Lists'),
              onTap: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => AddAddress(),
                  ),
                );
              },
            ),
            Divider(
              height: 50,
              color: Configuration.PrimaryColor,
            ),
            ListTile(
              leading: Icon(Icons.info_outline),
              title: Text('Privacy And Policy'),
              onTap: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => PrivacyPolicy(),
                  ),
                );
              },
            ),
            ListTile(
              leading: Icon(Icons.exit_to_app),
              title: Text('Logout'),
              onTap: () {
                logout();
              },
            ),
          ],
        ),
      ),
    );
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X