Tìm hiểu sâu hơn về TextField trong Flutter

TextField là một trong những thành phần hết sức quen thuộc cho các lập trình viên mobile. Trong bài viết này, chúng ta đi sâu vào tiện ích Flutter TextField một cách toàn diện và tìm hiểu các tính năng và các tùy chỉnh có thể có của nó.

Giới thiệu về TextField

Một widget TextField cho phép thu thập thông tin từ người dùng. Code cho TextField cơ bản đơn giản như:

TextField()

Điều này tạo ra một TextField cơ bản:

Lấy thông tin từ TextField

Vì TextField không có ID như trong Android, văn bản không thể được truy xuất theo yêu cầu và thay vào đó phải được lưu trữ trong một biến khi thay đổi hoặc sử dụng bộ điều khiển.

  1. Cách dễ nhất để làm điều này là sử dụng phương thức onChanged và lưu trữ giá trị hiện tại trong một biến đơn giản. Đây là mã mẫu cho nó:
String value = "";
TextField(
  onChanged: (text) {
    value = text;
  },
)
  1. Cách thứ hai để làm điều này là sử dụng TextEditingController. Bộ điều khiển được gắn vào TextField và cũng cho phép chúng tôi nghe và điều khiển văn bản của TextField.
TextEditingController controller = TextEditingController();
TextField(
  controller: controller,
)

Và chúng ta có thể lắng nghe những thay đổi bằng cách sử dụng

controller.addListener(() {
  // Do something here
});

Và nhận hoặc đặt giá trị bằng cách sử dụng

print(controller.text); // Print current value
controller.text = "Demo Text"; // Set new value

Các Callback khác từ TextField

Tiện ích TextField cũng cung cấp các callback khác như

  1. onEditingCompleted
  2. onSubmitted
onEditingComplete: () {},
onSubmitted: (value) {},

Đây là các callback được gọi trên các hành động như khi người dùng nhấp vào nút "Done" button trên bàn phím iOS.

Làm việc với focus trong TextFields

Có một TextField được focus có nghĩa là có một TextField hoạt động và mọi đầu vào từ bàn phím sẽ dẫn đến dữ liệu được nhập vào TextField đã focus đó.

1. Làm việc với autofocus

Để autofocus trên TextField khi tiện ích được tạo, hãy đặt trường autofocus thành true.

TextField(
  autofocus: true,
),

Điều này đặt focus vào TextField theo mặc định.

2. Làm việc với các thay đổi focus tùy chỉnh

Điều gì sẽ xảy ra nếu chúng ta muốn thay đổi focus theo nhu cầu và không chỉ autofocus? Vì chúng ta cần một số cách để focus TextField tiếp theo mà chúng ta muốn, chúng ta đính kèm FocusNode vào TextField và sử dụng nó để chuyển focus.

// Initialise outside the build method
FocusNode nodeOne = FocusNode();
FocusNode nodeTwo = FocusNode();
// Do this inside the build method
TextField(
  focusNode: nodeOne,
),
TextField(
  focusNode: nodeTwo,
),
RaisedButton(
  onPressed: () {
    FocusScope.of(context).requestFocus(nodeTwo);
  },
  child: Text("Next Field"),
),

Chúng ta tạo hai nút focus và đính kèm chúng vào TextFields. Khi nhấn nút, chúng tôi sử dụng FocusScope để yêu cầu focus cho TextField tiếp theo.

Thay đổi thuộc tính bàn phím cho TextFields

TextField trong Flutter cũng cho phép bạn tùy chỉnh các thuộc tính liên quan đến bàn phím.

1. Loại Keyboard

TextField cho phép bạn tùy chỉnh loại bàn phím hiển thị khi TextField được đưa vào tiêu điểm. Chúng tôi thay đổi thuộc tính keyboardType cho điều này.

TextField(
  keyboardType: TextInputType.number,
),

