PRM393Chưa đoKỳ 8Chuyên ngành Cập nhật 07/09/2026

Lập trình di động (Flutter) - Mobile Programming

Lập trình di động với Flutter là môn học xây dựng ứng dụng đa nền tảng Android và iOS bằng Flutter và ngôn ngữ Dart. Ngân hàng câu hỏi trắc nghiệm PRM393 có giải thích bao quát trọn bộ chương trình: cài đặt Flutter SDK, cấu trúc project, hot reload và DevTools, nền tảng Dart (kiểu dữ liệu, null safety, class, collection, Map, generics, mixin, package và import), lập trình bất đồng bộ với Future, async/await, Stream, StreamController và StreamBuilder, dựng giao diện bằng widget tree, Scaffold, ListView, ThemeData, bố cục Row/Column, GridView, Stack, LayoutBuilder, MediaQuery và responsive UI, điều hướng với Navigator 1.0/2.0, named route, deep link và guarded route, form với TextEditingController và validation, gọi REST API bằng http, parse JSON, FutureBuilder, phân trang và caching, lưu trữ cục bộ bằng SharedPreferences, SQLite (sqflite) và Hive, xác thực bằng token và refresh token, quản lý state với setState, Provider, BLoC và Cubit, animation với Tween cùng AnimatedSwitcher, tối ưu hiệu năng bằng RepaintBoundary và thu hẹp phạm vi rebuild, kiểm thử unit/widget/integration, quản lý mã nguồn bằng Git và build - release ứng dụng. Tài liệu ôn thi FE dành cho sinh viên FPT University.

512Câu hỏi
1Bộ đề
15Chủ đề
5,02 đánh giá

Câu hỏi của môn

