Flutter의 여러 줄 텍스트 필드


127

쉽게 들릴 수 있지만 어떻게 여러 줄로 편집 가능한 텍스트 필드를 flutter로 할 수 있습니까? TextField는 한 줄로만 작동합니다.

편집 : 명확하지 않은 것처럼 보이기 때문에 일부 정밀도. 텍스트 내용을 가상으로 감싸도록 여러 줄을 설정할 수 있지만 여전히 여러 줄이 아닙니다. 여러 줄로 표시되는 한 줄입니다. 이런 식으로하고 싶다면 할 수 없습니다. ENTER버튼에 대한 액세스 권한이 없기 때문 입니다. 그리고 Enter 버튼이 없다는 것은 여러 줄이 없음을 의미합니다.

답변:


212

자동 줄 바꿈을 사용하려면 다음 maxLines과 같이 설정하십시오 null.

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

경우 maxLines속성입니다 null,이 라인의 수에는 제한 없으며, 랩이 활성화됩니다.


캐치는 것 maxLines: null입니다. 안녕 없이는 작동하지 않는 것 같습니다
Sisir

<textarea>HTML 처럼 더 두껍게 보이게 하려면minLines: 4
Nabeel Parkar

28

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로 수정했습니다. flutter에는 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'개수로 줄을 분할하지 않고 줄을 래핑 할 수 있으므로 실패합니다. 그래서 나는이 코드로 텍스트 줄을 계산하고 있습니다 : int count = (_textEditingController.text.length / (MediaQuery.of (context) .size.width * 0.06)) .round ();
Reginaldo Rigo


5

TextFieldmaxLines의 속성을.

여기에 이미지 설명 입력


1
알아요. 콘텐츠를 래핑하는 동안 Enter 키를 눌러 수동으로 새 줄을 만들 수는 없습니다. 적어도 안드로이드에서는 입력 버튼에 액세스 할 수 없기 때문입니다.
Rémi Rousselet

아, 그 문제를 놓쳤습니다. 2016 년부터 비슷한 문제를 보았 기 때문에 해결되었다고 생각했습니다. 우리는 여전히 그것을 할 수 없습니다.
Rémi Rousselet

2
이제이 문제가 해결 된 것 같습니다 ( github.com/flutter/flutter/issues/8028 ). iOS와 Android 모두에서 여러 줄을 시도했으며 이제 둘 다 텍스트 필드에 새 줄을 만들 수 있습니다.
Matt S.

이제 실제로 새 줄을 만들 수 있지만 Enter 키를 두 번 눌러야합니다!
wendu

5

사용 expands당신은 줄 필요가 없습니다 minLines또는 maxLines특정 값 :

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

1

위의 경우 한 번 작동하지 않으면 minLines 도 추가하십시오.

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


0

공식 문서 상태 : maxLines속성을 null로 설정하여 줄 수에 대한 제한을 제거 할 수 있습니다. 기본적으로 1입니다. 즉, 한 줄 텍스트 필드입니다.

참고 : maxLines 0이 아니어야합니다.


0

들어 TextFormField 위젯 은 라인의 설정 수정 번호를 원하는 경우, 당신은 minLines 및 maxLines을 설정할 수 있습니다. 그렇지 않으면 maxLines를 null로 설정할 수도 있습니다.

TextFormField(
      minLines: 5,
      maxLines: 7,
      decoration: InputDecoration(
          hintText: 'Address',
          border: OutlineInputBorder(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
          ),
      ),
),

0
   TextFormField(
                  minLines: 2,
                  maxLines: 5,
                  keyboardType: TextInputType.multiline,
                  decoration: InputDecoration(
                    hintText: 'description',
                    hintStyle: TextStyle(
                      color: Colors.grey
                    ),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.all(Radius.circular(20.0)),
                    ),
                  ),
                ),
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.