132

如何自定义TextField'swidthheight?

4

17 回答 17

213

要调整宽度,你可以TextField用一个Container小部件包裹你,如下所示:

Container(              
  width: 100.0,
  child: TextField()
)

我不太确定你的高度是什么,TextField但你肯定可以看一下TextStyle小部件,你可以用它来操作fontSize和/或height

Container(              
  width: 100.0,
  child: TextField(                                 
    style: TextStyle(
      fontSize: 40.0,
      height: 2.0,
      color: Colors.black                  
    )
  )
)

请记住,根据对属性本身的评论,heightin是字体大小的乘数:TextStyle

此文本跨度的高度,作为字体大小的倍数。

当 [height] 为 null 或省略时,行高将直接由字体的度量决定,可能与 fontSize 不同。当 [height] 不为 null 时,文本跨度的行高将是 [fontSize] 的倍数,并且恰好是fontSize * height逻辑像素高。

最后但并非最不重要的一点是,您可能想看看您的decoration财产TextField,这为您提供了很多可能性

编辑:如何更改内部填充/边距TextField

你可以玩弄InputDecoration和 的decoration属性TextField。例如,您可以执行以下操作:

TextField(                                
    decoration: const InputDecoration(
        contentPadding: const EdgeInsets.symmetric(vertical: 40.0),
    )
)
于 2018-05-18T01:33:08.610 回答
102

我认为您想更改.TextField

您可以通过添加isDense: truecontentPadding: EdgeInsets.all(8)属性来做到这一点,如下所示:

Container(
  padding: EdgeInsets.all(12),
  child: Column(
    children: <Widget>[
      TextField(
        decoration: InputDecoration(
          border: OutlineInputBorder(),
          labelText: 'Default TextField',
        ),
      ),
      SizedBox(height: 16,),
      TextField(
        decoration: InputDecoration(
          border: OutlineInputBorder(),
          labelText: 'Densed TextField',
          isDense: true,                      // Added this
        ),
      ),
      SizedBox(height: 16,),
      TextField(
        decoration: InputDecoration(
          border: OutlineInputBorder(),
          labelText: 'Even Densed TextFiled',
          isDense: true,                      // Added this
          contentPadding: EdgeInsets.all(8),  // Added this
        ),
      )
    ],
  ),
)

它将显示为:

如何更新 Flutter TextField 的高度和宽度/内部填充?

于 2020-05-07T08:30:40.943 回答
44

截屏:

在此处输入图像描述


Widget _buildTextField() {
  final maxLines = 5;

  return Container(
    margin: EdgeInsets.all(12),
    height: maxLines * 24.0,
    child: TextField(
      maxLines: maxLines,
      decoration: InputDecoration(
        hintText: "Enter a message",
        fillColor: Colors.grey[300],
        filled: true,
      ),
    ),
  );
}
于 2020-02-28T16:14:57.890 回答
15

这个答案有效,但是当输入字段处于错误状态时它会发生冲突,为了更好的方法和更好的控制,您可以使用它。

InputDecoration(
    isCollapsed: true,
    contentPadding: EdgeInsets.all(9),
)
于 2021-03-08T08:30:40.463 回答
8

如果您想在其中键入文本时动态增加TextFormField的高度。maxLines设置为null。喜欢

TextFormField(
          onSaved: (newText) {
            enteredTextEmail = newText;
          },

          obscureText: false,
          keyboardType: TextInputType.emailAddress,
          validator: validateName,
          maxLines: null,
          // style: style,
          decoration: InputDecoration(
              contentPadding: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 10.0),
              hintText: "Enter Question",
              labelText: "Enter Question",
              border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(10.0))),
        ),
于 2021-02-15T08:25:43.633 回答
7

你可以试试中的margin属性ContainerTextField 将内部包裹起来Container并调整margin属性。

new Container(
  margin: const EdgeInsets.only(right: 10, left: 10),
  child: new TextField( 
    decoration: new InputDecoration(
      hintText: 'username',
      icon: new Icon(Icons.person)),
  )
),
于 2019-06-11T04:53:22.747 回答
6

换成宽度TextField_ SizedBox

SizedBox(
  height: 40,
  width: 150,
  child: TextField(),
)
于 2021-02-11T23:26:30.577 回答
3

只需将其包裹起来TextField()SizedBox()给出大小盒子的高度

于 2021-10-20T09:12:49.553 回答
2

如果使用“suffixIcon”折叠 TextField 的高度,请添加:suffixIconConstraints

