2017-10-02 2 views
2

La valeur par défaut DropdownButton avec DropdownMenuItems renvoie une liste déroulante gris clair. Comment dois-je personnaliser la liste déroulante (par exemple, la couleur d'arrière-plan, la largeur de la liste déroulante)? Je peux changer la propriété style dans les deux DropDownButton et DropdownMenuItem, comme ceci:Comment personnaliser DropdownButtons et DropdownMenuItems dans Flutter?

return new DropdownButton(
     value: ..., 
     items: ..., 
     onChanged: ..., 
     style: new TextStyle(
     color: Colors.white, 
    ), 
    ); 

mais cela ne change pas la couleur d'arrière-plan de la liste déroulante.

Dois-je copier DropdownMenu et l'étendre? Est-ce que Flutter prévoit ajouter de la personnalisation pour ce widget dans un proche avenir?

Répondre

1

Comme dit Collin, votre DropdownMenuItem suivra votre classe ThemeData. Non seulement son backgroundColor correspondra au canvasColor dans votre classe ThemeData, mais il suivra le même TextStyle.

Ainsi, pour un exemple rapide:

new ThemeData(
     fontFamily: "Encode Sans", //my custom font 
     canvasColor: _turquoise, //my custom color 
//other theme data) 

De plus, si vous souhaitez contrôler la width du menu, vous pouvez nourrir sa child propriété un nouveau Container et ajoutez le choix width, vérifiez le GIF suivant , J'ai commencé avec width: 100.0 puis rechargé à chaud après l'avoir changé en 200.0, remarquez comment la width a été manipulée, assurez-vous simplement d'utiliser une largeur appropriée pour ne pas avoir de problèmes de débordement plus tard lorsque vous utilisez le menu dans une mise en page plus complexe.

enter image description here

class TestPage extends StatelessWidget { 
    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(
     title:new Text ("Test"), 
    ), 
     body: new Center(
     child: new DropdownButton(items: new List.generate(20, (int index){ 
      return new DropdownMenuItem(child: new Container(
      child: new Text ("Item#$index"), 
      width: 200.0, //200.0 to 100.0 
     )); 
     }) 
      , onChanged: null) 
    ), 
    ); 
    } 
} 
+0

Savez-vous s'il existe un moyen de remplacer le remplissage (gauche et droite) pour chaque DropdownMenuItem? La propriété ThemeData n'a pas de propriété 'padding'. J'ai essayé de définir le remplissage de mon DropdownMenuItem à négatif, mais ce n'est pas autorisé. Merci! – Mary

+0

@Mary 'ThemeData' est sur les visuels (coloration, style de texte .. etc) et non sur le positionnement. Je crois que vous voulez centrer vos éléments dans la liste déroulante, donc tout ce que vous devez faire est d'envelopper le widget 'Text' dans la réponse dans un widget' Center'. Cependant, si vous avez besoin de personnaliser le positionnement des objets de manière à ce qu'ils ne soient pas centrés, vous devez placer le widget 'Text' dans une' Row' qui est enveloppée dans un widget 'Padding', puis personnaliser le' padding 'propriété que vous voulez. – aziza

+0

Vous pouvez remplacer le 'Row' dans le commentaire précédent par un' Container', et vous obtiendrez le même résultat, s'il y a quelque chose qui n'est pas assez clair, faites le moi savoir. – aziza

3

Vous pouvez accomplir ceci en enveloppant le DropdownButton dans un widget Theme et en remplaçant le canvasColor.

screenshot

import 'package:flutter/material.dart'; 

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

class MyApp extends StatelessWidget { 
    @override 
    Widget build(BuildContext context) { 
    return new MaterialApp(
     home: new MyHomePage(), 
    ); 
    } 
} 

class MyHomePage extends StatefulWidget { 
    State createState() => new MyHomePageState(); 
} 

class MyHomePageState extends State<MyHomePage> { 
    int _value = 42; 

    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     body: new Center(
     child: new Theme(
      data: Theme.of(context).copyWith(
      canvasColor: Colors.blue.shade200, 
     ), 
      child: new DropdownButton(
      value: _value, 
      items: <DropdownMenuItem<int>>[ 
       new DropdownMenuItem(
       child: new Text('Foo'), 
       value: 0, 
      ), 
       new DropdownMenuItem(
       child: new Text('Bar'), 
       value: 42, 
      ), 
      ], 
      onChanged: (int value) { 
       setState(() { 
       _value = value; 
       }); 
      }, 
     ), 
     ), 
    ), 
    ); 
    } 
} 
+0

Merci. J'étais coincé dessus jusqu'à ce que je trouve cette réponse! – Deborah