我想将DropdownButton
旁边的TextField
垂直对齐。
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
DropdownButton<String>(
...
),
Flexible(
child: TextField(
...
),
),
],
)
当前行为是:
如您所见,底线不对齐。我猜这是由于高度不同而发生的。解决该问题的最佳做法是什么? (我猜不是使用固定高度)
我的最终目标是这样的:
DropdownButton
和TextField
的行和文本都垂直对齐。
答案 0 :(得分:2)
希望这会有所帮助,但我能正常工作!对我有用的关键道具是将行中的小部件的contentPadding
设置为0.0
Row(
children: <Widget>[
Flexible(
flex: 2,
child: TextFormField(
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly
],
decoration: InputDecoration(
labelText: 'Width',
contentPadding: EdgeInsets.all(0.0),
),
onChanged: (String newValue) {
_stashItem.width = "$newValue $_widthUnit";
},
)),
Flexible(
flex: 1,
child: DropdownButtonFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.all(0.0)
),
value: _widthUnit,
items: ['cm', 'm', 'in', 'ft', 'yd']
.map((String unit) =>
DropdownMenuItem<String>(
value: unit, child: Text(unit)))
.toList(),
onChanged: (value) => setState(() {
_widthUnit = value;
})),
)
],
),
答案 1 :(得分:1)
尝试一下:
Container(
decoration: BoxDecoration(
border: Border(
//TODO: Customize the underline here
bottom: BorderSide(
color: Colors.white70,
width: 0.5,
),
),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
DropdownButton<String>(
onChanged: (c) {},
underline: Container(),
items: [
DropdownMenuItem<String>(
child: Text('Email'),
)
],
),
Flexible(
child: TextField(
decoration: InputDecoration(
border: InputBorder.none,
),
),
),
],
),
),
答案 2 :(得分:0)
我不确定该解决方案是否对您有帮助,但我认为它比使用row
更好。
TextField(
decoration: InputDecoration(
prefix: DropdownButton(underline: Container(), ...)
),
)
答案 3 :(得分:0)
尝试一下:
Row(
Row(mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end
children: <Widget>[
Expanded(
flex: 1
child: ButtonTheme(
alignedDropdown: true,
child: DropdownButton<String>(
...
))),
Expanded(
flex: 6
child: TextField(
...
),
),
],
)
答案 4 :(得分:0)
我最终编辑了TextField
内容的填充,并使用CrossAxisAlignment.center
代替了CrossAxisAlignment.start
:
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
DropdownButton<String>(
...
),
Flexible(
child: TextField(
decoration: InputDecoration(
contentPadding: EdgeInsets.all(6.0),
),
),
),
],
)
结果:
(由于添加了SizedBox,您会看到它们之间的空间)
答案 5 :(得分:0)
有点晚了,但是尽管布局略有不同,我还是遇到了同样的问题:
TextFormField
而不是TextField
。DropdownButtonFormField
而不是DropDownButton
。Flexible
中的Row
小部件中,其中mainAxisSize
设置为MainAxisSize.min
。话虽如此,将crossAxisAlignment
设置为CrossAxisAlignment.end
对我来说是有效的。
尝试一下:
Row(
mainAxisSize: MainAxisSize.min, // see 3
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Flexible( // see 3
child: DropdownButtonFormField<String>( // see 2
...
),
),
Flexible(
child: TextFormField( // see 1
...
),
),
],
)
答案 6 :(得分:-1)
您可以简单地在 InputDecoration
的 DropdownButtonFormField
中减少 contentPadding