How to center text in DropdownButton?

Viewed 8546

I'm trying to make the DropdownButton hint, text and menu items appear in the center instead of left but TextAlign.center does not seem to be doing anything.

Image of Dropdown with the hint:

enter image description here

Image of Dropdown with the selected item as text:

enter image description here

Image of the Menu items when arrow is pressed:

enter image description here

My code:

return Theme(
  data: ThemeData(canvasColor: blackTrans2, brightness: Brightness.dark),
  child:Container(
    width: MediaQuery.of(context).size.width/1.2,
    decoration: BoxDecoration(
    color: blackTrans,
    borderRadius: BorderRadius.all(Radius.circular(5.0)),
    ),   
    child:DropdownButtonHideUnderline(
      child: ButtonTheme(
        alignedDropdown: true,
        child: DropdownButton(
          value: _dateSelected,
          hint: AutoSizeText(NA_FLIGHT_PAGE_DROPDOWN, style: TextStyle(color: white,),textAlign: TextAlign.center,),
          isDense: false,
          onChanged: (String newValue){
            setState(() {
            _dateSelected = newValue;
            });
          },
          items: snapshot.data.documents.map((DocumentSnapshot document){
            return DropdownMenuItem<String>(
              value: document.documentID,
              child: AutoSizeText(document.documentID, style: TextStyle(color: white,),textAlign: TextAlign.center,),
            );
          }).toList(),
        ),
      ),
    )
  )
);

Not sure if this affects anything but I'm using AutoSizeText in order to resize my text dynamically.

Update: I managed to make the Menu items appear in the center by using Center, but the text and hint is still remains to the left tho even with Center... :

// Does not seem to change the hint or text position (when menu item selected)
hint: Center(child:AutoSizeText(NA_FLIGHT_PAGE_DROPDOWN, style: TextStyle(color: white,),textAlign: TextAlign.center,)),

// Changes the menu item to the center instead of left
child: Center(child:AutoSizeText(document.documentID, style: TextStyle(color: white,),textAlign: TextAlign.center,)),
4 Answers

For those who are seeing option to change flutter class dropdown.dart. You don't need to do that. Do this:

  1. set property isExpanded to true
  2. use Center widget with DropdownMenuItem class children.

IsExpanded will also take care of overflow.

DropdownButton(
     isExpanded: true,
     value: category_selected,
     items: categories.map<DropdownMenuItem<String>>((var value) {
        return DropdownMenuItem<String>(
          value: value["name"],
          child: Center(
                 child: Text(
                        value["name"],
                        textAlign: TextAlign.center,
                      ),
                    ),
                 );
           }).toList(),
      ),

A simple and straight answer is Not Possible. But there's always a way.

You have to go to the dropdown.dart provided with the flutter package.If you're using VSCode Ctrl+Click on the DrpoDownMenuItem class and change the following code.

@override
  Widget build(BuildContext context) {
    return Container(
      height: _kMenuItemHeight,
      alignment: AlignmentDirectional.centerStart,
      child: child,
    );
  }

Change the alignment: AlignmentDirectional.centerStart to alignment: AlignmentDirectional.center and it should work :)

Yes you can do it like the following code sample.

Container(
              decoration: BoxDecoration(
                  color: Colors.white,
                  borderRadius: BorderRadius.all(Radius.circular(5))),
              margin: EdgeInsets.only(top: 5, bottom: 5),
              padding: EdgeInsets.only(right: 5, left: 5),
              child: ConstrainedBox(
                constraints: const BoxConstraints(
                  minWidth: double.infinity,
                ),
                child: Container(
                  child: Center(
                    child: DropdownButtonHideUnderline(
                      child: DropdownButton(
                        iconSize: 0.0,
                        items: <DropdownMenuItem<int>>[
                          new DropdownMenuItem(
                            child: new Text(
                              'Optional Information',
                              style: TextStyle(color: Colors.black54),
                            ),
                          ),
                          new DropdownMenuItem(
                            child: new Text(
                              'Male',
                              style: TextStyle(color: Colors.black54),
                            ),
                          ),
                          new DropdownMenuItem(
                              child: new Text(
                            'Female',
                            style: TextStyle(color: Colors.black54),
                          )),
                        ],
                        onChanged: (V) {},
                      ),
                    ),
                  ),
                ),
              ),
            ),

Here i have used my color and decoration view for my porpose you can change it as per you requirement.

You can use the code below to perfectly position the text in the dropdown at the center and still have the dropdown icon positioned at the right end of your container.

DropdownButtonHideUnderline(
  child: DropdownButton(
    value: dropdownvalue,
    items: items.map((String items) {
      return DropdownMenuItem(
          value: items,
          child: Center(
            child: Text(items),
          ),
      );
    }).toList(),
    onChanged: (String? newValue) {
      setState(() {
          dropdownvalue = newValue!;
      });
    },
    isExpanded: true,
  ),
),

So we simply add isExpanded: true, and add a Center() widget to the Text(items) in the DropdownMenuItem().

Related