颤振中的多行文本字段


116

听起来很简单,但是如何在flutter中创建多行可编辑文本字段?TextField仅适用于单行。

编辑:一些精度,因为似乎不清楚。虽然您可以设置多行以虚拟包装文本内容,但仍然不是多行。它是单行显示为多行。如果您想做这样的事情,那您就做不到。因为您无权访问ENTER按钮。而且没有输入按钮意味着没有多行。

Answers:


201

要使用自动换行,只需将其设置 maxLinesnull

TextField(
  keyboardType: TextInputType.multiline,
  maxLines: null,
)

如果该maxLines属性为null,则行数没有限制,并且启用了自动换行。


要抓住的是maxLines: null。没有嗨,它似乎不起作用
Sisir

26

如果希望TextField适应用户输入,请执行以下操作:

TextField(
    keyboardType: TextInputType.multiline,
    minLines: 1,//Normal textInputField will be displayed
    maxLines: 5,// when user presses enter it will adapt to it
    );

在这里将最大行数设置为您想要的任何值,您就可以开始了。我认为将maxlines设置为null不是一个好选择,我们应该将其设置为某个值。


1
我已经将小部件名称从:TextInputField纠正为:TextField。在颤振中,没有TextInputField,只有TextField或TextFormField。除非您使用自定义名称创建一个。
卡西欧·塞弗林

13

尽管其他人已经提到可以使用键盘类型“ TextInputType.multiline”,但我还是想添加TextField的实现,该实现在输入新行时会自动调整其高度,因为通常需要模仿它的输入行为。 WhatsApp和类似的应用程序。

每次更改文本时,我都会为此分析输入中“ \ n”字符的数量。这似乎是一个过大的杀伤力,但是不幸的是,到目前为止,我没有找到更好的方法来实现Flutter的这种性能,即使在较旧的智能手机上,我也没有发现任何性能问题。

class _MyScreenState extends State<MyScreen> {
  double _inputHeight = 50;
  final TextEditingController _textEditingController = TextEditingController();

  @override
  void initState() {
    super.initState();
    _textEditingController.addListener(_checkInputHeight);
  }

  @override
  void dispose() {
    _textEditingController.dispose();
    super.dispose();
  }

  void _checkInputHeight() async {
    int count = _textEditingController.text.split('\n').length;

    if (count == 0 && _inputHeight == 50.0) {
      return;
    }
    if (count <= 5) {  // use a maximum height of 6 rows 
    // height values can be adapted based on the font size
      var newHeight = count == 0 ? 50.0 : 28.0 + (count * 18.0);
      setState(() {
        _inputHeight = newHeight;
      });
    }
  }


  // ... build method here
  TextField(
    controller: _textEditingController,
    textInputAction: TextInputAction.newline,
    keyboardType: TextInputType.multiline,
    maxLines: null,
  )

1
考虑添加实际使用_inputHeight设置输入高度的方式
Ali Nasserzadeh

由于TextField可以包装行而不用'\ n'计数来分隔行,因此将失败。所以我用下面的代码计算文本行:int count =(_textEditingController.text.length /(MediaQuery.of(context).size.width * 0.06)).round();
Reginaldo Rigo

5

TextField具有maxLines属性。

在此处输入图片说明


1
我知道。它包装内容时,仍然不能按Enter手动创建新行。至少在android上,因为您无权输入enter按钮。
罗米·罗素(RémiRousselet)

啊,我错过了那个问题。我看到一个类似的问题可以追溯到2016年,所以我认为它已解决。很遗憾,我们仍然无法做到这一点。
罗米·罗素(RémiRousselet)

2
看起来现在已修复(github.com/flutter/flutter/issues/8028)。我在iOS和Android上都尝试了多行,并且现在都可以在文本字段中创建新行。
Matt S.

它实际上可以立即创建新行,但是必须按两次Enter键!
温杜

5

用这个

TextFormField(
      keyboardType: TextInputType.multiline,
      maxLines: //Number_of_lines(int),)

5

使用expands,您无需提供minLinesmaxLines任何特定值:

TextField(
  maxLines: null,
  expands: true, 
  keyboardType: TextInputType.multiline,
)


0

官方文档状态maxLines可以将该属性设置为null以消除对行数的限制。默认情况下,它是一个,表示这是一个单行文本字段。

注意: maxLines不能为零。


0

如果以上一次不是为你工作,然后尝试添加的minlines

TextField(
        keyboardType: TextInputType.multiline,
        minLines: 3,
        maxLines: null);

0

对于TextFormField小部件,如果要设置行数固定值,则可以设置minLines和maxLines。否则,您也可以将maxLines设置为null。

TextFormField(
      minLines: 5,
      maxLines: 7,
      decoration: InputDecoration(
          hintText: 'Address',
          border: OutlineInputBorder(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
          ),
      ),
),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.