TextField(
                    style: TextStyle(fontSize: r * 1.8, color: Colors.black87),
                    decoration: InputDecoration(
                      isDense: true,
                      contentPadding: EdgeInsets.symmetric(vertical: r * 1.6, horizontal: r * 1.6),
                      suffixIcon: Icon(Icons.search, color: Colors.black54),
                      suffixIconConstraints: BoxConstraints(minWidth: 32, minHeight: 32),
                    ),
                  )
于 2020-10-09T07:32:20.023 回答
1

使用 contentPadding,它会降低文本框或下拉列表的高度

InputDecorator(
                  decoration: InputDecoration(
                      errorStyle: TextStyle(
                          color: Colors.redAccent, fontSize: 16.0),
                      hintText: 'Please select expense',
                      border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(1.0),
                      ),
                      contentPadding: EdgeInsets.all(8)),//Add this edge option
                  child: DropdownButton(
                    isExpanded: true,
                    isDense: true,
                    itemHeight: 50.0,

                    hint: Text(
                        'Please choose a location'), // Not necessary for Option 1
                    value: _selectedLocation,
                    onChanged: (newValue) {
                      setState(() {
                        _selectedLocation = newValue;
                      });
                    },
                    items: citys.map((location) {
                      return DropdownMenuItem(
                        child: new Text(location.name),
                        value: location.id,
                      );
                    }).toList(),
                  ),
                ),
于 2020-12-28T17:08:06.310 回答
1
int numLines = 0;

Container(
     height: numLines < 7 ? 148 * WidgetsConstant.height: numLines * WidgetsConstant.height * 24,
     child: TextFormField(
              controller: _bodyText,
              maxLines: numLines < 7 ? 148 : numLines,
              keyboardType: TextInputType.multiline,
              textInputAction: TextInputAction.newline,        
              onChanged: (String value) {
                setState(() {
                  numLines = '\n'.allMatches(value).length + 1;
                });
              },
          ),
     ),
于 2021-02-05T02:35:11.330 回答
1

摆脱填充的完美方法是使用InputDecoration.collapsed.

GestureDetector它用 a包裹ContainerContainer,并根据需要用尽可能多的 Padding、Border 和 Decoration 来装饰 Container。

GestureDetector(
  onTap: () => _focusNode.requestFocus(),
  child: Container(
    padding: const EdgeInsets.all(10),
    decoration: BoxDecoration(
      color: Colors.grey,
      borderRadius: BorderRadius.circular(4),
    ),
    child: TextField(
      focusNode: _focusNode,
      decoration: const InputDecoration.collapsed(
        hintText: 'Search...',
        border: OutlineInputBorder(
          borderSide: BorderSide(
            width: 0,
            style: BorderStyle.none,
          ),
        ),
      ),
    ),
  ),
);

要显示图标,请将Container子项更改为Row, 并使用IconTextField包裹的Expanded

于 2021-11-24T02:07:29.847 回答
1

文本字段(minLines:1,maxLines:5,maxLengthEnforced:true)

于 2020-06-17T11:22:51.677 回答
0

您可以更改最大值

minLines: 4,
maxLines: 6,
于 2022-01-14T14:09:12.433 回答
0

设置minLines: nullmaxLines: nullexpands:true让 TextField 填充其父小部件的高度:

Container(
  child: TextField(
    minLines: null,
    maxLines: null,
    expands: true
  )
)

请参考这些文档:https ://api.flutter.dev/flutter/material/TextField/expands.html

对于宽度,您可以这样做:

Container(
  width: 100,
  child: TextField(
    
  )
)

让 TextField 填充其父窗口小部件的宽度(在这种情况下为 100 像素)

于 2022-01-27T09:23:33.397 回答
0

要增加 TextField 小部件的高度,只需使用小部件附带的 maxLines: 属性。例如: TextField( maxLines: 5 ) // 它将增加 Textfield 的高度和宽度。

于 2020-11-17T15:40:12.940 回答
0

您可以简单地将文本字段小部件包装在填充小部件中.....像这样,

Padding(
         padding: EdgeInsets.only(left: 5.0, right: 5.0),
          child: TextField(
            cursorColor: Colors.blue,

            decoration: InputDecoration(
                labelText: 'Email',
                hintText: 'xyz@gmail.com',
                //labelStyle: textStyle,
              border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(5),
                  borderSide: BorderSide(width: 2, color: Colors.blue,)),
              focusedBorder: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(10),
                  borderSide: BorderSide(width: 2, color: Colors.green)),
                )

            ),
          ),
于 2020-12-17T12:00:00.950 回答