在文本输入上,使用Flutter的TextFormField实现水平滚动

16 浏览
0 Comments

在文本输入上,使用Flutter的TextFormField实现水平滚动

当我在输入文本字段时,如果我写的文本超过了输入框的宽度,剩下的文本就会无法显示。有没有办法在我输入文本时实现水平滚动呢?

下图描述了我想要的行为。

[![HorizontalScroll in TextFormField](https://i.stack.imgur.com/ReAyK.gif)](https://i.stack.imgur.com/ReAyK.gif)

编辑:我的代码

Container(

width: 270,

height: 42,

child: new TextFormField(

validator: (val) => val.isEmpty ? '请输入电子邮件' : null,

decoration: new InputDecoration(

icon: Icon(

Icons.email_outlined,

),

labelText: '电子邮件',

border: new OutlineInputBorder(

borderRadius: new BorderRadius.circular(25.0),

borderSide: new BorderSide(),

),

),

keyboardType: TextInputType.emailAddress,

onChanged: (val) {

setState(() => email = val);

},

),

),

当我输入超过TextFormField的宽度时,会发生以下情况:

[![当我输入超过TextFormField的宽度时,会发生以下情况](https://i.stack.imgur.com/VZxhK.png)](https://i.stack.imgur.com/VZxhK.png)

0
0 Comments

问题的出现原因:TextFormField中的输入文本内容过长时,水平滚动条没有显示,导致部分文本被截断。

解决方法:有两种方法可以解决这个问题。

方法一:添加isDense属性到TextFormField中,并设置为true。这样做可以修复问题,但是仍然无法显示那些低于字体基线的字符(如逗号、分号等)。

方法二:使用contentPadding属性,因为isDense实际上是修改了contentPadding属性的值。根据源代码,isDense的实际代码如下所示。可以通过设置contentPadding属性的值来解决问题。

根据上述代码,最佳配置似乎是:

Container(

width: 270,

height: 42,

child: TextFormField(

textAlignVertical: TextAlignVertical.center,

validator: (val) => val!.isEmpty ? 'Enter an email' : null,

decoration: InputDecoration(

contentPadding: EdgeInsets.fromLTRB(12.0, 8.0, 12.0, 8.0),

icon: Icon(

Icons.email_outlined,

),

labelText: 'Email',

border: OutlineInputBorder(

borderRadius: BorderRadius.circular(25.0),

borderSide: BorderSide(),

),

),

keyboardType: TextInputType.emailAddress,

onChanged: (val) {

setState(() => email = val);

},

),

)

上述代码可以解决该问题,但如果字体高度发生变化,可能会引起其他问题。

0