A Detailed Guide to the Flutter Dropdown Widget

A Detailed Guide to the Flutter Dropdown Widget

In Flutter, creating a dropdown menu is an essential part of many user interfaces. Dropdowns allow users to select an option from a list, and they're widely used for selecting items from predefined lists, filtering options, and settings selection. Flutter provides a DropdownButton widget to handle this functionality with ease.

What is the DropdownButton Widget?

The DropdownButton widget in Flutter is a Material Design widget that allows users to select a single item from a list of items. It displays the currently selected item and a button that opens a menu of other options when tapped.

Basic Example

DropdownButton<String>(
  value: selectedValue,
  onChanged: (String? newValue) {
    setState(() {
      selectedValue = newValue!;
    });
  },
  items: <String>['One', 'Two', 'Three', 'Four']
      .map<DropdownMenuItem<String>>((String value) {
    return DropdownMenuItem<String>(
      value: value,
      child: Text(value),
    );
  }).toList(),
)

Properties of DropdownButton

Let's break down the key properties of the DropdownButton widget and explore how to use them.

1. value

The value property holds the current selected value in the dropdown. This is typically a variable in your state, which represents the selected item. The DropdownButton will display the item corresponding to this value.

  • Type: T? (nullable type, meaning it can be null initially).

  • Required? Yes.

String? selectedValue = 'One';

2. onChanged

The onChanged property is a callback function that is triggered when the user selects an item from the dropdown. The function receives the new value as a parameter, allowing you to update the selected value.

  • Type: ValueChanged<T?>? (a function that takes the selected value as a parameter).

  • Required? Yes (but can be null if the dropdown is disabled).

Example:

onChanged: (String? newValue) {
  setState(() {
    selectedValue = newValue!;
  });
}

If you want to disable the dropdown, simply set onChanged to null:

onChanged: null, // Disables the dropdown

3. items

The items property is a list of DropdownMenuItem widgets that define the options the user can select from. Each DropdownMenuItem contains a value and a child widget (usually a Text widget).

  • Type: List<DropdownMenuItem<T>>

  • Required? Yes.

Example:

items: <String>['One', 'Two', 'Three']
    .map<DropdownMenuItem<String>>((String value) {
  return DropdownMenuItem<String>(
    value: value,
    child: Text(value),
  );
}).toList(),

Here, we map each value to a DropdownMenuItem, which is required to provide both a value (the actual data) and a child (a widget to display).

4. hint

The hint property is displayed when no item has been selected yet. It’s often used for guiding the user or showing a placeholder text like "Select an option".

  • Type: Widget?

  • Required? No.

Example:

hint: Text('Select a number'),

5. icon

The icon property defines the widget that appears as the dropdown’s indicator (the little arrow). By default, this is an arrow pointing down, but you can customize it with any widget you like.

  • Type: Widget

  • Required? No.

Example:

icon: Icon(Icons.arrow_drop_down),

You can change this to any icon or even a custom widget.

6. isExpanded

The isExpanded property determines whether the dropdown should expand to take up the full width of the parent container. By default, the dropdown will only take up as much space as its content. Setting isExpanded: true will make the dropdown take up the full width of its parent widget.

  • Type: bool

  • Required? No.

Example:

isExpanded: true, // Ensures the dropdown takes up the full width

7. underline

The underline property controls the appearance of the line below the dropdown button. By default, a thin line is shown under the dropdown button, but you can customize this or remove it by setting this property to a different widget.

  • Type: Widget

  • Required? No.

Example:

underline: Container(), // Removes the underline

You can also customize the underline to create a styled border.

8. style

The style property is used to define the text style of the selected value displayed in the dropdown button. This is a TextStyle widget, where you can set properties like font size, color, weight, etc.

  • Type: TextStyle?

  • Required? No.

Example:

style: TextStyle(color: Colors.blue, fontSize: 18),

9. dropdownColor

The dropdownColor property allows you to change the background color of the dropdown menu when it is opened. This can be useful for visual distinction between the dropdown and the rest of the UI.

  • Type: Color?

  • Required? No.

Example:

dropdownColor: Colors.yellow,

10. elevation

The elevation property controls how "raised" the dropdown menu looks. A higher value will make the dropdown appear more raised, while a lower value will make it flatter. This is essentially a shadow effect.

  • Type: double?

  • Required? No.

Example:

elevation: 8.0, // Adds shadow to the dropdown

11. isDense

The isDense property helps to reduce the vertical space in the dropdown. When set to true, it makes the dropdown items appear closer together, which can be useful for compact UIs.

  • Type: bool

  • Required? No.

Example:

isDense: true, // Reduces the vertical space between items

12. focusColor

The focusColor property changes the color of the dropdown button when it is focused, such as when it is tapped or clicked.

  • Type: Color?

  • Required? No.

Example:

focusColor: Colors.green,

Complete Example

import 'package:flutter/material.dart';

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

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

class DropdownExample extends StatefulWidget {
  @override
  _DropdownExampleState createState() => _DropdownExampleState();
}

class _DropdownExampleState extends State<DropdownExample> {
  String? selectedValue = 'One';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Flutter Dropdown Example')),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            DropdownButton<String>(
              value: selectedValue,
              onChanged: (String? newValue) {
                setState(() {
                  selectedValue = newValue;
                });
              },
              items: <String>['One', 'Two', 'Three', 'Four']
                  .map<DropdownMenuItem<String>>((String value) {
                return DropdownMenuItem<String>(
                  value: value,
                  child: Text(value),
                );
              }).toList(),
              hint: Text('Select an option'),
              icon: Icon(Icons.arrow_drop_down),
              isExpanded: true,
              style: TextStyle(color: Colors.blue, fontSize: 18),
              dropdownColor: Colors.yellow,
              elevation: 8.0,
              isDense: true,
            ),
          ],
        ),
      ),
    );
  }
}

Conclusion

The DropdownButton widget in Flutter is a powerful and flexible tool for displaying a list of items for selection. It allows for various customizations such as changing the icon, the background color, adding a hint, and much more. By understanding these properties, you can easily build dropdown menus that fit the design requirements of your app.

To sum up, here’s a quick recap of the key properties:

  • value: The currently selected item.

  • onChanged: The callback that handles selection changes.

  • items: The list of options to display.

  • hint: A placeholder text shown when nothing is selected.

  • icon: The indicator icon for the dropdown.

  • isExpanded: Controls whether the dropdown takes full width.

  • underline: Customizes the line under the dropdown button.

  • style: Styles the selected item text.

  • dropdownColor: Customizes the background color of the dropdown menu.

  • elevation: Controls the shadow under the dropdown menu.

  • isDense: Reduces the vertical space between items.

With these properties in hand, you should be able to create dynamic and user-friendly dropdowns in your Flutter applications.

Happy coding 😊

Did you find this article valuable?

Support Flutter Blogs by becoming a sponsor. Any amount is appreciated!