Trường văn bản nhiều dòng bị rung


118

Nghe có vẻ dễ dàng nhưng Làm thế nào chúng ta có thể tạo một trường văn bản có thể chỉnh sửa nhiều dòng một cách lộn xộn? TextField chỉ hoạt động với một dòng duy nhất.

Chỉnh sửa: một số điều chỉnh vì có vẻ như nó không rõ ràng. Mặc dù bạn có thể đặt đa dòng để bao bọc hầu như nội dung văn bản, nhưng nó vẫn không phải là đa dòng. Đó là một dòng đơn được hiển thị thành nhiều dòng. Nếu bạn muốn làm điều gì đó như thế này thì bạn không thể. Bởi vì bạn không có quyền truy cập vào ENTERnút. Và không có nút enter nghĩa là không có nhiều dòng.

Câu trả lời:


204

Để sử dụng tự động bọc, chỉ cần đặt maxLinesnull:

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

Nếu thuộc maxLinestính này null, không có giới hạn về số dòng và tính năng bọc được bật.


Bắt là phải có maxLines: null. Nếu không có xin chào, nó dường như không hoạt động
Sisir

26

Nếu bạn muốn Trường văn bản của mình thích ứng với đầu vào của người dùng thì hãy làm như sau:

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

ở đây, hãy đặt các dòng tối đa thành bất kỳ thứ gì bạn muốn và bạn có thể thực hiện. Theo ý kiến ​​của tôi, đặt maxlines thành null không phải là một lựa chọn tốt, chúng ta nên đặt nó thành một số giá trị.


1
Tôi đã sửa tên tiện ích con từ: TextInputField thành: TextField. Trong bối cảnh không có TextInputField, chỉ có TextField hoặc TextFormField. Trừ khi bạn tạo một cái với tên tùy chỉnh.
Cassio Seffrin

14

Mặc dù những người khác đã đề cập rằng loại bàn phím "TextInputType.multiline" có thể được sử dụng, tôi muốn thêm việc triển khai TextField tự động điều chỉnh chiều cao của nó khi nhập một dòng mới, vì nó thường được mong muốn bắt chước hành vi nhập của WhatsApp và các ứng dụng tương tự.

Tôi đang phân tích số lượng người trò chuyện '\ n' trong mục nhập cho mục đích này mỗi khi văn bản được thay đổi. Điều này có vẻ là quá mức cần thiết, nhưng tiếc là cho đến nay tôi không tìm thấy khả năng tốt hơn để đạt được vẻ đẹp này trong Flutter và tôi không nhận thấy bất kỳ vấn đề hiệu suất nào ngay cả trên điện thoại thông minh cũ hơn.

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
Cân nhắc thêm cách bạn thực sự sử dụng _inputHeight để đặt chiều cao của đầu vào
Ali Nasserzadeh

Vì TextField có thể bao bọc dòng mà không tách dòng với số '\ n' sẽ không thành công. Vì vậy, tôi đang đếm các dòng văn bản với mã này: int count = (_textE EditController.text.length / (MediaQuery.of (context) .size.width * 0.06)) .round ();
Reginaldo Rigo

6

dùng cái này

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

5

TextFieldthuộc tính maxLines .

nhập mô tả hình ảnh ở đây


1
Tôi biết điều đó. Trong khi nó kết thúc nội dung, bạn vẫn không thể nhấn enter để tạo dòng mới theo cách thủ công. Ít nhất là trên android, vì bạn không có quyền truy cập vào nút enter.
Rémi Rousselet

À, tôi đã bỏ qua vấn đề đó. Tôi đã thấy một vấn đề tương tự có từ năm 2016, vì vậy tôi cho rằng nó đã được giải quyết. Khá buồn là chúng tôi vẫn không thể làm được.
Rémi Rousselet

2
Có vẻ như điều này hiện đã được khắc phục ( github.com/flutter/flutter/issues/8028 ). Tôi đã thử đa dòng trên cả iOS và Android và cả hai hiện có thể tạo dòng mới trong trường văn bản.
Matt S.

Nó thực sự có thể tạo một dòng mới ngay bây giờ, nhưng phải nhấn phím enter hai lần!
wendu

5

Sử dụng expandsvà bạn không cần phải cung cấp minLineshoặc maxLinesbất kỳ giá trị cụ thể nào:

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


0

Tài liệu chính thức cho biết : maxLinesThuộc tính có thể được đặt thành null để loại bỏ hạn chế về số dòng. Theo mặc định , nó là một, nghĩa là đây là trường văn bản một dòng.

LƯU Ý: maxLines không được bằng 0.


0

nếu trên một lần không làm việc cho bạn sau đó thử add minLines cũng

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

0

Đối với tiện ích TextFormField , Bạn có thể đặt minLines và maxLines nếu bạn muốn đặt số dòng cố định. Nếu không, bạn cũng có thể đặt maxLines thành null.

TextFormField(
      minLines: 5,
      maxLines: 7,
      decoration: InputDecoration(
          hintText: 'Address',
          border: OutlineInputBorder(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
          ),
      ),
),
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.