76 votes

Placement de deux icônes de fin dans ListTile

Je souhaite placer deux icônes, côte à côte, sur le côté "arrière" d'une ListTile. J'ai essayé d'ajouter un widget Row avec les deux icônes à l'intérieur, mais cela a complètement perturbé la disposition de l'ensemble de la ListTile, la rendant inutilisable. Existe-t-il un moyen d'augmenter l'espace alloué à la partie arrière ?

Voici le code :

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Welcome to Flutter'),
        ),
        body: ListView(
      children: <Widget>[
        ListTile(
          leading: Icon(Icons.play_arrow,),
          title: Text("This is a title"),
          subtitle: Text("This is subtitle"),
          trailing: Row(          
            children: <Widget>[
            Icon(Icons.flight),
            Icon(Icons.flight_land)
          ]),
        )
      ]
    ),
      ),
    );
  }
}

Voici à quoi cela ressemble :

1 votes

Que voulez-vous dire par - "la mise en page de l'ensemble du ListTile a été complètement chamboulée" ? - Partagez votre code. Il se peut que vous fassiez quelque chose d'étrange.

1 votes

Je suis d'accord avec @anmol.majhail . et si vous pouvez partager une capture d'écran

1 votes

Pourquoi ne pas simplement appeler une fonction qui renvoie un widget enfant personnalisé pour la vue en liste ? Je suggérerais d'utiliser ListView.builder()

177voto

avishorp Points 2111

Ajout mainAxisSize: MainAxisSize.min à l'instance Row() résout le problème.

2 votes

Il a fonctionné comme un charme ! Même si je ne comprends pas pourquoi le widget ListTile se comporte de la sorte en ayant une ligne en fin de ligne...

81voto

CopsOnRoad Points 4705

Vous pouvez simplement utiliser Wrap en trailing

ListTile(
  title: Text("This is my ListTile"),
  trailing: Wrap(
    spacing: 12, // space between two icons
    children: <Widget>[
      Icon(Icons.call), // icon-1
      Icon(Icons.message), // icon-2
    ],
  ),
)

enter image description here

0 votes

Comment l'utiliser pour les colonnes ? J'aimerais utiliser la flèche vers le haut, le texte, la flèche vers le bas à droite de la tuile de la liste.

2 votes

@TipVisor Veuillez poser une question séparée, il est difficile de fournir de l'aide sans voir votre code et comment vous voulez que les choses se passent exactement.

0 votes

Pourquoi cela fonctionne-t-il ? Que fait wrap que la ligne sans mainAxisSize ne peut pas faire ? Je ne comprends pas la solution MainAxisSize.min. Quelqu'un pourrait-il m'expliquer ce que fait Flutter dans les coulisses ?

23voto

TipVisor Points 514

Essayez ce code. Je pense qu'il fonctionne correctement :

trailing: FittedBox(
          fit: BoxFit.fill,
          child: Row(
          children: <Widget>[
            Icon(Icons.flight),
            Icon(Icons.flight_land),
          ],
          ),
        ),

4 votes

L'utilisation de Wrap() permet de réduire considérablement la saisie :-)

0 votes

FittedBox prend beaucoup d'espace à la fin.

0 votes

C'est la meilleure solution si vous utilisez différents widgets, car vous obtiendrez un alignement vertical agréable.

1voto

Gama Points 31

J'ai profité de la solution FittedBox laissée ci-dessus et j'ai résolu mon problème en affichant un TextButton et un IconButton lorsque l'écran est en mode paysage et lorsqu'il est en mode portrait, seul l'IconButton est affiché.

trailing: MediaQuery.of(context).size.width > 480
                      ? FittedBox(
                          fit: BoxFit.fill,
                          child: Row(
                            children: <Widget>[
                              TextButton(
                                style: TextButton.styleFrom(
                                  // padding: const EdgeInsets.all(16.0),
                                  primary: Theme.of(context).errorColor,
                                  textStyle: const TextStyle(
                                      fontSize: 14,
                                      fontWeight: FontWeight.bold),
                                ),
                                onPressed: () => onRemove(tr.id),
                                child: const Text('Excluir'),
                              ),
                              IconButton(
                                icon: Icon(Icons.delete),
                                color: Theme.of(context).errorColor,
                                onPressed: () => onRemove(tr.id),
                              ),
                            ],
                          ),
                        )
                      : IconButton(
                          icon: Icon(Icons.delete),
                          color: Theme.of(context).errorColor,
                          onPressed: () => onRemove(tr.id),
                        ),

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