Các loại là:

  1. TextInputType.text (Normal complete keyboard)
  2. TextInputType.number (A numerical keyboard)
  3. TextInputType.emailAddress (Normal keyboard with an “@”)
  4. TextInputType.datetime (Numerical keyboard with a “/” and “:”)
  5. TextInputType.numberWithOptions (Numerical keyboard with options to enabled signed and decimal mode)
  6. TextInputType.multiline (Optimises for multi-line information)

2. TextInputAction

Thay đổi textInputAction của TextField cho phép bạn thay đổi nút hành động của chính bàn phím. Ví dụ:

TextField(
  textInputAction: TextInputAction.continueAction,
),

Trường hợp này nút "Done" được thay thế bằng nút "Continue".

hoặc:

TextField(
  textInputAction: TextInputAction.send,
),

kết quả:

3. Autocorrect

Bật hoặc tắt tự động sửa cho TextField cụ thể. Sử dụng trường tự động sửa để đặt cái này.

TextField(
  autocorrect: false,
),

Điều này cũng sẽ vô hiệu hóa các đề xuất.

4. Text Capitalization

TextField cung cấp một vài tùy chọn về cách viết hoa chữ cái trong đầu vào từ người dùng.

TextField(
  textCapitalization: TextCapitalization.sentences,
),

Các loại là:

1. TextCapitalization.sentences

Đây là loại viết hoa bình thường mà chúng tôi mong đợi, chữ cái đầu tiên của mỗi câu được viết hoa.

2. TextCapitalization.characters

Viết hoa tất cả các ký tự trong câu.

3. TextCapitalization.words

Viết hoa chữ cái đầu tiên của mỗi từ.

Tùy chọn kiểu văn bản, căn chỉnh và con trỏ

Flutter cho phép tùy chỉnh liên quan đến kiểu dáng và căn chỉnh văn bản bên trong TextField cũng như con trỏ bên trong TextField.

Căn chỉnh text bên trong TextField

Sử dụng thuộc tính textAlign để điều chỉnh vị trí con trỏ bên trong TextField.

TextField(
  textAlign: TextAlign.center,
),

Điều này khiến con trỏ và văn bản bắt đầu ở giữa TextField.

Điều này có các thuộc tính căn chỉnh thông thường: start, end, left, right, center, justify.

Tạo kiểu văn bản bên trong TextField

Chúng ta sử dụng thuộc tính kiểu để thay đổi cách văn bản bên trong TextField. Sử dụng nó để thay đổi màu sắc, kích thước phông chữ, v.v ... Điều này tương tự với thuộc tính kiểu trong tiện ích Văn bản, vì vậy chúng tôi sẽ không mất quá nhiều thời gian để khám phá nó.

TextField(
  style: TextStyle(color: Colors.red, fontWeight: FontWeight.w300),
),

Thay đổi con trỏ trong TextField

Con trỏ được tùy chỉnh trực tiếp từ tiện ích TextField.

Bạn được phép thay đổi màu con trỏ, chiều rộng và bán kính của các góc. Ví dụ, ở đây tôi tạo một con trỏ màu đỏ hình tròn mà không có lý do rõ ràng.

TextField(
  cursorColor: Colors.red,
  cursorRadius: Radius.circular(16.0),
  cursorWidth: 16.0,
),

Kiểm soát kích thước và độ dài tối đa trong TextField

TextFields có thể kiểm soát số lượng ký tự tối đa được viết bên trong nó, số lượng dòng tối đa và mở rộng khi văn bản được nhập.

Kiểm soát ký tự tối đa

TextField(
  maxLength: 4,
),

Bằng cách đặt thuộc tính maxLạng, độ dài tối đa được thi hành và bộ đếm được thêm theo mặc định vào TextField.

Tạo một TextField có thể mở rộng

Đôi khi, chúng ta cần một TextField mở rộng khi một dòng kết thúc. Trong Flutter, nó hơi kỳ lạ (nhưng dễ) để làm. Để làm điều này, chúng tôi đặt maxLines thành null, theo mặc định là 1. Cài đặt thành null không phải là điều mà chúng tôi rất quen thuộc nhưng tuy nhiên nó rất dễ thực hiện.

