Центрирование выбранного значения выпадающей кнопки

#flutter #dropdownbutton

#flutter #выпадающая кнопка

Вопрос:

Я могу центрировать текстовые элементы, используемые в DropdownMenuItem s, предоставленные для DropDownButton , но как выбранный элемент может быть центрирован, когда меню закрыто?

Ответ №1:

Это сработало для меня:

 List<String> targetOptions = ['No target', '1', '2', '3', '4']; 



 return DropdownButton<String>(
                        value: target,
                        selectedItemBuilder: (BuildContext context) {
                          return targetOptions.map<Widget>((String item) {
                            return SizedBox(width: 70, child: Center(child: Text(item, style: TextStyle(color: Colors.white))));
                          }).toList();
                        },
                        items: targetOptions.map((String value) {
                          return new DropdownMenuItem<String>(
                            value: value == 'No target' ? '0' : value,
                            child: Center(
                              child: new Text(
                                value,
                                style: TextStyle(color: Colors.white),
                              ),
                            ),
                          );
                        }).toList(),
                        onChanged: (val) {
                          SettingManager.put(SettingManager.SETTING_DAILY_TARGET, val);
                          setState(() {
                            target = val;
                          });
                        },
                      )
  

Ответ №2:

Что-то вроде этого:

           DropdownMenuItem<int>(
            value: model.id,
            child: SizedBox(
              width: width,
              child: Text(
                model.toString(),
                textAlign: TextAlign.center, //this will do that
              ),
            ),
          )
  

Комментарии:

1. Примечание: Текст должен иметь контейнер фиксированной ширины для выравнивания по центру.

2. OP попросил центрировать элементы, когда он закрыт, ваш ответ этого не делает.

Ответ №3:

Я использую что-то вроде этого:

 String dropdownValue = 'One';

DropdownButton<String>(
          value: dropdownValue,
          onChanged: (String newValue) {
            setState(() {
              dropdownValue = newValue;
            });
          },
          items: <String>['One', 'Two', 'three', 'Four'].map((item) {
            return DropdownMenuItem<String>(
                value: item,
                child: Builder(builder: (BuildContext context) {
                  final bool isDropDown = context.ancestorStateOfType(TypeMatcher<_MyAppState>()) == null;
                  if (!isDropDown) {
                    return Center(child: Text(item), widthFactor: 2,);
                  } else {
                    return Text(item);
                  }
                },)
            );
          }).toList(),
        ),
  

Ответ №4:

Вы можете сделать это, обернув свой DropdownMenuItem дочерний Text элемент в a Container и предоставив его width вместе с alignment .

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

 int _value = 0;

Widget _buildDropdown() {
  return DropdownButton(
    value: _value,
    items: [
      DropdownMenuItem(
        value: 0,
        child: Container(
          child: Text("Zero"),
          width: 200,
          alignment: Alignment.center,
        ),
      ),
      DropdownMenuItem(
        value: 1,
        child: Container(
          child: Text("One"),
          width: 200,
          alignment: Alignment.center,
        ),
      ),
    ],
    onChanged: (value) => setState(() => _value = value),
  );
}
  

Комментарии:

1. Это работает, но жестко заданная ширина не будет работать как решение общего назначения.

2. @AlanKley согласился, но на данный момент нет никакого способа сделать это, кроме как присвоить ему жестко заданную ширину или полную ширину экрана.