104/512 câuCòn 408
AJava
BKotlin
CSwift
DDart
Lời giải
Flutter là một framework để xây dựng ứng dụng di động và web. Để viết ứng dụng Flutter, người dùng cần sử dụng ngôn ngữ lập trình Dart. Dart là một ngôn ngữ lập trình được thiết kế đặc biệt cho việc xây dựng ứng dụng di động và web. Nó cung cấp các tính năng như tính động, an toàn và hiệu suất cao. Dart cũng được tích hợp chặt chẽ với các công cụ và thư viện của Flutter, giúp người dùng có thể xây dựng ứng dụng một cách dễ dàng và hiệu quả. Vì vậy, khi nói đến việc viết ứng dụng Flutter, Dart là ngôn ngữ lập trình được sử dụng phổ biến nhất.
Mở trang câu hỏi này →
86Which of the following is valid?4 lựa chọn
Adynamic x = 5; x = “Hello”;
Bdynamic x = 5; x = true;
Cdynamic x;
DAll of the above
Lời giải
Câu hỏi này yêu cầu bạn xác định loại khai báo biến động trong lập trình. Trong C#, từ khóa 'dynamic' cho phép bạn khai báo biến có thể được gán giá trị khác nhau trong suốt quá trình thực thi chương trình. Ví dụ, bạn có thể gán giá trị số, chuỗi, hoặc thậm chí là giá trị boolean vào biến đã được khai báo với từ khóa 'dynamic'. Với câu trả lời 'dynamic x = 5; x = “Hello”;', bạn đang khai báo biến 'x' có giá trị ban đầu là số 5, sau đó gán giá trị chuỗi 'Hello' vào biến này. Câu trả lời 'dynamic x = 5; x = true;' cũng tương tự, bạn đang khai báo biến 'x' có giá trị ban đầu là số 5, sau đó gán giá trị boolean 'true' vào biến này. Cuối cùng, câu trả lời 'dynamic x;' chỉ khai báo biến 'x' mà không gán giá trị ban đầu nào vào nó. Tất cả các câu trả lời trên đều là hợp lệ và được chấp nhận trong lập trình C#.
Mở trang câu hỏi này →
87Who developed Flutter?4 lựa chọn
AApple
BMicrosoft
CGoogle
DMeta
Lời giải
Flutter là một công cụ phát triển ứng dụng di động được phát triển bởi Google. Nó được thiết kế để giúp các nhà phát triển tạo ra các ứng dụng di động đa nền tảng với một bộ công cụ duy nhất. Flutter sử dụng ngôn ngữ lập trình Dart để xây dựng các ứng dụng, và nó cung cấp một bộ công cụ mạnh mẽ để tạo ra các giao diện người dùng đẹp mắt và hiệu suất cao. Flutter đã trở thành một trong những công cụ phát triển ứng dụng di động phổ biến nhất trên thế giới, và nó được sử dụng bởi hàng triệu nhà phát triển trên toàn cầu. Các ứng dụng được xây dựng bằng Flutter bao gồm các ứng dụng di động, ứng dụng web và thậm chí cả các ứng dụng desktop.
Mở trang câu hỏi này →
88`?.` and `??` in null safety:4 lựa chọn
A`?.` safely accesses if non-null; `??` supplies a value when the left side is null
B`?.` always throws if null
C`??` is only for List
DBoth force non-null
Lời giải
Trong lập trình an toàn null, `?.` và `??` là hai toán tử quan trọng. `?.` được gọi là toán tử null-aware, nó cho phép truy cập vào một đối tượng hoặc phương thức mà không gây ra lỗi null. Ví dụ, nếu bạn có một biến `user` có thể là null, thì bạn có thể sử dụng `user?.name` để truy cập vào tên của người dùng mà không gây ra lỗi. Nếu `user` là null, thì biểu thức sẽ trở thành null thay vì gây ra lỗi. `??` là toán tử null-coalescing, nó cho phép cung cấp một giá trị mặc định khi đối tượng hoặc phương thức bên trái là null. Ví dụ, `user?.name ?? 'Unknown'` sẽ trả về tên của người dùng nếu có, hoặc 'Unknown' nếu không có. Điều này giúp tránh các lỗi null và làm cho mã của bạn trở nên an toàn hơn. Tóm lại, `?.` được sử dụng để truy cập vào đối tượng hoặc phương thức mà không gây ra lỗi null, trong khi `??` được sử dụng để cung cấp một giá trị mặc định khi đối tượng hoặc phương thức bên trái là null.
Mở trang câu hỏi này →
AIt is never lazy
BYou usually need `toList()` / `for-in` to actually run and collect results
CIt is already a full `List` right after `map`
DOnly works with `Set`
Lời giải

Khi sử dụng hàm `map` trên một đối tượng có thể lặp lại (`Iterable`), nó sẽ trả về một đối tượng có thể lặp lại lazy. Điều này có nghĩa là kết quả của hàm `map` sẽ không được tính toán ngay lập tức, mà sẽ được tính toán khi bạn thực sự cần nó. Để lấy được kết quả của hàm `map`, bạn thường cần sử dụng phương thức `toList()` hoặc vòng lặp `for-in`. Ví dụ, nếu bạn có một danh sách các số và muốn tạo một danh sách các số bình phương, bạn có thể sử dụng hàm `map` như sau: ```swift

Lời giải
let numbers = [1, 2, 3, 4, 5]
let squares = numbers.map { $0 * $0 }
print(squares) // [1, 4, 9, 16, 25]

``` Tuy nhiên, nếu bạn muốn lấy được kết quả của hàm `map` ngay lập tức, bạn có thể sử dụng phương thức `toList()` như sau: ```swift

Lời giải
let numbers = [1, 2, 3, 4, 5]
let squares = numbers.map { $0 * $0 }.toList()
print(squares) // [1, 4, 9, 16, 25]

``` Tóm lại, hàm `map` trên `Iterable` trả về một đối tượng có thể lặp lại lazy, và bạn thường cần sử dụng phương thức `toList()` hoặc vòng lặp `for-in` để lấy được kết quả.

Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Một tập hợp Dart là một tập hợp dữ liệu cho phép lưu trữ các giá trị trùng lặp. Tập hợp Dart không giống như các tập hợp trong toán học, nơi mà các phần tử phải duy nhất. Trong Dart, bạn có thể thêm nhiều lần một phần tử vào tập hợp, và nó sẽ không gây ra lỗi. Điều này làm cho tập hợp Dart trở thành một công cụ mạnh mẽ trong việc quản lý và thao tác dữ liệu. Ví dụ, bạn có thể sử dụng tập hợp để lưu trữ các giá trị duy nhất trong một danh sách, hoặc để loại bỏ các phần tử trùng lặp trong một tập hợp.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Khi thêm từ khóa 'const' vào các widget tĩnh trong ứng dụng, nó ngăn chặn chúng được xây dựng lại trong quá trình cập nhật ứng dụng. Điều này là do từ khóa 'const' chỉ định rằng giá trị của widget không thể thay đổi sau khi được khởi tạo. Vì vậy, khi ứng dụng được cập nhật, các widget 'const' sẽ không bị ảnh hưởng bởi các thay đổi và vẫn giữ nguyên trạng thái ban đầu. Điều này giúp tăng hiệu suất và giảm thiểu thời gian tải lại ứng dụng.
Mở trang câu hỏi này →
92const variables are?4 lựa chọn
ARuntime values
BAssigned later
CCompile-time constants
DNullable
Lời giải
Biến hằng trong lập trình là những giá trị được xác định trước khi chương trình được biên dịch. Chúng được sử dụng để lưu trữ các giá trị không thay đổi trong suốt quá trình chạy chương trình. Biến hằng thường được sử dụng để lưu trữ các giá trị như tên lớp, tên phương thức, tên biến, v.v. Chúng được xác định bằng từ khóa const và không thể được thay đổi sau khi được khai báo.
Mở trang câu hỏi này →
93Dart is a ____ language4 lựa chọn
AProcedural
BObject-oriented
CAssembly
DMarkup
Lời giải
Dart là một ngôn ngữ lập trình hướng đối tượng. Nó được thiết kế để tạo ra các ứng dụng di động và web nhanh chóng và hiệu quả. Ngôn ngữ này hỗ trợ các tính năng như lớp, kế thừa, đa hình và giao diện. Dart cũng có thể được sử dụng để tạo ra các ứng dụng máy tính để bàn và các ứng dụng khác. Nó được sử dụng rộng rãi trong việc phát triển các ứng dụng di động và web bằng cách sử dụng framework Flutter. Dart cung cấp một môi trường lập trình mạnh mẽ và linh hoạt, giúp các nhà phát triển có thể tạo ra các ứng dụng phức tạp và đa dạng.
Mở trang câu hỏi này →
94Dart is developed by?4 lựa chọn
AApple
BMicrosoft
CGoogle
DAmazon
Lời giải
Dart là một ngôn ngữ lập trình được phát triển bởi Google. Nó được thiết kế để xây dựng các ứng dụng di động và web. Dart được giới thiệu lần đầu tiên vào năm 2011 và đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất hiện nay. Dart có thể được sử dụng để xây dựng các ứng dụng di động trên các nền tảng khác nhau, bao gồm cả Android và iOS. Nó cũng có thể được sử dụng để xây dựng các ứng dụng web và các ứng dụng máy tính để bàn. Dart được biết đến với tính linh hoạt và khả năng mở rộng cao, khiến nó trở thành lựa chọn phổ biến cho các nhà phát triển phần mềm.
Mở trang câu hỏi này →
95Entry point of a Dart program is?4 lựa chọn
Astart()
Brun()
Cinit()
Dmain()
Lời giải
Câu hỏi này hỏi về điểm nhập vào của một chương trình Dart. Điểm nhập vào là nơi mà chương trình bắt đầu thực hiện. Trong Dart, điểm nhập vào được xác định bởi hàm chính, được gọi là 'main()'. Hàm này là nơi mà chương trình được thực hiện và nó được gọi khi chương trình được chạy. Các lựa chọn khác như 'start()', 'run()', 'init()' không phải là điểm nhập vào chính thức của một chương trình Dart.
Mở trang câu hỏi này →
Atypeof(var)
Bvar.type
Cvar.runtimeType
DgetType(var)
Lời giải
Để kiểm tra loại biến trong lập trình, bạn cần sử dụng các hàm hoặc phương thức khác nhau tùy thuộc vào ngôn ngữ lập trình. Trong trường hợp này, chúng ta đang tìm kiếm cách kiểm tra loại biến trong một số ngôn ngữ lập trình phổ biến. Các lựa chọn bao gồm: typeof(var), var.type, var.runtimeType và getType(var).
Mở trang câu hỏi này →
Aint.parse()
BtoInt()
Ccast()
Dconvert()
Lời giải

Để chuyển đổi một chuỗi thành số nguyên trong Dart, bạn có thể sử dụng phương thức int.parse(). Phương thức này sẽ nhận vào một chuỗi và trả về một số nguyên. Ví dụ, bạn có thể sử dụng nó như sau: int number = int.parse('123');. Ngoài ra, bạn cũng có thể sử dụng toán tử toInt() để chuyển đổi một chuỗi thành số nguyên, nhưng phương thức int.parse() thường được khuyến nghị hơn vì nó hỗ trợ nhiều loại chuỗi hơn.

Mở trang câu hỏi này →
AMust use `equals()` via reflection
BUse `==`
CCannot compare
DOnly compare via `hashCode`
Lời giải

Để so sánh hai giá trị của cùng một enum trong Dart, bạn có thể sử dụng toán tử ==. Điều này là vì Dart tự động implement phương thức equals() và hashCode() cho các enum. Vì vậy, bạn có thể so sánh hai giá trị enum một cách trực tiếp mà không cần sử dụng reflection hoặc các phương thức khác. Ví dụ: enum Color { red, green, blue };

Lời giải
void main() {
  Color color1 = Color.red;
  Color color2 = Color.red;
  if (color1 == color2) {
    print('Hai

màu sắc giống nhau'); } }

Mở trang câu hỏi này →
99How does `const` differ from `final`?4 lựa chọn
A`const` can be reassigned
BNo difference
C`final` is only inside classes
D`const` requires compile-time values; `final` is single assignment but can be runtime (e.g. `DateTime.now()`)
Lời giải
Câu hỏi này liên quan đến việc so sánh hai từ khóa trong lập trình Dart: `const` và `final`. Từ khóa `const` được sử dụng để chỉ định một biến không thể thay đổi giá trị sau khi được khởi tạo. Trong khi đó, từ khóa `final` chỉ định một biến có thể được gán giá trị một lần duy nhất, nhưng có thể được khởi tạo tại runtime. Điều này có nghĩa là `final` có thể được sử dụng với các giá trị được tính toán tại thời điểm chạy chương trình, trong khi `const` chỉ có thể được sử dụng với các giá trị được biết trước tại thời điểm biên dịch. Ví dụ, nếu bạn muốn tạo một biến `final` với giá trị là thời gian hiện tại, bạn có thể sử dụng `DateTime.now()`, nhưng nếu bạn muốn tạo một biến `const` với giá trị là thời gian hiện tại, bạn sẽ phải biết trước thời gian đó tại thời điểm biên dịch.
Mở trang câu hỏi này →
ASame
B`[a]` nests a List as one element; `[...a]` spreads elements of `a`
CBoth are compile errors
D`...` is only for Map
Lời giải
Khi sử dụng List literal trong JavaScript, `[a]` và `[...a]` có thể được sử dụng khi `a` là một List. Tuy nhiên, có sự khác biệt giữa hai cách này. `[a]` sẽ tạo một List mới và chứa List `a` làm một phần tử duy nhất. Điều này có thể được sử dụng khi bạn muốn tạo một List mới và thêm List `a` vào đó. `[...a]` sẽ tạo một List mới và chứa tất cả các phần tử của List `a`. Điều này có thể được sử dụng khi bạn muốn tạo một List mới và thêm tất cả các phần tử của List `a` vào đó. Ví dụ, nếu bạn có một List `a = [1, 2, 3]`, thì `[a]` sẽ tạo một List mới `[ [1, 2, 3] ]`, trong khi `[...a]` sẽ tạo một List mới `[1, 2, 3]. Vì vậy, `[a]` sẽ tạo một List mới và chứa List `a` làm một phần tử duy nhất, trong khi `[...a]` sẽ tạo một List mới và chứa tất cả các phần tử của List `a`.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Trong Dart, chuỗi chèn (String interpolation) cho phép chèn biểu thức vào chuỗi sử dụng ký tự '$'. Điều này cho phép bạn tạo ra chuỗi phức tạp mà không cần sử dụng các phương thức như concat() hoặc format(). Ví dụ, bạn có thể tạo chuỗi như sau: 'Xin chào, tôi là $name' nơi $name là một biến. Điều này giúp cho việc viết mã trở nên dễ dàng và rõ ràng hơn.
Mở trang câu hỏi này →
AColumn arranges children vertically, while Row arranges children horizontally.
BIt insets its child by a specified amount of space.
CIt forcefully asserts that a nullable expression is non-null.
DIt manages the platform-specific transition animation between screens.
Lời giải
Trong ngữ cảnh an toàn null của Dart, toán tử ! (bang) có chức năng đặc biệt là ép buộc một biểu thức nullable thành không null. Điều này có nghĩa là toán tử ! sẽ loại bỏ khả năng null của một biểu thức, giúp tránh được các lỗi null reference. Ví dụ, nếu bạn có một biến nullable và muốn sử dụng nó như một biến không null, bạn có thể sử dụng toán tử ! để ép buộc nó thành không null. Tuy nhiên, sử dụng toán tử ! không phải lúc nào cũng là một ý tưởng tốt, vì nó có thể che giấu các lỗi null reference và khiến mã code trở nên khó hiểu hơn. Vì vậy, bạn nên sử dụng toán tử ! một cách cẩn thận và chỉ khi thực sự cần thiết.
Mở trang câu hỏi này →
AJIT in dev; AOT on mobile release for near-native performance
BJIT only
CJIT and AOT are identical
DAOT is web-only
Lời giải
JIT (Just-In-Time) và AOT (Ahead-Of-Time) là hai phương pháp biên dịch khác nhau trong Dart/Flutter. JIT là một phương pháp biên dịch được thực hiện trong thời gian chạy, tức là khi ứng dụng đang chạy trên thiết bị. AOT là một phương pháp biên dịch được thực hiện trước khi ứng dụng được chạy, tức là trước khi ứng dụng được phát hành. Trong Dart/Flutter, JIT thường được sử dụng trong môi trường phát triển (dev) để cung cấp hiệu suất nhanh chóng và linh hoạt. Tuy nhiên, khi ứng dụng được phát hành trên thiết bị di động, AOT thường được sử dụng để cung cấp hiệu suất gần như tự nhiên. Điều này là vì AOT có thể được tối ưu hóa cho từng thiết bị và hệ điều hành cụ thể, dẫn đến hiệu suất cao hơn. Vì vậy, câu trả lời chính xác là JIT trong môi trường phát triển và AOT khi ứng dụng được phát hành trên thiết bị di động để đạt được hiệu suất gần như tự nhiên.
Mở trang câu hỏi này →
104Named parameters are wrapped in?4 lựa chọn
A( )
B[ ]
C{ }
D< >
Lời giải
Các tham số được đặt tên được bọc trong ngoặc nhọn { }. Ví dụ: function (name: string, age: number) { ... }
Mở trang câu hỏi này →