Как мне настроить DropdownButtons и DropdownMenuItems во Flutter?

По умолчанию DropdownButton с DropdownMenuItems возвращает светло-серый раскрывающийся список. Как мне настроить раскрывающийся список (например, цвет фона, ширину раскрывающегося списка)? Я могу изменить свойство style как в DropdownButton, так и в DropdownMenuItem, например:

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

но это не меняет цвет фона раскрывающегося списка.

Следует ли мне скопировать DropdownMenu и расширить его? Планирует ли Flutter добавить настройку для этого виджета в ближайшем будущем?


person Mary    schedule 02.10.2017    source источник


Ответы (8)


Как сказал Коллин, ваш DropdownMenuItem будет следить за вашим классом ThemeData. Не только его backgroundColor будет соответствовать canvasColor в вашем ThemeData классе, но также он будет следовать тому же TextStyle.

Итак, для быстрого примера:

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

Кроме того, если вы хотите управлять width меню, вы можете скормить его свойству child новый Container и добавить желаемый width, проверить следующий GIF, я начал с width: 100.0, затем перезагрузил его после изменения на 200.0, обратите внимание, как width был изменен, просто убедитесь, что вы используете подходящую ширину, чтобы у вас не возникло проблем с переполнением позже, когда вы будете использовать меню в более сложном макете.

введите описание изображения здесь

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)
      ),
    );
  }
}
person Shady Aziza    schedule 02.10.2017
comment
Знаете ли вы, есть ли способ переопределить отступ (слева и справа) для каждого DropdownMenuItem? ThemeData не имеет свойства padding. Я попытался установить отрицательное значение для поля DropdownMenuItem, но это не разрешено. Спасибо! - person Mary; 03.10.2017
comment
@Mary ThemeData - это визуальные эффекты (раскраска, стилизация текста и т. Д.), А не позиционирование. Я считаю, что вы хотите центрировать свои элементы в раскрывающемся списке, поэтому все, что вам нужно сделать, это заключить виджет Text в ответ в виджет Center. Однако, если вам нужно настроить расположение элементов так, чтобы они не были по центру, вам нужно будет обернуть виджет Text внутри Row, который заключен внутри виджета Padding, а затем настроить свойство padding по своему усмотрению. - person Shady Aziza; 03.10.2017
comment
Вы также можете заменить Row в предыдущем комментарии на Container, и вы получите тот же результат, если что-то неясно, пожалуйста, дайте мне знать. - person Shady Aziza; 03.10.2017

Этого можно добиться, заключив DropdownButton в _ 2_ и переопределение виджета _ 3_.

скриншот

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;
              });
            },
          ),
        ),
      ),
    );
  }
}
person Collin Jackson    schedule 02.10.2017
comment
Спасибо. Я застрял на этом, пока не нашел этот ответ! - person Deborah; 09.11.2017
comment
Спасибо за обходной путь. Похоже, это было проблемой какое-то время: github.com/flutter/flutter/issues/17414 - person Wak; 11.01.2019
comment
вы также можете сделать data: ThemeData.dark(), в теме, и это позволит вам получить белый / темный раскрывающийся список или данные: ThemeData.light () - person Zuriel; 08.04.2019

Мне удалось изменить фон для раскрывающегося списка, заключив его в Container с набором свойств color.

До:

введите описание изображения здесь

После:

введите описание изображения здесь

Вот код:

Container(
  padding:
      EdgeInsets.symmetric(horizontal: 10, vertical: 5),
  decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.circular(10)),

  // dropdown below..
  child: DropdownButton<String>(
      value: dropdownValue,
      icon: Icon(Icons.arrow_drop_down),
      iconSize: 42,
      underline: SizedBox(),
      onChanged: (String newValue) {
        setState(() {
          dropdownValue = newValue;
        });
      },
      items: <String>[
        'One',
        'Two',
        'Three',
        'Four'
      ].map<DropdownMenuItem<String>>((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList()),
)
person FloatingRock    schedule 09.02.2020
comment
Это лучший пример того, что я ищу - person Rahul Kushwaha; 25.02.2021

Если вы хотите, чтобы DropdownButton заполнял пространство, в котором он находится, используйте свойство isExpanded и установите для него значение true.

DropdownButton<String>(
   isExpanded: true,
)
person TuMahler    schedule 13.03.2020
comment
Не имеет отношения к вопросу. - person ManiKandan Selvanathan; 11.04.2020
comment
Я обернул раскрывающуюся кнопку контейнером и установил цвет контейнеров - person Golden Lion; 01.07.2020
comment
Спасибо. Я искал это. - person ARIJEET CHAKRABORTY; 09.07.2021

В последней версии Flutter можно сделать что-то очень простое.

Класс DropdownButton имеет встроенную переменную dropdownColor, которой можно напрямую присвоить любой цвет, без изменения каких-либо ThemeData. Также автоматически меняет цвет элементов раскрывающегося меню.

person Adhokshaja Madhwaraj    schedule 21.06.2020

Используйте это для цвета

 DropdownButtonFormField(
              items: null,
              onChanged: null,
              dropdownColor: Colors.red,
            ),
person Abir Ahsan    schedule 17.02.2021

Вы можете обернуть его таким контейнером:

Container(
  margin: const EdgeInsets.all(15.0),
  padding: const EdgeInsets.only(left: 10.0, right: 10.0),
  decoration: BoxDecoration(
      color: Colors.white,
      border: Border.all(color: Colors.white)
  ),
  child: DropdownButton(
    dropdownColor: Colors.white,
    style: TextStyle(
      color: Colors.black,
      backgroundColor: Colors.white,
    ),
    value: 'ar',
    items: [
      DropdownMenuItem(child: Text('English'), value: 'en'),
      DropdownMenuItem(child: Text('العربية'), value: 'ar'),
    ],
  ),
)

Выход:

введите описание изображения здесь

person AnasSafi    schedule 06.06.2021

Как мне настроить DropdownButtons и DropdownMenuItems во Flutter?

Container(
   child: DropdownButtonHideUnderline(
      child: DropdownButton(
         value: _value,
         icon: Icon(Icons.arrow_drop_down,color: Colors.white,),
         dropdownColor: Colors.redAccent,
         iconSize: 22,
         items: [
            DropdownMenuItem(
               child: Text(
                  Employees by Gender",
                  style: GoogleFonts.dosis(
                     fontSize: 10,
                     color: Colors.black54
                  ),
               ),
               value: 1,
            ),
            DropdownMenuItem(
               child: Text(
                  Employees by Attendance",
                  style: GoogleFonts.dosis(
                     fontSize: 10,
                     color: Colors.black54
                  ),
               ),
               value: 2,
            ),  
         ],
         onChanged: (value) {
            setState(() {
               _value = value;
            });
         })),
)
person Ali Raza Khan    schedule 01.06.2021