Flutter'da çok satırlı Metin Alanı


121

Kulağa kolay gelebilir ama çok satırlı düzenlenebilir bir metin alanını flutter'da nasıl yapabiliriz? TextField yalnızca tek bir satırla çalışır.

Düzenleme: bazı kesinlikler çünkü net değil gibi görünüyor. Metin içeriğini sanal olarak kaydırmak için çok satırlı ayarlayabilseniz de, yine de çok satırlı değildir. Birden çok satırda görüntülenen tek bir satırdır. Böyle bir şey yapmak istiyorsan, yapamazsın. Çünkü ENTERdüğmeye erişiminiz yok . Ve hiçbir giriş düğmesi, çok satırlı olmadığı anlamına gelir.

Yanıtlar:


206

Otomatik wrap kullanmak için, sadece set maxLinesolarak null:

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

maxLinesÖzellik varsa, nullsatır sayısında bir sınır yoktur ve sarma etkinleştirilir.


Yakalama sahip olmaktır maxLines: null. Merhaba olmadan işe yaramıyor gibi görünüyor
Sisir

<textarea>HTML'deki gibi daha kalın görünmesini istiyorsanız , kullanınminLines: 4
Nabeel Parkar

27

TextField'ınızın kullanıcı girdisine uyarlanmasını istiyorsanız, şunu yapın:

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

burada maksimum çizgileri istediğinize ayarlayın ve gitmekte fayda var. Bence maksimum çizgileri null olarak ayarlamak iyi bir seçim değil, onu bir değere ayarlamalıyız.


1
Widget adını düzelttim: TextInputField, to: TextField. Flutter'da TextInputField yoktur, sadece TextField veya TextFormField vardır. Özel adla bir tane oluşturmadığınız sürece.
Cassio Seffrin

14

Başkaları zaten "TextInputType.multiline" klavye türünün kullanılabileceğinden bahsetse de, yeni bir satır girildiğinde yüksekliğini otomatik olarak uyarlayan bir TextField uygulamamı eklemek istedim, çünkü çoğu zaman giriş davranışını taklit etmek istendi. WhatsApp ve benzeri uygulamalar.

Metin her değiştirildiğinde bu amaçla girdideki '\ n' karakterlerinin sayısını analiz ediyorum. Bu bir aşırılık gibi görünüyor, ancak maalesef şu ana kadar Flutter'da bu beahivour'a ulaşmak için daha iyi bir fırsat bulamadım ve daha eski akıllı telefonlarda bile herhangi bir performans sorunu fark etmedim.

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
Girdinin yüksekliğini ayarlamak için _inputHeight'ı gerçekte nasıl kullandığınızı eklemeyi düşünün
Ali Nasserzadeh

TextField satırı '\ n' ile bölmeden kaydırabildiğinden, sayı başarısız olur. Metin satırlarını şu kodla sayıyorum: int count = (_textEditingController.text.length / (MediaQuery.of (bağlam) .size.width * 0.06)) .round ();
Reginaldo Rigo

6

bunu kullan

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

5

TextFieldvardır maxLines özelliği.

görüntü açıklamasını buraya girin


1
Bunu biliyorum. İçeriği sararken, manuel olarak yeni bir satır oluşturmak için hala enter tuşuna basamazsınız. En azından android'de, çünkü enter düğmesine erişiminiz yok.
Rémi Rousselet

Ah, bu sorunu kaçırdım. 2016'dan kalma benzer bir sorun gördüm, bu yüzden çözüldüğünü varsaydım. Hâlâ yapamıyoruz çok üzücü.
Rémi Rousselet

2
Görünüşe göre bu artık düzeltildi ( github.com/flutter/flutter/issues/8028 ). Hem iOS hem de Android'de çoklu satırı denedim ve her ikisi de artık metin alanında yeni satırlar oluşturabilir.
Matt S.

Aslında şimdi yeni bir satır oluşturabilir, ancak enter tuşuna iki kez basılması gerekir!
wendu

5

Kullanım expandsve vermek gerekmez minLinesveya maxLinesherhangi bir özel değeri:

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


0

Resmi belge şunu belirtir : maxLinesÖzellik, satır sayısındaki kısıtlamayı kaldırmak için null olarak ayarlanabilir. Varsayılan olarak birdir, yani bu tek satırlık bir metin alanıdır.

NOT: maxLines sıfır olmamalıdır.


0

yukarıda sizin için bir kez işe yaramadıysa, ayrıca minLines eklemeyi deneyin

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

0

İçin TextFormField widget'ı çizgiler kümesi düzeltme numarasına istiyorsanız, Sen minLines ve maxLines ayarlayabilirsiniz. Aksi takdirde maxLines'i null olarak da ayarlayabilirsiniz.

TextFormField(
      minLines: 5,
      maxLines: 7,
      decoration: InputDecoration(
          hintText: 'Address',
          border: OutlineInputBorder(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
          ),
      ),
),
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.