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

164/512 câuCòn 348
ATrue
BFalse
Lời giải
Hàm 'identical(a, b)' trả về giá trị True nếu cả hai biến tham chiếu đến cùng một đối tượng cụ thể trong bộ nhớ. Điều này có nghĩa là cả hai biến đều đang trỏ đến cùng một địa chỉ nhớ, và thay đổi giá trị của một biến sẽ ảnh hưởng đến cả hai biến. Ví dụ, nếu chúng ta có một biến 'x' và một biến 'y', và cả hai biến đều trỏ đến cùng một đối tượng, thì việc thay đổi giá trị của 'x' sẽ làm thay đổi giá trị của 'y'. Hàm 'identical(a, b)' thường được sử dụng để kiểm tra xem hai biến có tham chiếu đến cùng một đối tượng hay không.
Mở trang câu hỏi này →
ACatches a specific type before falling through to a general `catch`
BOnly for Flutter UI
CCatches everything including syntax errors
DInvalid in Dart
Lời giải
Trong Dart, lệnh `try { } on SpecificException catch (e) { }` được sử dụng để bắt một loại ngoại lệ cụ thể trước khi rơi xuống một `catch` chung. Lệnh `on` cho phép chúng ta bắt một loại ngoại lệ cụ thể mà không cần phải bắt tất cả các loại ngoại lệ. Điều này giúp chúng ta có thể xử lý ngoại lệ cụ thể một cách hiệu quả hơn. Ví dụ, nếu chúng ta muốn bắt ngoại lệ `SpecificException` mà không cần phải bắt tất cả các loại ngoại lệ khác, chúng ta có thể sử dụng lệnh `try { } on SpecificException catch (e) { }`. Khi ngoại lệ `SpecificException` xảy ra, lệnh `catch` sẽ được thực thi và chúng ta có thể xử lý ngoại lệ đó theo cách riêng biệt.
Mở trang câu hỏi này →
147A constructor is used to?4 lựa chọn
ADestroy object
BCreate object
CCall function
DImport library
Lời giải
Một constructor trong lập trình là một hàm đặc biệt được sử dụng để tạo ra một đối tượng mới. Nó được gọi khi một đối tượng mới được tạo ra và được sử dụng để khởi tạo các thuộc tính và phương thức của đối tượng. Constructor giúp tạo ra một đối tượng có trạng thái ban đầu và giúp lập trình viên có thể sử dụng các thuộc tính và phương thức của đối tượng một cách dễ dàng. Ví dụ, khi bạn tạo ra một đối tượng Vehicle, constructor sẽ giúp khởi tạo các thuộc tính như màu sắc, số chỗ ngồi, tốc độ,... và giúp bạn có thể sử dụng các phương thức như di chuyển, dừng xe,...
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Trong Dart, một Factory Constructor là một phương thức đặc biệt trong một lớp, được sử dụng để tạo ra một đối tượng mới. Nó khác với các phương thức constructor khác vì nó không phải luôn luôn tạo ra một đối tượng mới. Ví dụ, một Factory Constructor có thể được sử dụng để tạo ra một đối tượng từ một đối tượng khác. Tuy nhiên, một Factory Constructor trong một lớp abstract hoặc một lớp abstract final phải luôn luôn trả về một đối tượng mới. Điều này là do một lớp abstract hoặc một lớp abstract final không thể được tạo ra trực tiếp, và Factory Constructor được sử dụng để tạo ra một lớp con cụ thể. Vì vậy, trong trường hợp này, câu trả lời đúng là True.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
CRUD là viết tắt của các từ tiếng Anh Create, Read, Update và Design. Tuy nhiên, trong thực tế, Design không phải là một phần của CRUD. CRUD thường được sử dụng để mô tả các hoạt động cơ bản của quản lý dữ liệu, bao gồm tạo mới dữ liệu (Create), đọc dữ liệu (Read), cập nhật dữ liệu (Update) và xóa dữ liệu (Delete). Vì vậy, câu trả lời đúng cho câu hỏi này là False, vì Design không phải là một phần của CRUD.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Dart có một câu lệnh switch cho phép thực hiện các khối mã khác nhau dựa trên giá trị của một biến. Câu lệnh switch được sử dụng để kiểm tra giá trị của một biến và thực hiện các hành động khác nhau dựa trên giá trị đó. Điều này giúp làm cho mã của bạn ngắn gọn và dễ đọc hơn. Ví dụ, nếu bạn có một biến với các giá trị khác nhau và bạn muốn thực hiện các hành động khác nhau dựa trên giá trị của biến đó, thì câu lệnh switch là một lựa chọn tốt.
Mở trang câu hỏi này →
Aimport 'dart:math' as math;
Balias 'dart:math';
Cuse dart:math -> math;
Dimport as 'dart:math' math;
Lời giải
Để nhập thư viện với bút danh, bạn cần sử dụng từ khóa 'as' sau từ khóa 'import'. Ví dụ, nếu bạn muốn nhập thư viện 'dart:math' với bút danh 'math', bạn sẽ nhập như sau: 'import 'dart:math' as math;'. Điều này cho phép bạn sử dụng các hàm và biến của thư viện 'dart:math' mà không cần phải nhập đầy đủ tên thư viện. Điều này giúp cho mã nguồn của bạn trở nên ngắn gọn và dễ đọc hơn.
Mở trang câu hỏi này →
152How do you create an object in Dart?4 lựa chọn
APerson = new();
BPerson p = new Person();
CPerson();
Dobject Person();
Lời giải

Để tạo một đối tượng trong Dart, bạn cần sử dụng từ khóa 'new' và gọi đến hàm constructor của lớp đó. Ví dụ, nếu bạn muốn tạo một đối tượng của lớp 'Person', bạn cần sử dụng phương thức constructor 'Person()'. Tuy nhiên, trong Dart, bạn không thể chỉ gọi đến phương thức constructor mà không gán nó vào một biến. Vì vậy, cách tạo đối tượng trong Dart là gán phương thức constructor vào một biến. Ví dụ: 'Person p = new Person(); '. Đây là cách tạo đối tượng trong Dart.

Mở trang câu hỏi này →
AIdentical
B`implements` is only for enum
C`extends` disallows @override
D`implements` requires you to reimplement the public API with no inherited implementation; `extends` inherits code
Lời giải
Tính từ khóa `implements` và `extends` trong lập trình hướng đối tượng (OOP) có chức năng khác nhau. Khóa từ `extends` cho phép một lớp con kế thừa các thuộc tính và phương thức từ lớp cha. Trong khi đó, `implements` chỉ cho phép lớp con thực hiện các phương thức đã được định nghĩa trong một giao diện (interface). Điều này có nghĩa là khi sử dụng `implements`, lớp con phải định nghĩa lại toàn bộ giao diện mà không được kế thừa bất kỳ phương thức nào từ lớp cha. Ngược lại, khi sử dụng `extends`, lớp con có thể kế thừa các phương thức và thuộc tính từ lớp cha và bổ sung thêm các phương thức mới hoặc thay thế các phương thức đã có. Ví dụ, nếu một lớp cha có phương thức `public void eat()`, lớp con sử dụng `extends` có thể kế thừa phương thức này và bổ sung thêm phương thức `public void sleep()`. Trong khi đó, lớp con sử dụng `implements` phải định nghĩa lại toàn bộ giao diện và không được kế thừa bất kỳ phương thức nào từ lớp cha.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Trong Dart, một constructor được đặt tên cho phép một lớp có nhiều constructor khác nhau với mục đích khác nhau. Điều này cho phép bạn tạo ra nhiều phương thức khởi tạo khác nhau cho một lớp, mỗi phương thức khởi tạo có thể có các tham số và hành vi khác nhau. Ví dụ, bạn có thể có một constructor được đặt tên để tạo ra một đối tượng mới từ một ID, và một constructor khác để tạo ra một đối tượng mới từ một tập hợp dữ liệu. Điều này giúp tăng cường tính linh hoạt và dễ sử dụng của lớp.
Mở trang câu hỏi này →
A`div`
B`~/`
C`%`
D`/` (always yields double)
Lời giải
Trong Dart, để thực hiện phép chia số nguyên (integer division) cho hai giá trị `int`, bạn cần sử dụng toán tử `~/`. Ví dụ, nếu bạn muốn chia 10 cho 3, kết quả sẽ là 3.333333333333333, nhưng nếu bạn sử dụng toán tử `~/`, kết quả sẽ là 3. Điều này là vì toán tử `~/` thực hiện phép chia số nguyên, bỏ qua phần thập phân. Trong khi đó, toán tử `/` luôn trả về kết quả là một số thực (double), và toán tử `%` được sử dụng để tìm phần dư của phép chia. Toán tử `div` không phải là một toán tử hợp lệ trong Dart.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Hàm ?? trong Dart được sử dụng để cung cấp giá trị mặc định nếu biểu thức được đánh giá là null. Nó giúp tránh lỗi Null Pointer khi làm việc với các đối tượng có thể là null.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
File 'main.dart' đóng vai trò là điểm nhập vào bắt buộc cho bất kỳ ứng dụng Flutter nào. Nó là nơi khởi tạo ứng dụng và chứa mã nguồn chính của ứng dụng. Khi bạn tạo một ứng dụng Flutter mới, Dart sẽ tự động tạo một file 'main.dart' với một cấu trúc cơ bản. Trong file này, bạn sẽ khai báo các widget và các hàm cần thiết để chạy ứng dụng. Vì vậy, file 'main.dart' là điểm bắt đầu quan trọng và không thể thiếu cho bất kỳ ứng dụng Flutter nào.
Mở trang câu hỏi này →
AOnly to create widgets
BReplace `main()`
CForce a private class
DJSON parsing, singletons, returning subtypes or cached instances—not always a new instance per call
Lời giải
Các nhà máy xây dựng là một phương thức đặc biệt trong lập trình, được sử dụng để tạo ra các đối tượng mới mà không cần phải tạo một đối tượng mới hoàn toàn. Thay vào đó, nó có thể được sử dụng để tạo ra các đối tượng đã được lưu trữ trước đó, chẳng hạn như đối tượng singleton, hoặc để tạo ra các đối tượng con (subtypes) từ các đối tượng cha (super types). Điều này giúp giảm thiểu việc tạo ra các đối tượng mới và cải thiện hiệu suất của chương trình. Ngoài ra, các nhà máy xây dựng cũng có thể được sử dụng để thực hiện các tác vụ phức tạp như JSON parsing, nơi mà việc tạo ra các đối tượng mới không phải là cần thiết.
Mở trang câu hỏi này →
159What does `with MyMixin` on a class do?4 lựa chọn
AMixes mixin implementation into the class (subject to `on` constraints)
BOnly in tests
CRemoves methods
DImports a file
Lời giải
Khi sử dụng từ khóa `with` kèm theo tên mixin trong một lớp, điều này có nghĩa là lớp đó đang kế thừa các tính chất và phương thức từ mixin đó. Tuy nhiên, việc kế thừa này có thể bị hạn chế bởi các ràng buộc `on`. Điều này cho phép bạn linh hoạt hơn trong việc quản lý các tính chất và phương thức của mixin, giúp giảm thiểu sự trùng lặp và tăng cường tính tái sử dụng của mã. Ví dụ, nếu bạn có một mixin có tên là `MyMixin` và bạn muốn lớp `MyClass` kế thừa các tính chất và phương thức từ mixin đó, bạn có thể sử dụng từ khóa `with` như sau: `class MyClass with MyMixin:`. Điều này sẽ giúp lớp `MyClass` có thể truy cập và sử dụng các tính chất và phương thức được định nghĩa trong mixin `MyMixin`.
Mở trang câu hỏi này →
ASkips one iteration
BExits the loop completely
CRestarts the loop
DPauses the loop
Lời giải

Trong lập trình Dart, lệnh break được sử dụng để thoát khỏi vòng lặp khi một điều kiện được đáp ứng. Khi gặp lệnh break trong một vòng lặp, Dart sẽ ngay lập tức thoát khỏi vòng lặp đó và tiếp tục thực hiện mã lệnh sau vòng lặp. Điều này khác với lệnh return, mà chỉ thoát khỏi hàm hiện tại. Lệnh break có thể được sử dụng trong các loại vòng lặp khác nhau như for, while, do-while. Ví dụ, nếu bạn muốn thoát khỏi một vòng lặp khi một biến đạt đến một giá trị cụ thể, bạn có thể sử dụng lệnh break như sau:

Lời giải
if (tong >= 10) {
  break;
}

Vì vậy, lệnh break giúp bạn thoát khỏi vòng lặp khi cần thiết, giúp code của bạn trở nên gọn gàng và dễ đọc hơn.

Mở trang câu hỏi này →
161What does the continue statement do?4 lựa chọn
AEnds the loop
BSkips to the next iteration
CStops the program
DExits the current block
Lời giải
Trong lập trình, câu lệnh continue được sử dụng để bỏ qua phần còn lại của một lặp và chuyển sang phần còn lại của lặp. Nó không kết thúc lặp, mà chỉ bỏ qua phần còn lại của lặp hiện tại và chuyển sang phần còn lại của lặp. Ví dụ, nếu bạn đang lặp qua một mảng và muốn bỏ qua phần còn lại của lặp khi gặp một điều kiện nào đó, bạn có thể sử dụng câu lệnh continue để thực hiện điều này. Câu lệnh continue chỉ áp dụng cho các lặp có thể được lặp lại, chẳng hạn như for, while.
Mở trang câu hỏi này →
162What does this keyword refer to?4 lựa chọn
AClass name
BGlobal variable
CCurrent object
DParent class
Lời giải
Từ khóa này thường được sử dụng để chỉ mục tiêu của phương thức hiện tại, tức là đối tượng đang được xử lý. Nó cho phép truy cập các thuộc tính và phương thức của đối tượng này. Ví dụ, nếu bạn đang sử dụng một phương thức của một lớp, từ khóa này sẽ cho phép bạn truy cập các thuộc tính và phương thức của lớp đó.
Mở trang câu hỏi này →
AThe program crashes
BDart automatically creates a default constructor
CYou can’t create objects
DYou must use new
Lời giải
Nếu bạn không định nghĩa một constructor trong một lớp Dart, thì Dart sẽ tự động tạo ra một constructor mặc định. Điều này có nghĩa là bạn vẫn có thể tạo ra các đối tượng từ lớp đó mà không cần phải định nghĩa constructor. Constructor mặc định sẽ được tạo ra tự động với các tham số rỗng, cho phép bạn tạo ra các đối tượng mà không cần phải cung cấp bất kỳ thông tin nào. Điều này giúp giảm thiểu số lượng mã và làm cho việc phát triển trở nên dễ dàng hơn. Tuy nhiên, nếu bạn muốn định nghĩa một constructor có các tham số cụ thể, thì bạn vẫn có thể làm điều đó và Dart sẽ không tự động tạo ra constructor mặc định.
Mở trang câu hỏi này →
AIt prints null
BIt gives a runtime error
CIt prints 0
DIt assigns default value
Lời giải
Khi bạn cố gắng sử dụng một biến muộn trước khi khởi tạo, chương trình sẽ gặp lỗi thời gian chạy. Điều này xảy ra vì biến muộn chưa được khởi tạo giá trị, và khi bạn cố gắng truy cập nó, chương trình sẽ không thể tìm thấy giá trị của biến đó. Lỗi này thường xảy ra khi bạn sử dụng biến muộn trong một đoạn mã mà biến đó chưa được khởi tạo. Ví dụ, nếu bạn có một biến muộn được khai báo trong một hàm, và bạn cố gắng sử dụng biến đó trước khi hàm đó được thực thi, chương trình sẽ gặp lỗi thời gian chạy.
Mở trang câu hỏi này →