PRM393Chưa đoKỳ 8Chuyên ngành Cập nhật 07/09/2026
Lập trình di động (Flutter) - Mobile Programming
512Câu hỏi
1Bộ đề
15Chủ đề
5,02 đánh giá
Câu hỏi của môn
364/512 câuCòn 148
345HTTP **201 Created** usually means after POST?4 lựa chọn
AResource created successfully
BToken expired
CClient error
DNo body
Lời giải
Mở trang câu hỏi này →HTTP **201 Created** là trạng thái HTTP được sử dụng khi một yêu cầu POST được thực hiện thành công và một tài nguyên mới được tạo. Điều này thường xảy ra khi một yêu cầu POST được gửi đến một API để tạo một tài nguyên mới. Ví dụ, khi bạn tạo một tài khoản mới trên một trang web, yêu cầu POST sẽ được gửi đến API để tạo tài khoản mới. Nếu yêu cầu này được thực hiện thành công, API sẽ trả về trạng thái HTTP **201 Created** cùng với thông tin về tài nguyên mới được tạo. Điều này cho phép khách hàng biết rằng tài nguyên mới đã được tạo thành công và họ có thể tiếp tục sử dụng nó.
346HTTP 401 vs 403 (exam review)?4 lựa chọn
ASame
B401 is GET-only
C403 is DNS error
D401: not/s wrongly authenticated; 403: authenticated but not authorized
Lời giải
Mở trang câu hỏi này →HTTP 401 và 403 là hai mã trạng thái HTTP khác nhau, nhưng thường bị nhầm lẫn. HTTP 401 là mã trạng thái được sử dụng khi một yêu cầu HTTP được gửi đến một trang web hoặc ứng dụng, nhưng người dùng không được xác thực hoặc xác thực không chính xác. Điều này có nghĩa là người dùng chưa được xác thực hoặc đã được xác thực nhưng thông tin xác thực không chính xác. Ví dụ, khi bạn nhập sai mật khẩu hoặc tên người dùng, bạn sẽ nhận được mã trạng thái 401. Ngược lại, HTTP 403 là mã trạng thái được sử dụng khi người dùng đã được xác thực nhưng không được phép truy cập vào tài nguyên hoặc chức năng cụ thể. Điều này có nghĩa là người dùng đã được xác thực nhưng không có quyền truy cập vào tài nguyên đó. Ví dụ, khi bạn cố gắng truy cập vào một trang web mà bạn không có quyền truy cập, bạn sẽ nhận được mã trạng thái 403. Tóm lại, HTTP 401 được sử dụng khi người dùng không được xác thực hoặc xác thực không chính xác, trong khi HTTP 403 được sử dụng khi người dùng đã được xác thực nhưng không được phép truy cập vào tài nguyên hoặc chức năng cụ thể.
347In a 'Service Layer' architecture, what is the responsibility of the `ApiService` class?4 lựa chọn
AIt creates a stream that can be listened to by multiple subscribers simultaneously.
BIt builds itself based on the latest snapshot of interaction with a Future.
CTo improve performance and prevent sensitive information from being logged in production.
DIt encapsulates all network communication logic, separating it from the UI layer.
Lời giải
Mở trang câu hỏi này →Trong kiến trúc 'Service Layer', trách nhiệm của lớp `ApiService` là bao gồm tất cả logic giao tiếp mạng, tách rời khỏi lớp UI. Điều này có nghĩa là lớp `ApiService` sẽ chịu trách nhiệm thực hiện các yêu cầu mạng, xử lý dữ liệu và trả về kết quả cho lớp UI mà không cần lớp UI phải quan tâm đến chi tiết giao tiếp mạng. Điều này giúp tăng cường bảo mật và dễ dàng bảo trì hệ thống. Ngoài ra, lớp `ApiService` cũng có thể được sử dụng để thực hiện các tác vụ phức tạp như xác thực, kiểm tra quyền truy cập, v.v.
AArrange, Act, and Assert.
BService Layer pattern
CAn authentication token.
DFirebase Authentication
Lời giải
Mở trang câu hỏi này →Trong API DummyJSON được sử dụng trong Lab 10, dữ liệu nào thường được trả về khi đăng nhập thành công để xác định phiên làm việc? Để trả lời câu hỏi này, chúng ta cần hiểu về cơ chế đăng nhập và xác thực trong API. Khi đăng nhập thành công, API sẽ trả về một token xác thực để xác định phiên làm việc của người dùng. Token này thường được sử dụng để xác thực các yêu cầu tiếp theo của người dùng. Vì vậy, trong trường hợp này, câu trả lời đúng là "An authentication token.".
349Movie app uses which API?4 lựa chọn
AGoogle Movies
BIMDb
CTMDB
DNetflix
Lời giải
Mở trang câu hỏi này →Ứng dụng xem phim sử dụng API nào? Câu trả lời đúng là TMDB. TMDB là viết tắt của The Movie Database, là một cơ sở dữ liệu trực tuyến về phim và truyền hình. Nó cung cấp thông tin chi tiết về các bộ phim, bao gồm tóm tắt, diễn viên, đạo diễn, và nhiều hơn nữa. TMDB cũng cung cấp API cho phép các ứng dụng và trang web truy cập vào dữ liệu của họ. Vì vậy, ứng dụng xem phim sử dụng API của TMDB để truy cập vào thông tin về các bộ phim và cung cấp cho người dùng.
A`SocketException`
B`FormatException`
C`StateError`
DAlways `FlutterError`
Lời giải
Mở trang câu hỏi này →Khi gọi HTTP từ Dart mà không gặp lỗi mạng / DNS, những lỗi thường được bắt gặp dưới dạng gì? Để trả lời câu hỏi này, chúng ta cần hiểu về các loại lỗi có thể xảy ra khi gọi HTTP từ Dart. Lỗi mạng / DNS thường được bắt gặp dưới dạng SocketException. Điều này là vì khi gọi HTTP, Dart sẽ sử dụng socket để kết nối với server. Nếu có lỗi mạng / DNS, socket sẽ không thể kết nối được, dẫn đến SocketException. Ngoài ra, còn có các loại lỗi khác như FormatException và StateError, nhưng chúng thường không liên quan đến lỗi mạng / DNS.
AUse `Theme`
BCall `setState`
CUse `ListView`
DScatter `http.get`/`post` across `build()` — use a repository/service
Lời giải
Mở trang câu hỏi này →Repository pattern (khái niệm) là một cách tổ chức mã để tách biệt logic kinh doanh khỏi logic giao diện người dùng. Khi sử dụng Repository pattern, UI không nên thực hiện các hành động sau trực tiếp. Thay vào đó, UI nên giao tiếp với Repository để lấy dữ liệu hoặc thực hiện các hành động kinh doanh. Ví dụ, UI không nên gọi trực tiếp các hàm http.get hoặc http.post để lấy dữ liệu từ server. Thay vào đó, UI nên gọi hàm của Repository để lấy dữ liệu. Điều này giúp giảm sự phức tạp của mã và tăng tính tái sử dụng.
352The 'factory Model.fromJson' constructor is typically used to map API response maps to Dart objects.2 lựa chọn
A
TrueB
FalseLời giải
Mở trang câu hỏi này →Model.fromJson là một phương thức được sử dụng rộng rãi trong lập trình Dart để ánh xạ dữ liệu từ API sang các đối tượng Dart. Khi nhận được một phản hồi từ API, chúng ta thường cần ánh xạ dữ liệu đó sang các đối tượng của ứng dụng để sử dụng. Phương thức Model.fromJson giúp thực hiện việc ánh xạ này một cách dễ dàng và hiệu quả. Nó nhận vào một đối tượng JSON và tạo ra một đối tượng Dart tương ứng, giúp giảm thiểu thời gian và công sức trong việc ánh xạ dữ liệu.
A
TrueB
FalseLời giải
Mở trang câu hỏi này →Trong Flutter, gói 'http' được sử dụng để gửi yêu cầu GET và POST đến các API REST. Gói này cung cấp các phương thức để gửi yêu cầu đến các API, đồng thời cũng cho phép bạn xử lý các phản hồi từ API. Sử dụng gói 'http' giúp bạn có thể dễ dàng tương tác với các API REST trong ứng dụng của mình.
354What does Hot Restart do?4 lựa chọn
AKeeps state
BUpdates UI only
CRestarts app from beginning
DClears IDE
Lời giải
Mở trang câu hỏi này →Hot Restart trong lập trình là một tính năng giúp bạn nhanh chóng thử nghiệm và kiểm tra lại ứng dụng của mình mà không cần phải khởi động lại toàn bộ ứng dụng. Khi bạn sử dụng Hot Restart, ứng dụng sẽ được khởi động lại từ đầu, nhưng các thay đổi mà bạn đã thực hiện sẽ được giữ lại. Điều này giúp bạn có thể nhanh chóng thử nghiệm và kiểm tra lại ứng dụng mà không cần phải chờ đợi quá lâu. Hot Restart thường được sử dụng trong quá trình phát triển ứng dụng để giúp bạn có thể nhanh chóng thử nghiệm và kiểm tra lại các tính năng mới mà không cần phải khởi động lại toàn bộ ứng dụng.
355What is an API timeout used for?4 lựa chọn
ARetry requests
BEncrypt data
CPrevent waiting indefinitely
DSpeed up UI
Lời giải
Mở trang câu hỏi này →Một API timeout là một giới hạn thời gian mà một ứng dụng sẽ chờ đợi trước khi kết thúc một yêu cầu đến từ một API. Mục đích chính của API timeout là ngăn chặn ứng dụng chờ đợi vô hạn khi nhận được phản hồi từ API. Điều này giúp ứng dụng không bị treo hoặc không phản hồi trong thời gian dài, đồng thời cũng giúp giảm thiểu tình trạng quá tải của hệ thống. Khi API timeout được kích hoạt, ứng dụng sẽ tự động hủy bỏ yêu cầu và hiển thị thông báo lỗi cho người dùng. Điều này giúp đảm bảo rằng ứng dụng luôn hoạt động ổn định và phản hồi nhanh chóng.
AThey are the same
BReload never works
CRestart only changes the theme color
DRestart restarts the Dart isolate—state is lost; Reload tries to keep state
Lời giải
Mở trang câu hỏi này →Hot Restart và Hot Reload là hai tính năng giúp bạn nhanh chóng thử nghiệm và phát triển ứng dụng Flutter mà không cần phải khởi động lại ứng dụng. Tuy nhiên, có một số khác biệt giữa hai tính năng này. Hot Restart cho phép bạn nhanh chóng thử nghiệm và phát triển ứng dụng mà không cần phải khởi động lại ứng dụng. Khi bạn sử dụng Hot Restart, ứng dụng sẽ được khởi động lại nhưng trạng thái của ứng dụng sẽ bị mất. Điều này có nghĩa là bất kỳ trạng thái nào mà người dùng đã lưu trữ trong ứng dụng sẽ bị mất khi bạn sử dụng Hot Restart. Hot Reload, mặt khác, cho phép bạn nhanh chóng thử nghiệm và phát triển ứng dụng mà không cần phải khởi động lại ứng dụng. Khi bạn sử dụng Hot Reload, trạng thái của ứng dụng sẽ được giữ lại. Điều này có nghĩa là bất kỳ trạng thái nào mà người dùng đã lưu trữ trong ứng dụng sẽ được giữ lại khi bạn sử dụng Hot Reload. Vì vậy, sự khác biệt chính giữa Hot Restart và Hot Reload là Hot Restart sẽ khởi động lại ứng dụng và mất trạng thái, trong khi Hot Reload sẽ giữ trạng thái của ứng dụng.
AIt creates a stream that can be listened to by multiple subscribers simultaneously.
BIt forces a child to fill the remaining available space in the main axis.
CIt provides a default value if the expression on its left is null.
DIt builds itself based on the latest snapshot of interaction with a Future.
Lời giải
Mở trang câu hỏi này →FutureBuilder là một widget trong Flutter được sử dụng để xây dựng một widget dựa trên kết quả của một Future. Future là một đối tượng có thể được sử dụng để thực hiện một hành động nền, chẳng hạn như tải dữ liệu từ mạng hoặc thực hiện một tác vụ phức tạp. Khi Future được thực hiện, nó sẽ trả về một giá trị hoặc một lỗi. FutureBuilder sẽ sử dụng giá trị này để xây dựng một widget mới. Điều này cho phép bạn xây dựng một widget động dựa trên kết quả của một Future. Ví dụ, bạn có thể sử dụng FutureBuilder để tải dữ liệu từ mạng và sau đó xây dựng một widget để hiển thị dữ liệu đó.
358Which library provides `jsonEncode` / `jsonDecode`?4 lựa chọn
A`dart:convert`
B`package:http/http.dart`
C`flutter/material.dart`
D`dart:io` only
Lời giải
Mở trang câu hỏi này →Thư viện nào cung cấp hàm `jsonEncode` / `jsonDecode`?
AService Layer pattern
BAn authentication token.
CFirebase Authentication
Dint and double
Lời giải
Mở trang câu hỏi này →Mẫu thiết kế UI sử dụng một lớp controller duy nhất để xử lý logic kinh doanh và trạng thái, như trong nhiệm vụ ApiService của Lab 8. Mẫu thiết kế này thường được sử dụng để tách rời logic kinh doanh khỏi lớp trình bày, giúp dễ dàng bảo trì và mở rộng hệ thống. Trong ví dụ này, lớp ApiService đóng vai trò là lớp controller duy nhất chịu trách nhiệm xử lý logic kinh doanh và trạng thái, giúp phân tách logic kinh doanh khỏi lớp trình bày.
360Why avoid `future: fetchPosts()` created fresh directly in `FutureBuilder`’s `build()`?4 lựa chọn
ANo problem
BEach rebuild may repeat the API call
C`FutureBuilder` does not exist
DCompile error
Lời giải
Mở trang câu hỏi này →Khi sử dụng `FutureBuilder` để xây dựng giao diện người dùng, việc tạo một `Future` mới trong mỗi lần rebuild có thể dẫn đến việc gọi API nhiều lần. Điều này có thể gây ra vấn đề hiệu suất và thậm chí là lỗi ứng dụng. Khi bạn tạo một `Future` mới trong mỗi lần rebuild, ứng dụng sẽ gọi API để lấy dữ liệu mới, ngay cả khi dữ liệu đó không thay đổi. Điều này có thể dẫn đến việc gọi API nhiều lần trong một khoảng thời gian ngắn, gây ra vấn đề hiệu suất và thậm chí là lỗi ứng dụng. Vì vậy, để tránh vấn đề này, bạn nên sử dụng một `Future` duy nhất và cập nhật dữ liệu khi cần thiết.
361Why split a repository from the widget?4 lựa chọn
ASlower
BForces SQLite
CNo benefit
DEasier to test/mock HTTP; one place for endpoints + parsing + errors
Lời giải
Mở trang câu hỏi này →Khi tách một repository khỏi widget, mục đích chính là để dễ dàng kiểm tra và mô phỏng HTTP trong ứng dụng. Điều này giúp tập trung tất cả các điểm kết nối, xử lý và lỗi vào một nơi duy nhất, làm cho việc kiểm tra và bảo trì trở nên dễ dàng hơn. Ngoài ra, việc tách repository còn giúp giảm thiểu sự phức tạp và tăng cường khả năng mở rộng của ứng dụng. Điều này đặc biệt quan trọng khi ứng dụng trở nên lớn hơn và phức tạp hơn, vì nó cho phép các nhà phát triển tập trung vào các phần cụ thể của ứng dụng mà không bị ảnh hưởng bởi các phần khác.
362'rootBundle.loadString()' is used to read JSON files stored locally within the application assets.2 lựa chọn
A
TrueB
FalseLời giải
Mở trang câu hỏi này →Phương thức 'rootBundle.loadString()' được sử dụng để đọc các tệp JSON được lưu trữ cục bộ trong tài nguyên ứng dụng. Điều này cho phép bạn đọc dữ liệu từ tệp JSON mà không cần phải tải xuống từ mạng. Phương thức này thường được sử dụng để đọc các tệp cấu hình hoặc dữ liệu cần thiết cho ứng dụng. Để sử dụng phương thức này, bạn cần phải có quyền truy cập vào tài nguyên ứng dụng và tệp JSON cần đọc. Ngoài ra, bạn cũng cần phải đảm bảo rằng tệp JSON được lưu trữ trong thư mục 'assets' của dự án Android.
A
TrueB
FalseLời giải
Mở trang câu hỏi này →SharedPreferences không phù hợp để lưu trữ các cơ sở dữ liệu JSON lớn trên thiết bị cục bộ. Điều này là vì SharedPreferences chỉ hỗ trợ lưu trữ dữ liệu dưới dạng chuỗi và không hỗ trợ lưu trữ dữ liệu phức tạp như JSON. Nếu bạn cần lưu trữ một lượng lớn dữ liệu JSON, bạn nên sử dụng cơ sở dữ liệu như SQLite hoặc các thư viện khác như Room.
ATemp may be cleaned by the OS; documents usually for user data to keep
BDocuments is RAM
CSame
DWeb only
Lời giải
Mở trang câu hỏi này →So sánh giữa `getTemporaryDirectory` và `getApplicationDocumentsDirectory` là một vấn đề quan trọng trong lập trình di động. `getTemporaryDirectory` thường được sử dụng để lưu trữ dữ liệu tạm thời, chẳng hạn như tệp tin tải xuống hoặc tệp tin cache. Tuy nhiên, dữ liệu này có thể bị xóa bởi hệ điều hành bất cứ lúc nào, vì vậy nó không phải là nơi lưu trữ dữ liệu quan trọng. Ngược lại, `getApplicationDocumentsDirectory` thường được sử dụng để lưu trữ dữ liệu của người dùng, chẳng hạn như hình ảnh, video hoặc tệp tin khác. Dữ liệu này thường được giữ lại cho đến khi người dùng xóa nó.