76 votes

flutter - Comment créer un bouton en relief avec un fond en dégradé ?

Existe-t-il un moyen de changer la couleur d'arrière-plan du bouton en relief en un dégradé ? Sinon, comment puis-je réaliser quelque chose comme ça ?

0 votes

Par le passé, j'ai eu des difficultés à ajouter un dégradé d'arrière-plan à une zone d'éclaboussures d'encre. Le dégradé finit par cacher les éclaboussures. Souhaitez-vous simplement avoir un dégradé ou un dégradé avec un effet d'éclaboussure ? (pour ce qui est d'un bouton avec une élévation, un rayon de bordure et un dégradé, oui, c'est possible).

0 votes

@AshtonThomas Comme vous l'avez dit, le dégradé cache la tâche d'encre. Cela est dû au fait que la tâche d'encre a besoin d'un widget Material comme parent. J'ai eu la même situation. J'ai donc fini par créer mon propre bouton personnalisé.

0 votes

J'ai essayé l'idée du bouton personnalisé et je n'arrive pas à mettre en place l'animation de l'ombre que le bouton en relief par défaut a ! Pourriez-vous m'aider ?

99voto

bonnyz Points 86

Toutes les solutions ci-dessus ne fonctionnent pas vraiment sans quelques artefacts ou problèmes mineurs (par exemple, l'absence d'effet d'ondulation, des bordures indésirables, le non-respect de la charte du thème, etc. minWidth pour les boutons).

Le site La solution ci-dessous ne présente aucun des problèmes ci-dessus (la partie critique est d'utiliser le Ink pour conserver les capacités d'ondulation sur le gradient) :

RaisedButton(
  onPressed: () { },
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)),
  padding: const EdgeInsets.all(0.0),
  child: Ink(
    decoration: const BoxDecoration(
      gradient: myGradient,
      borderRadius: BorderRadius.all(Radius.circular(80.0)),
    ),
    child: Container(
      constraints: const BoxConstraints(minWidth: 88.0, minHeight: 36.0), // min sizes for Material buttons
      alignment: Alignment.center,
      child: const Text(
        'OK',
        textAlign: TextAlign.center,
      ),
    ),
  ),
)

enter image description here

3 votes

RaisedButton est maintenant déprécié. Utilisez ElevatedButton solution

0 votes

J'ai utilisé cette solution sur MaterialButton et cela fonctionne parfaitement !

71voto

Vamsi Krishna Points 13206

Vous pouvez créer vous-même un modèle personnalisé

class RaisedGradientButton extends StatelessWidget {
  final Widget child;
  final Gradient gradient;
  final double width;
  final double height;
  final Function onPressed;

  const RaisedGradientButton({
    Key key,
    @required this.child,
    this.gradient,
    this.width = double.infinity,
    this.height = 50.0,
    this.onPressed,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: width,
      height: 50.0,
      decoration: BoxDecoration(gradient: gradient, boxShadow: [
        BoxShadow(
          color: Colors.grey[500],
          offset: Offset(0.0, 1.5),
          blurRadius: 1.5,
        ),
      ]),
      child: Material(
        color: Colors.transparent,
        child: InkWell(
            onTap: onPressed,
            child: Center(
              child: child,
            )),
      ),
    );
  }
}

Et utilisez-le partout comme suit :

RaisedGradientButton(
  child: Text(
    'Button',
    style: TextStyle(color: Colors.white),
  ),
  gradient: LinearGradient(
    colors: <Color>[Colors.green, Colors.black],
  ),
  onPressed: (){
    print('button clicked');
  }
),

Custom button

Vous pouvez encore jouer avec l'ombre et les bords arrondis en modifiant la propriété de décoration du conteneur jusqu'à ce qu'elle corresponde à vos spécifications.

0 votes

En fait, je veux que l'ombre soit exactement comme le bouton en relief par défaut et je n'ai pas pu implémenter cela.

0 votes

Vamsi, @MoeinHosseini, essayez d'utiliser l'ajout d'un elevation au matériau plutôt qu'une ombre

16voto

Krishna Lohiya Points 11

Voir ci-dessous -

RaisedButton(
     onPressed: () {},
     textColor: Colors.white,
     padding: const EdgeInsets.all(0.0),
     shape:RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)),
     child: Container(
       decoration: const BoxDecoration(
         gradient: LinearGradient(
           colors: <Color>[
             Color(0xFF0D47A1),
             Color(0xFF1976D2),
             Color(0xFF42A5F5),
           ],
         ),
         borderRadius: BorderRadius.all(Radius.circular(80.0))
       ),
       padding: const EdgeInsets.fromLTRB(20, 10, 20, 10),
       child: const Text(
           'Gradient Button',
           style: TextStyle(fontSize: 20)
       ),
     ),
   )

9voto

Shyju Madathil Points 582

Gradient est disponible dans le magasin de pubs et supporte quelques gradients prédéfinis.

Vous pouvez créer le bouton de gradient comme

GradientButton(
                 child: Text('Gradient'),
                 callback: () {},
                 gradient: Gradients.backToFuture,
           ),

Le paquet contient GradientCard, GradientProgressIndicator, GradientButton, CircularGradientButton et GradientText.

Widgets en dégradé

8voto

ldalonzo Points 523

La documentation sur l'API de Flutter contient un exemple de la façon de rendre une RaisedButton avec fond dégradé - voir ici https://api.flutter.dev/flutter/material/RaisedButton-class.html

Widget gradientButton = Container(
  child: RaisedButton(
    onPressed: () { },
    textColor: Colors.white,
    padding: const EdgeInsets.all(0.0),
    child: Container(
      width: 300,
      decoration: new BoxDecoration(
        gradient: new LinearGradient(
          colors: [
            Color.fromARGB(255, 148, 231, 225),
            Color.fromARGB(255, 62, 182, 226)
          ],
        )
      ),
      padding: const EdgeInsets.all(10.0),
      child: Text(
        "Gradient Button",
        textAlign: TextAlign.center,
      ),
    ),
  ),
);

Gradient Button

1 votes

Question sans rapport avec le sujet. Quelle police utilisez-vous avec ce bouton ?

3 votes

@AsyrafDayan Montserrat

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