扩展 maxLines 属性时自动滚动多行 TextFormField

Automatically scroll multiline TextFormField when it extends the maxLines attribute

我正在实现一个 TextFormField,其 maxLines 属性设置为 3。当用户从他的第四行开始时,如何使 TextFormField 向下滚动?目前,在用户手动向下滚动之前,光标不再可见。有没有办法自动执行此操作?

此行为实际上出现在 'Text fields' 示例中的 flutter_gallery 应用程序中。只需在 'Live story' 输入框中键入一个长文本,直到到达第四行。
我的代码的重要部分实际上是这样的:

import 'package:flutter/material.dart';

class TextFormFieldDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Form(
        child: new TextFormField(
          maxLines: 3,
        ),
      ),
    );
  }
}

到目前为止,我还没有找到解决此问题的方法。
此问题同时影响 iOS 和 android。

这似乎是 Flutter Framework 中缺少的功能,我已经提交了一个错误来解决它:https://github.com/flutter/flutter/issues/9365

我们的团队通过嵌套一些现有的小部件实现了这一点:

// create the illusion of a beautifully scrolling text box
return new Container(
    color: Colors.gray,
  padding: new EdgeInsets.all(7.0),

  child: new ConstrainedBox(
    constraints: new BoxConstraints(
      minWidth: _contextWidth(),
      maxWidth: _contextWidth(),
      minHeight: AppMeasurements.isLandscapePhone(context) ? 25.0 : 25.0,
      maxHeight: 55.0,
    ),

    child: new SingleChildScrollView(
      scrollDirection: Axis.vertical,
      reverse: true,

        // here's the actual text box
        child: new TextField(
          keyboardType: TextInputType.multiline,
          maxLines: null, //grow automatically
          focusNode: mrFocus,
          controller: _textController,
          onSubmitted: currentIsComposing ? _handleSubmitted : null,
          decoration: new InputDecoration.collapsed(
            hintText: ''Please enter a lot of text',
          ),
        ),
        // ends the actual text box

      ),
    ),
  );
}

我们在 Darky 的帮助下获得了小部件排序和正确的小部件以使其正常工作。

我让它像这样工作。希望对您有所帮助!

return new Card(
                shape: RoundedRectangleBorder(
                 side: BorderSide(
                   color: Colors.deepPurpleAccent,
                   width: 1
                 ),
                  borderRadius: BorderRadius.circular(3)
                ),
                child: Container(
                  height: 50,
                  child: SingleChildScrollView(
                    child: TextField(
                      maxLines: null,
                    ),
                  ),
                ),
              );

您可以使用 BoxConstraints 并设置您的 TextFieldmaxHeight

Container(
  constraints: BoxConstraints(maxHeight: 100),
  child: SingleChildScrollView(
    child: TextField(
      maxLines: null,
    ),
  ),
);

使用最新的flutter 1.20.4,此文本字段在达到最大高度时会滚动。

       Container(
          constraints: BoxConstraints(maxHeight: 200),
             child: TextField(
                maxLines: null,
                 .......
                )
            )

如果您在 Raw 或列中使用文本字段,请将其包装在 Expanded 小部件中

只需使用 TextFormField() 小部件并设置 minLines= maxLines=。 缺少的东西在这里滚动指示器。

 TextFormField(
                    minLines: 3,
                    maxLines: 3,
                    key: _messageValueKey,
                    decoration: _inputDecoration,
                  ),

只需将 'reverse: true' 添加到您的可滚动小部件,如下所示:

    Widget build(BuildContext context) {
      return Container(
        width: MediaQuery.of(context).size.width,
        height: 130.0,
        decoration: BoxDecoration(
          border: Border.all(color: Colors.purpleAccent),
        ),
        child: SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          reverse: true,
          child: Text(
            '$message',
            maxLines: 2,
            style: TextStyle(fontSize: 30),
          ),
        ),
      );
    }
  }

我用 ScrollController 解决了这个问题。

ScrollController textFieldScrollController = ScrollController();

TextField(
  scrollController: textFieldScrollController,
  keyboardType: TextInputType.multiline,
  minLines: null,
  maxLines: null,
  onChanged: (value) {
    textFieldScrollController.jumpTo(textFieldScrollController.position.maxScrollExtent);
  },
),