フラッターの複数行のテキストフィールド


117

簡単に聞こえるかもしれませんが、複数行の編集可能なテキストフィールドをフラッターで作成するにはどうすればよいですか?TextFieldは、1行でのみ機能します。

編集:それが明確ではないように思われるので、いくつかの精度。テキストコンテンツを仮想的に折り返すように複数行を設定できますが、それでも複数行ではありません。これは、1行を複数行に表示したものです。あなたがこのようなことをしたいのなら、あなたはできません。ENTERボタンにアクセスできないからです。また、入力ボタンがないということは、複数行がないことを意味します。

回答:


203

自動ラップを使用するには、次のように設定 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だけがあります。カスタム名で作成しない限り。
Cassio Seffrin

14

他の人はキーボードタイプ「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'で行を分割せずに行を折り返すことができるため、カウントは失敗します。したがって、次のコードでテキスト行をカウントしています。intcount =(_ textEditingController.text.length /(MediaQuery.of(context).size.width * 0.06))。round();
Reginaldo Rigo

5

TextFieldmaxLinesプロパティがあります。

ここに画像の説明を入力してください


1
そんなこと知ってる。コンテンツをラップしている間は、Enterキーを押して手動で新しい行を作成することはできません。少なくともAndroidでは、Enterボタンにアクセスできないためです。
レミRousselet

ああ、私はその問題を見逃しました。2016年から同様の問題が発生したので、解決したと思いました。まだそれができないのはとても悲しいことです。
レミRousselet

2
これは修正されたようです(github.com/flutter/flutter/issues/8028)。iOSとAndroidの両方で複数行を試しましたが、どちらもテキストフィールドに新しい行を作成できるようになりました。
マットS.

実際には改行を作成できますが、Enterキーを2回押す必要があります。
wendu 2018


5

を使用するexpandsと、minLinesまたはmaxLines特定の値を与える必要はありません。

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


0

公式ドキュメントの状態maxLines行数の制限を削除するには、プロパティをnullに設定できます。デフォルトでは、これは1つです。つまり、これは1行のテキストフィールドです。

注: 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)),
          ),
      ),
),
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.