Phỏng vấn Flutter: widget, state management, Dart và hiệu năng

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Flutter cho phép xây dựng ứng dụng di động cho nhiều nền tảng từ một mã nguồn, nên được nhiều công ty và startup lựa chọn. Phỏng vấn Flutter thường xoay quanh Dart, widget, quản lý trạng thái và cách giữ giao diện mượt. Dưới đây là những câu hỏi hay gặp.

Câu hỏi về Dart

Null safety là gì?

Dart có hệ thống null safety giúp phát hiện lỗi truy cập giá trị rỗng ngay lúc biên dịch. Kiểu không nullable như String không được nhận null; kiểu nullable viết là String?. Bạn dùng toán tử ?. để truy cập an toàn, ?? để đặt giá trị mặc định, và ! để khẳng định giá trị không null (nên hạn chế vì có thể gây lỗi lúc chạy).

async, await và Future

Future đại diện cho kết quả sẽ có trong tương lai, async và await giúp viết code bất đồng bộ dễ đọc. Stream là chuỗi các sự kiện theo thời gian, hữu ích cho dữ liệu liên tục như vị trí hay tin nhắn.

final và const

final chỉ gán một lần nhưng giá trị có thể xác định lúc chạy. const là hằng số biết ngay lúc biên dịch. Dùng const cho widget bất biến giúp Flutter bỏ qua việc dựng lại và tăng hiệu năng.

Widget và cây giao diện

Trong Flutter, mọi thứ là widget: nút, văn bản, bố cục, thậm chí cả padding. Giao diện là một cây widget lồng nhau.

StatelessWidget và StatefulWidget

class Greeting extends StatelessWidget {  final String name;  const Greeting({super.key, required this.name});  @override  Widget build(BuildContext context) {    return Text('Xin chào $name');  }}class Counter extends StatefulWidget {  const Counter({super.key});  @override  State<Counter> createState() => _CounterState();}class _CounterState extends State<Counter> {  int count = 0;  @override  Widget build(BuildContext context) {    return TextButton(      onPressed: () => setState(() => count++),      child: Text('Đã bấm $count lần'),    );  }}

Widget không có trạng thái thay đổi dùng StatelessWidget. Khi cần dữ liệu thay đổi theo thời gian, dùng StatefulWidget và gọi setState để báo cho Flutter dựng lại.

Vòng đời của StatefulWidget

Các phương thức chính: initState (khởi tạo một lần), didChangeDependencies, build (gọi mỗi khi cần dựng), didUpdateWidget, dispose (giải phóng tài nguyên như controller, subscription). Quên dispose là nguyên nhân phổ biến gây rò rỉ bộ nhớ.

Ba cây: Widget, Element và RenderObject

Widget là bản mô tả cấu hình bất biến, nhẹ. Element là thể hiện của widget trong cây, quản lý vòng đời. RenderObject chịu trách nhiệm bố cục và vẽ. Khi widget được dựng lại, Flutter so sánh để chỉ cập nhật phần thật sự thay đổi.

Quản lý trạng thái

Đây là chủ đề được hỏi nhiều nhất. Bạn nên biết các hướng chính:

  • setState: đơn giản, phù hợp trạng thái cục bộ của một widget.
  • InheritedWidget và Provider: chia sẻ trạng thái xuống cây widget.
  • Riverpod, Bloc, GetX, MobX: các thư viện quản lý trạng thái với triết lý khác nhau.

Không có câu trả lời duy nhất đúng. Hãy trình bày bạn chọn giải pháp nào trong dự án, vì sao (độ phức tạp, đội ngũ, khả năng kiểm thử) và nhược điểm bạn nhận thấy. Điều người phỏng vấn đánh giá cao là hiểu nguyên tắc: tách logic khỏi giao diện, trạng thái có một nguồn sự thật duy nhất, luồng dữ liệu rõ ràng.

Hiệu năng và giao diện mượt

  • Dùng const widget ở nơi có thể.
  • Chia nhỏ widget để giới hạn phạm vi dựng lại khi trạng thái thay đổi.
  • Dùng ListView.builder cho danh sách dài để chỉ dựng phần đang hiển thị.
  • Tránh công việc nặng trong build; chuyển tính toán nặng sang compute hoặc isolate.
  • Dùng công cụ DevTools để phân tích khung hình và bộ nhớ.

Câu hỏi khác thường gặp

  • Hot reload và hot restart khác nhau? Hot reload giữ trạng thái và nạp lại code, hot restart khởi động lại ứng dụng và xóa trạng thái.
  • Key dùng để làm gì? Giúp Flutter nhận diện đúng widget khi danh sách thay đổi thứ tự hoặc có thêm bớt.
  • Điều hướng giữa màn hình? Navigator, hoặc thư viện định tuyến khai báo như go_router.
  • Gọi API và lưu dữ liệu? Dùng package HTTP, mô hình hóa JSON, lưu cục bộ bằng SharedPreferences hoặc cơ sở dữ liệu cục bộ.

Kết luận

Hãy chuẩn bị một ứng dụng Flutter nhỏ có đăng nhập, gọi API, danh sách và lưu cục bộ, rồi tập giải thích kiến trúc của nó. Nếu bạn nói được vì sao chọn cách quản lý trạng thái đó, bạn đã vượt qua phần lớn câu hỏi.

Để học Flutter qua các dự án thực hành, bạn có thể tham khảo các khóa di động tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment