Flutter và những câu hỏi thường gặp khi phỏng vấn

7 tháng 4, 2021 By DEVERA ACADEMY

Nếu bạn đã biết ít nhiều về Flutter, bài viết này sẽ giúp bạn hệ thống lại những kiến thức bạn cần phải nắm rõ để chuẩn bị cho một buổi phỏng vấn thành công. Ngược lại, nếu bạn hoàn toàn chưa biết Flutter là gì? Thì bài viết này chắc chắn sẽ giúp bạn hiểu được những điều cơ bản.


Flutter là gì?

Flutter là một open-source UI SDK (Software Development Kit) được tạo ra bởi Google. Flutter được sử dụng để phát triển các ứng dụng cho cả Android, iOS, Linux, Mac, Windows và cả web sử dụng một codebase. Để lập trình với Flutter bạn sử dụng một ngôn ngữ lập trình gọi là Dart.


Dart là gì?

Là một ngôn ngữ lập trình đa mục đích, được tối ưu hóa về phía khách hàng cho nhiều nền tảng được phát triển bởi Google có thể dùng để xây dựng ứng dụng di động, desktop, web, server.

Dart là một ngôn ngữ hướng đối tượng, được xác định theo lớp, với cơ chế garbage-collected, sử dụng cú pháp kiểu C và có thể biên dịch thành JavaScript.


Design-specific widgets

Flutter framework bao gồm 2 bộ widget phù hợp với các ngôn ngữ design tương ứng.

  • Material Design widget dùng để triển khai ngôn ngữ thiết kế cùng tên của Google.

  • Cupertino widget triển khai các hướng dẫn giao diện người dùng iOS Human của Apple


Quy ước đặt tên của Flutter/Dart

  • UpperCamelCase - Class, kiểu enum, typedefs, các extensions và tham số

  • lowerCamelCase - Định danh, hằng số và phương thức.

  • lowercase_with_underscore - Thư viện, packages, đường dẫn, source files.


Flutter Doctor


Lệnh dùng để kiểm tra môi trường được thiết lập trong máy của bạn sau đó trả về một báo cáo về tình trạng cài đặt Flutter trong máy của bạn và chỉ ra cho bạn những phần mềm mà có thể bạn sẽ cần hay những task bạn cần thực hiện.


Flutter Clean


Lệnh dùng xóa bộ nhớ cache trong quá trình build project.


File pubspec.yaml là gì?

pubspec.yaml là file mà bạn cung cấp tất cả những tài nguyên cần thiết cho Flutter project của bạn ví dụ như: các plugin, Dart version, font, images. Đồng thời, đây cũng là nơi cấu hình tên project cũng như là phần mô tả.


Các lệnh Flutter pub

Flutter pub get - Dùng để lấy các dependency được liệt kê bên trong file pubspec.yaml. Nếu bộ cache hệ thống không chứa sẵn các dependency thì pub get sẽ cập nhật lại cache, download các dependency cần thiết. Lệnh này cũng tạo một file .packages để kết nối package ngược lại với cách của hệ thống.

flutter pub upgrade - lấy phiên bản mới nhất của các dependency được liệt kê bên trong file pubspec.yaml.


Widget là gì? Có mấy loại widget?

Có phải mọi thứ bên trong Flutter đều là widget? Widget là những thành phần có liên quan đến giao diện người dùng. Có 2 loại widget:

  • StatelessWidget

  • StatefulWidget

Sự khác biệt giữa stateful và stateless widget?

  • Stateless widget yêu cầu một trạng thái (State) cố định, widget chỉ được khởi tạo trạng thái một lần đồng nghĩa với việc các phương thức của nó cũng như vậy. Một cách hiểu đơn giản hơn là Stateless widget không thể thay đổi trạng thái trong suốt quá trình chạy ứng dụng, nếu bạn muốn thay đổi widget đó bạn phải tạo một instance mới.

  • Stateful widget thì ngược lại, nó có thể biến đổi và thay đổi trạng thái(State) nhiều lần trong suốt quá trình chạy ứng dụng.

State nghĩa là gì? Công dụng của setState()

  • State là một bộ biến chứa các giá trị/thuộc tính của một widget.

  • setState() là một cách cơ bản để bạn có thể đưa ra yêu cầu refresh hoặc rebuild màn hình ứng dụng với giá trị/thuộc tính mới.

Vì State object được tạo bởi framework nên muốn thay đổi widget chúng ta cần phải update state object bằng cách sử dụng hàm setState() (dùng cho Stateful widget).

Các method của Stateful widget

  • createState() — trả về một state object cho widget

  • initState() — gọi sau khi tạo object để khởi tạo

  • didChangeDependencies() — sau khi khởi thạo để xem được lần build đầu tiên.

  • build() —gọi ngay sau đó để build 

  • didChangeDependencies() - gọi mỗi lúc chúng ta cần render UI và trả về một widget’s tree.

  • didUpdateWidget() — khi có thay đổi ở parent widget và chũng ta cần vẽ lại UI

  • deactivate() — gọi trước dispose() khi object này bị xóa khỏi widget’s tree

  • dispose() — deallocating tất cả widget and state.


Khác biệt giữa hot reload, hot restart và full restart?

  • Hot reload có khả năng tải lại code của ứng dụng và re-build lại widget tree mà không cần khởi động lại. Đồng thời việc nó không chạy lại các hàm main hay initState() sẽ giúp tiết kiệm thời gian và không bị mất trạng thái hiện tại.

  • Hot restart sẽ tải lại toàn bộ thay đổi, khởi động lại ứng dụng Flutter và cũng khởi tạo lại trạng thái ứng ứng dụng.

  • Full restart khởi động lại toàn bộ ứng dụng iOS, Android hay web, vì phải compile lại Java/ Kotlin/ ObjC/ Swift code nên nó sẽ mất khá nhiều thời gian. Đối với web, Full restart cũng khởi động lại Dart Development Compiler.

3 cách điều hướng màn hình

  • Điều hướng trực tiếp với MaterialPageRoute:



  • Điều hướng tĩnh với map route - tạo một map trong MaterialApp sau đó sử dụng tên để push.

Tạo route map trong MaterialApp:


Push bằng tên:



  • Điều hướng động sử dụng onGenerateRoute trong class MaterialApp



Các chế độ build của Flutter

Bộ công cụ của Flutter cung cấp 3 chế độ:

  • Debug mode - sử dụng trong quá trình phát triển ứng dụng, khi bạn dùng hot reload

  • Profile mode - sử dụng khi bạn muốn phân tích performance

  • Release mode - Khi app của bạn đã sẵn sàng cho việc đưa vào sử dụng

Các kiểu tham số bên trong Dart Function

Có 2 kiểu tham số là: bắt buộc và không bắt buộc.


Các tham số không bắt buộc thường không cần giá trị khi bạn gọi hàm và thường được khai báo sau các tham số bắt buộc, sẽ có các giá trị mặc định dành cho các tham số không bắt buộc.


class Future bên trong ngôn ngữ Dart

Future dùng để đại diện cho một giá trị hay một error sẵn có trong tương lai. 

Receiver của Future có thể gọi xử lý các giá trị hay error đã sẵn có đó.


future là gì?

future là một thể hiện của Future class đại diện cho các hoạt dộng của lập trình bất đồng bộ. Có 2 trạng thái là: uncomplete hoặc completed

  • Uncompleted: khi bạn gọi một hàm không đồng bộ mà nó trả về một future với trạng thái uncompleted thì Future này đang chờ cho các hoạt động không đồng bộ của hàm kết thúc hoặc trả về một error.

  • Completed: nếu một hành động không đồng bộ thực hiện thành công: future có thể hoàn thành với một giá trị hoặc hoàn thành với một error.


Lập trình đồng bộ

Trong lập trình đồng bộ, code sẽ được thực thi theo thứ tự từng dòng.

  • Synchronous operation — Chặn các hoạt động khác nó diễn ra khi nó đang chạy.

  • Synchronous function — Chỉ thực hiện trên các hoạt động đồng bộ


Lập trình không đồng bộ

Lập trình không đồng bộ cho phép chương trình của bạn hoàn thành công việc trong khi đang chờ tác vụ khác.

  • Asynchronous operation — Khi được khởi tạo, hoạt động của lập trình không đồng bộ có thể bị chen ngang bởi tác vụ khác.

  • Asynchronous function — Thực hiện ít nhất một hoạt động bất đồng bộ và có thể thực hiện hoạt động đồng bộ.


async function sẽ chạy giống như lập trình đồng bộ cho đến khi gặp từ khóa await đầu tiên. Thế nên, có thể xem toàn bộ phần code trước từ khóa await đầu tiên là một chương trình đồng bộ.

async và await là gì?

async và await là những từ khóa cung cấp cho chúng ta cách khai báo chương trình bất đồng bộ.

  • async - đặt trước thân một hàm để nó trở thành bất đồng bộ.

  • await - chỉ sử dụng bên trong async để đánh dấu kết thúc việc bất đồng bộ.


So sánh giữa asnyc và async*?

  • async thuộc class Future — thêm từ khóa async vào thân hàm, nó sẽ return kết quả kiểu Future.

  • async* thuộc class Stream - thêm từ khóa  async* vào hàm, nó sẽ trả về rất nhiều future cũng một lúc. Kết quả là kiểu Stream.

Null-aware Operators 

Trong Dart, Null-aware Operators cho phép bạn tính toán dựa trên giá trị đó có phải là null hay không, nó giúp bạn viết gọn các biểu thức dài. Ví dụ:

  • ??



  • ??=


  • ?.



Spread Operator 

Bạn có thể sử dụng spread operator (...) để chèn tất cả giá trị của một list vào một list khác. Ví dụ:



Collection if

Xây dựng một collection có sử dụng điều kiện



Collection for

Xây dựng một collection có sử dụng vòng lặp


dynamic — var — final

  • dynamic — có thể thay đổi các kiểu dữ liệu và giá trị.

  • var — không thể thay đổi kiểu dữ liệu nhưng có thể thay đổi giá trị.

  • final — không thể thay đổi cả kiểu lẫn giá trị về sau.


Những lợi ích từ Flutter

  • Phát triển đa nền tảng và nhanh.

  • Cộng đồng sử dụng rộng lớn.

  • Live, Hot Reloading giúp thuận tiện cho quá trình xây dựng ứng dụng.

  • Cung cấp sự quen thuộc về Performance, giao diện và cảm nhận.


Tác giả: Sri Kathiravan

Dịch bởi Devera Academy