flutter - 将 TextFormField 内的 Flutter DropdownButton 作为前缀
问题描述
根据标题,我想在DropdownButton
内部添加一个TextFormField
as prefix
(或prefixIcon
?)。文本字段用于金额,下拉菜单用于其货币。
我直接的方法在视觉上有效,但我无法点击下拉列表来显示列表。每次我点击它时,它都会显示(并立即隐藏)文本字段本身的键盘。
怎么做?
TextFormField(
initialValue: '10.00',
decoration: InputDecoration(
prefix: DropdownButtonHideUnderline(
child: DropdownButton(
items: CURRENCY_CODES,
onChanged: _onCurrencyChanged,
value: _currency,
),
),
),
),
解决方案
问题
当您点击Widget
包含的 onprefix
时,TextFormField
将聚焦并出现键盘。但由于Widget
是 a DropdownButton
,当DropdownItems
显示 键盘被关闭时,奇怪的DropdownItems
是 也被关闭了。
如果您尝试使用PopupMenuButton
而不是DropdownButton
,则会发生类似的事情:显示键盘然后关闭,但在这种情况下PopupMenuItems
不会关闭。为此,我可以使用焦点侦听器和标志来解决此问题,但这并不好。
解决方案
采取另一种方法,一种方法可能是将 aContainer
与您想要的装饰一起使用,包装Row
包含DropdownButton
/PopupMenuButton
和TextFormField
.
实施
如果您使用DropdownButton
,当您聚焦TextFormField
,然后点击DropdownButton
,键盘将被关闭,奇怪的DropdownItems
是 也被关闭。这是一个未解决的问题:DropdownButton bad behavior when taped and keyboard is displayed
如果您使用 a PopupMenuButton
,您可以执行以下操作:
Wrap(
children: <Widget>[
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16.0),
boxShadow: [BoxShadow()],
),
child: Row(
children: <Widget>[
PopupMenuButton(
onSelected: (c) {},
child: Row(
children: <Widget>[
Text(_currency),
Icon(Icons.arrow_drop_down)
],
),
itemBuilder: (context) => CURRENCY_CODES
.map((c) => PopupMenuItem(value: c, child: Text(c)))
.toList(),
),
Flexible(
child: TextFormField(),
),
],
),
),
],
)
推荐阅读
- c# - 在 ComboBox WPF 中显示初始值
- python - 您如何以编程方式创建 Google BigQuery 架构来创建表?
- ios - 使用 AVAudioSession 更改音频输入源会导致崩溃
- sql - 选择在 SQL 中组合有 10 名或更多学生和教师的城市
- angular - Angular HTTP Service 返回结果埋在一个对象中,如何添加类型?
- user-interface - 如何在剑道网格中设置默认文本=“在此处搜索”占位符
- alamofire - 上传多部分文件完成块
- mvvmcross - mvvmcross - 如何为多个 ViewModel 实现单个视图或为多个视图实现单个 ViewModel
- reactjs - 无法在 React Native 应用程序中使用 React.memo
- android - 如何摆脱每个项目末尾的“TextView”?