Je veux avoir une rangée d'IconButtons, tous côte à côte, mais il semble y avoir un assez grand remplissage entre l'icône réelle et les limites d'IconButton. J'ai déjà mis le rembourrage du bouton à 0.
Ceci est mon composant, assez simple:
class ActionButtons extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.lightBlue,
margin: const EdgeInsets.all(0.0),
padding: const EdgeInsets.all(0.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
IconButton(
icon: new Icon(ScanrIcons.reg),
alignment: Alignment.center,
padding: new EdgeInsets.all(0.0),
onPressed: () {},
),
IconButton(
icon: new Icon(Icons.volume_up),
alignment: Alignment.center,
padding: new EdgeInsets.all(0.0),
onPressed: () {},
)
],
),
);
}
}
Je veux me débarrasser de la plupart de l'espace bleu clair, faire démarrer mes icônes plus tôt à gauche et plus près les unes des autres, mais je ne trouve pas le moyen de redimensionner le IconButton lui-même.
Je suis presque sûr que cet espace est occupé par le bouton lui-même, car si je change leurs alignements en centerRight
et centerLeft
ils ressemblent à ceci:
Réduire les icônes réelles n'aide pas non plus, le bouton est toujours grand:
merci pour l'aide
Ce n'est pas tant qu'il y a un rembourrage. IconButton est un widget Material Design qui suit la spécification selon laquelle les objets exploitables doivent être au moins 48 pixels de chaque côté. Vous pouvez cliquer sur l'implémentation IconButton à partir de n'importe quel IDE.
Vous pouvez également prendre de manière semi-triviale le code source icon_button.Dart et créer votre propre IconButton qui ne suit pas les spécifications Material Design car le fichier entier ne fait que composer d'autres widgets et ne compte que 200 lignes qui sont principalement des commentaires.
Deux façons de contourner ce problème.
Enveloppez le IconButton à l'intérieur d'un conteneur qui a une largeur.
Par exemple:
Container(
padding: const EdgeInsets.all(0.0),
width: 30.0, // you can adjust the width as you need
child: IconButton(
),
),
Vous pouvez également utiliser GestureDetector au lieu de IconButton, recommandé par Shyju Madathil.
GestureDetector( onTap: () {}, child: Icon(Icons.volume_up) )
J'étais confronté à un problème similaire en essayant de rendre une icône à l'emplacement où l'utilisateur touche l'écran. Malheureusement, la classe Icon
enveloppe votre icône choisie dans un SizedBox
.
En lisant un peu la source de la classe Icon, il s'avère que chaque icône peut être traitée comme du texte:
Widget iconWidget = RichText(
overflow: TextOverflow.visible,
textDirection: textDirection,
text: TextSpan(
text: String.fromCharCode(icon.codePoint),
style: TextStyle(
inherit: false,
color: iconColor,
fontSize: iconSize,
fontFamily: icon.fontFamily,
package: icon.fontPackage,
),
),
);
Donc, par exemple, si je veux rendre Icons.details
pour indiquer où mon utilisateur vient de pointer, sans aucune marge, je peux faire quelque chose comme ceci:
Widget _pointer = Text(
String.fromCharCode(Icons.details.codePoint),
style: TextStyle(
fontFamily: Icons.details.fontFamily,
package: Icons.details.fontPackage,
fontSize: 24.0,
color: Colors.black
),
);
Le code source de Dart/Flutter est remarquablement accessible, je recommande fortement de creuser un peu!