Lưu ý: Đặt maxLines thành giá trị trực tiếp sẽ mở rộng nó thành số dòng đó theo mặc định.

Văn bản che khuất

Để che khuất văn bản trong TextField, hãy đặt obscureText thành true. Thuộc tính này dùng cho các TextField nhập password

Và cuối cùng, trang trí TextField

Cho đến bây giờ chúng ta tập trung vào các tính năng Flutter cung cấp cho đầu vào. Bây giờ chúng ta sẽ chuyển sang thực sự thiết kế một TextField ưa thích và không nói không với nhà thiết kế của bạn. Để trang trí TextField, chúng ta sử dụng thuộc tính trang trí cần lấy InputDecoration. Vì lớp InputDecoration là rất lớn, chúng ta sẽ cố gắng nhanh chóng vượt qua hầu hết các thuộc tính quan trọng.

Sử dụng các thuộc tính gợi ý và nhãn để cung cấp thông tin cho người dùng

Cả gợi ý và nhãn là các chuỗi giúp người dùng hiểu thông tin được nhập vào TextField. Sự khác biệt là một gợi ý sẽ biến mất khi người dùng bắt đầu nhập trong khi nhãn nổi trên TextField.

Hint

Label

Bạn có thể thêm các “icon”, “prefixIcon” and “suffixIcon”

Bạn có thể thêm các biểu tượng trực tiếp vào TextFields. Bạn cũng có thể sử dụng prefixText và hậu tố cho văn bản thay thế.

TextField(
  decoration: InputDecoration(
    icon: Icon(Icons.print)
  ),
),

Icon using the icon property

TextField(
  decoration: InputDecoration(
    prefixIcon: Icon(Icons.print)
  ),
),

Icon using the prefixIcon property

Tương tự cho bất kỳ widget nào khác, dùng “prefix” thay thế cho “prefixIcon”

Để sử dụng tiện ích chung thay vì biểu tượng, hãy sử dụng trường tiền tố. Một lần nữa, không có lý do rõ ràng, hãy để Thêm một chỉ báo tiến trình vòng tròn trong TextField.

TextField(
  decoration: InputDecoration(
    prefix: CircularProgressIndicator(),
  ),
), 

Mỗi thuộc tính như gợi ý, nhãn, v.v đều có các trường kiểu tương ứng

Để tạo kiểu cho một gợi ý, hãy sử dụng một gợi ý. Để tạo kiểu cho nhãn, hãy sử dụng nhãnStyle.

TextField(
  decoration: InputDecoration(
    hintText: "Demo Text",
    hintStyle: TextStyle(fontWeight: FontWeight.w300, color: Colors.red)
  ),
),

Lưu ý: Mặc dù tôi đã thực hiện nó trong ví dụ này, nhưng nhìn chung không thay đổi màu gợi ý vì nó gây nhầm lẫn cho người dùng.

Sử dụng helperText của người dùng nếu bạn không muốn có nhãn nhưng bạn muốn có một thông điệp bền bỉ cho người dùng.

TextField(
  decoration: InputDecoration(
    helperText: "Hello"
  ),
),

Sử dụng “decoration: null” hoặc InputDecoration.collapsed để loại bỏ underline mặc định của TextField

Sử dụng chúng để xóa phần gạch chân mặc định trên TextField.

TextField(
  decoration: InputDecoration.collapsed(hintText: "")
),

Thêm border vào TextField

TextField(
  decoration: InputDecoration(
    border: OutlineInputBorder()
  )
),

Có một số lượng lớn trang trí bạn có thể làm hơn nữa, nhưng chúng ta có thể đi sâu vào mọi thứ trong một bài viết. Nhưng tôi hy vọng điều này làm cho nó rõ ràng để hiểu cách dễ dàng tùy chỉnh Flutter TextFields.

Thank for reading!

source