To może wydawać się łatwe, ale jak możemy zrobić wieloliniowe edytowalne pole tekstowe w trzepotaniu? TextField działa tylko z jedną linią.
Edycja: pewne szczegóły, ponieważ wydaje się, że nie jest jasne. Chociaż możesz ustawić multilinię na wirtualne zawijanie treści tekstowej, nadal nie jest to multilinia. Jest to pojedyncza linia wyświetlana w wielu wierszach. Jeśli chcesz zrobić coś takiego, nie możesz. Ponieważ nie masz dostępu do ENTER
przycisku. Brak przycisku Enter oznacza brak multilinii.
maxLines: null
. Bez hi to nie działa<textarea>
w HTML, użyjminLines: 4
Jeśli chcesz, aby Twoje TextField dostosowywało się do danych wprowadzanych przez użytkownika, zrób to:
TextField( keyboardType: TextInputType.multiline, minLines: 1,//Normal textInputField will be displayed maxLines: 5,// when user presses enter it will adapt to it );
tutaj ustaw maksymalne linie na cokolwiek chcesz i jesteś gotowy. Moim zdaniem ustawienie maxlines na null nie jest dobrym wyborem, powinniśmy nadać mu jakąś wartość.
źródło
Chociaż inne osoby wspomniały już, że można użyć klawiatury typu „TextInputType.multiline”, chciałem dodać moją implementację TextField, która automatycznie dostosowuje swoją wysokość po wprowadzeniu nowej linii, ponieważ często jest pożądane, aby imitować zachowanie wejściowe WhatsApp i podobne aplikacje.
Analizuję liczbę znaków „\ n” na wejściu w tym celu za każdym razem, gdy tekst jest zmieniany. Wydaje się, że jest to przesada, ale niestety nie znalazłem do tej pory lepszej możliwości osiągnięcia tego beahivour we Flutterze i nie zauważyłem żadnych problemów z wydajnością nawet na starszych smartfonach.
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, )
źródło
Użyj tego
TextFormField( keyboardType: TextInputType.multiline, maxLines: //Number_of_lines(int),)
źródło
TextField
ma właściwość maxLines .źródło
Użyj
expands
i nie musisz podawaćminLines
animaxLines
żadnej konkretnej wartości:TextField( maxLines: null, expands: true, keyboardType: TextInputType.multiline, )
źródło
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)), ), ), ),
źródło
jeśli powyższe raz nie zadziałało, spróbuj dodać również minLines
TextField( keyboardType: TextInputType.multiline, minLines: 3, maxLines: null);
źródło
Określ TextInputAction.newline, aby TextField odpowiadał na klawisz Enter i akceptował wprowadzanie wieloliniowe :
źródło
Chociaż to pytanie jest dość stare, nie ma obszernej odpowiedzi, która wyjaśnia, jak dynamicznie zmieniać rozmiar
TextField
przy niewielkim wysiłku programisty. Jest to szczególnie ważne, gdyTextField
jest umieszczony w flexboksie, takim jak ListView, SingleChildScrollView itp. (Flexbox nie będzie w stanie określić wewnętrznego rozmiaru elementu rozszerzalnegoTextField
).Zgodnie z sugestiami wielu innych użytkowników, zbuduj coś
TextField
takiego:TextField( textInputAction: TextInputAction.newline, keyboardType: TextInputType.multiline, minLines: null, maxLines: null, // If this is null, there is no limit to the number of lines, and the text container will start with enough vertical space for one line and automatically grow to accommodate additional lines as they are entered. expands: true, // If set to true and wrapped in a parent widget like [Expanded] or [SizedBox], the input will expand to fill the parent. )
Jak sobie radzić z brakującą wewnętrzną wysokością
TextField
?Zawiń
TextField
wIntrinsicHeight
klasie, aby zapewnić dynamicznie obliczaną wewnętrzną wysokość elementu rozszerzalnegoTextField
do jego rodzica (na żądanie przez np. Flexbox).źródło
Oficjalny dokument stwierdza :
maxLines
Właściwość można ustawić na wartość null, aby usunąć ograniczenie liczby wierszy. Domyślnie jest to jeden, co oznacza, że jest to jednowierszowe pole tekstowe.UWAGA:
maxLines
nie może wynosić zero.źródło
W widżecie TextFormField możesz ustawić minLines i maxLines, jeśli chcesz ustawić stałą liczbę wierszy. W przeciwnym razie możesz również ustawić maxLines na null.
TextFormField( minLines: 5, maxLines: 7, decoration: InputDecoration( hintText: 'Address', border: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10.0)), ), ), ),
źródło