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
404/512 câuCòn 108
385Authentication vs Authorization?4 lựa chọn
AiOS only
BAuthorization means login
CSame
DAuth: who you are; Authorization: what you may do
Lời giải
Mở trang câu hỏi này →Authentication và Authorization là hai khái niệm quan trọng trong bảo mật thông tin. Authentication là quá trình xác thực danh tính của một người dùng, giúp xác định ai đang truy cập vào hệ thống. Authorization là quá trình kiểm soát quyền truy cập vào các tài nguyên hệ thống, giúp xác định những gì người dùng được phép làm. Ví dụ, khi bạn đăng nhập vào một trang web, bạn đã thực hiện quá trình Authentication. Sau đó, bạn có thể thực hiện các hành động như xem trang chủ, đăng bài viết, v.v. Đây là quá trình Authorization. Tóm lại, Authentication giúp xác định ai bạn là, trong khi Authorization giúp xác định những gì bạn được phép làm.
386Google Sign-In on Android — SHA fingerprint is for?4 lựa chọn
ACosmetic only
BRename the app
CNot needed in debug
DFirebase/Android verify the app — misconfig often breaks sign-in
Lời giải
Mở trang câu hỏi này →SHA (Secure Hash Algorithm) fingerprint là một chuỗi mã hóa được sử dụng để xác thực ứng dụng Android với Google Sign-In. Nó giúp xác định danh tính của ứng dụng và ngăn chặn các cuộc tấn công giả mạo. Khi bạn đăng ký ứng dụng Android với Google Sign-In, bạn cần cung cấp SHA fingerprint để xác thực danh tính của ứng dụng. Nếu SHA fingerprint không được cung cấp hoặc không chính xác, ứng dụng có thể không thể đăng nhập thành công vào Google Sign-In. Điều này thường xảy ra khi cấu hình Firebase hoặc Android không đúng, dẫn đến việc xác thực bị phá vỡ.
387How do access and refresh tokens usually differ?4 lựa chọn
AAccess short-lived for API calls; refresh longer to obtain new access
BAccess is never sent over HTTP
CIdentical
DRefresh is web-only
Lời giải
Mở trang câu hỏi này →Access và refresh token thường có sự khác biệt trong thời gian tồn tại và mục đích sử dụng. Access token thường có thời gian tồn tại ngắn hạn, thường chỉ từ vài phút đến vài giờ, và được sử dụng để thực hiện các yêu cầu API. Ngược lại, refresh token có thời gian tồn tại dài hơn, thường từ vài giờ đến vài ngày, và được sử dụng để yêu cầu một access token mới khi access token hiện tại đã hết hạn. Điều này cho phép người dùng tiếp tục sử dụng ứng dụng mà không cần phải đăng nhập lại. Ngoài ra, access token thường được gửi qua HTTP trong mỗi yêu cầu API, trong khi refresh token thường không được gửi qua HTTP.
388How is a Bearer access token usually sent?4 lựa chọn
A`Token: ...`
B`Bearer` is not used in HTTP
C`Authorization: Bearer <token>`
D`Cookie: token=...` is always correct
389Integration of Firebase Google Sign-In requires the configuration of SHA keys in the Firebase project.2 lựa chọn
A
TrueB
FalseLời giải
Mở trang câu hỏi này →Để thực hiện tích hợp Google Sign-In với Firebase, bạn cần cấu hình các khóa SHA trong dự án Firebase. Điều này giúp xác thực và bảo mật thông tin đăng nhập của người dùng. Khi bạn thêm ứng dụng của mình vào Firebase, bạn sẽ được yêu cầu cung cấp khóa SHA để xác thực quyền truy cập. Việc cấu hình khóa SHA này là bước quan trọng để đảm bảo an toàn và bảo mật cho ứng dụng của bạn khi sử dụng Google Sign-In.
390Integration tests validate the entire flow of an application, from login to data retrieval.2 lựa chọn
A
TrueB
FalseLời giải
Mở trang câu hỏi này →Các bài kiểm tra tích hợp xác minh toàn bộ luồng của một ứng dụng, từ đăng nhập đến việc truy xuất dữ liệu. Các bài kiểm tra này giúp đảm bảo rằng ứng dụng hoạt động chính xác và toàn diện, bao gồm cả việc kiểm tra các chức năng liên quan đến dữ liệu và giao diện người dùng. Việc kiểm tra toàn bộ luồng ứng dụng giúp phát hiện ra các lỗi và vấn đề tiềm ẩn, từ đó giúp cải thiện chất lượng và độ tin cậy của ứng dụng.
APayload is usually Base64URL — readable; signature prevents tampering, not hiding payload
BOnly servers can read it
CThere is no payload
DYes, always AES
Lời giải
Mở trang câu hỏi này →JWT (JSON Web Token) là một loại token được sử dụng để xác thực người dùng. Payload của JWT chứa các thông tin về người dùng, chẳng hạn như tên, email, v.v. Tuy nhiên, payload không được mã hóa theo cách bí mật như AES. Thay vào đó, nó được mã hóa bằng Base64URL, một phương thức mã hóa không bí mật. Điều này có nghĩa là bất kỳ ai cũng có thể đọc được payload của JWT, nhưng không thể thay đổi hoặc giả mạo nó mà không bị phát hiện. Signature của JWT được tạo bằng cách sử dụng một thuật toán kĩ thuật số, chẳng hạn như HMAC, và được sử dụng để xác thực tính hợp lệ của payload. Vì vậy, mặc dù payload của JWT có thể đọc được, nhưng signature giúp ngăn chặn việc giả mạo hoặc thay đổi payload.
APost token to social media
BKeep forever
CRemove token/session from storage and navigate to login
DClear UI only
Lời giải
Mở trang câu hỏi này →Khi thực hiện logout, việc xóa bỏ các token được lưu trữ cục bộ là một bước quan trọng để đảm bảo bảo mật và ngăn chặn truy cập trái phép. Việc giữ lại các token có thể khiến cho thông tin người dùng bị lộ và bị lợi dụng bởi kẻ tấn công. Vì vậy, khi logout, chúng ta cần xóa bỏ các token và phiên làm việc khỏi bộ nhớ lưu trữ và chuyển hướng người dùng đến trang đăng nhập. Điều này sẽ giúp đảm bảo rằng người dùng phải đăng nhập lại để tiếp tục sử dụng dịch vụ.
393What is session expiration?4 lựa chọn
ATheme reset
BAutomatic logout after inactivity
CUI timeout
DAPI limit
Lời giải
Mở trang câu hỏi này →Session expiration là một tính năng quan trọng trong các hệ thống bảo mật và quản lý truy cập. Nó cho phép hệ thống tự động thoát người dùng khỏi phiên làm việc sau một khoảng thời gian không hoạt động nhất định. Điều này giúp ngăn chặn các cuộc tấn công từ xa và bảo vệ dữ liệu nhạy cảm khỏi bị truy cập trái phép. Khi session expiration được kích hoạt, hệ thống sẽ tự động thoát người dùng khỏi phiên làm việc sau một khoảng thời gian không hoạt động, chẳng hạn như 15 phút, 30 phút hoặc 1 giờ. Điều này giúp đảm bảo rằng người dùng không thể giữ phiên làm việc mở quá lâu và truy cập vào dữ liệu nhạy cảm mà không được phép.
394Why use **HTTPS** in production?4 lựa chọn
AWeb only
BHTTPS banned on mobile
CSlows the app
DProtects tokens/data in transit against eavesdropping
Lời giải
Mở trang câu hỏi này →HTTPS được sử dụng trong sản xuất vì nhiều lý do quan trọng. Trước hết, nó giúp bảo vệ thông tin người dùng, bao gồm cả token và dữ liệu nhạy cảm, khỏi việc bị nghe trộm (eavesdropping) khi truyền qua internet. Điều này đặc biệt quan trọng khi người dùng truy cập vào các trang web hoặc ứng dụng yêu cầu đăng nhập hoặc gửi thông tin nhạy cảm. Ngoài ra, HTTPS còn giúp ngăn chặn các cuộc tấn công từ bên ngoài, chẳng hạn như tấn công man-in-the-middle (MITM), nơi kẻ tấn công cố gắng giả mạo giao tiếp giữa người dùng và trang web hoặc ứng dụng.
A
TrueB
FalseLời giải
Mở trang câu hỏi này →Trong quá trình kiểm tra widget, 'pumpWidget()' là một hàm được sử dụng để render giao diện người dùng (UI) cho phép kiểm tra. Hàm này giúp tạo ra một bản sao của giao diện để chúng ta có thể xem xét và kiểm tra. Nó cho phép chúng ta kiểm tra xem giao diện có hoạt động đúng như mong đợi hay không, đồng thời cũng giúp chúng ta xác định được nguyên nhân của các lỗi. Vì vậy, câu trả lời đúng cho câu hỏi này là 'True'.
396`pump()` vs `pumpAndSettle()` in widget tests?4 lựa chọn
ASame
B`pump` is integration-only
C`pump` advances a frame/short work; `pumpAndSettle` waits for animations/timers to finish
DNeither after tap
Lời giải
Mở trang câu hỏi này →Trong các bài kiểm tra widget, `pump()` và `pumpAndSettle()` là hai phương thức được sử dụng để tiến hành các tác vụ. `pump()` chỉ tiến hành một khung hình hoặc một số tác vụ ngắn, trong khi `pumpAndSettle()` chờ đợi cho đến khi các hiệu ứng animation hoặc timer được hoàn tất. Điều này có nghĩa là nếu bạn chỉ cần tiến hành một tác vụ đơn giản, `pump()` sẽ đủ. Tuy nhiên, nếu tác vụ của bạn bao gồm các hiệu ứng animation hoặc timer, bạn cần sử dụng `pumpAndSettle()` để đảm bảo rằng tác vụ được hoàn tất trước khi tiếp tục kiểm tra.
ANot in Flutter
BWindows only
CIdentical
DIntegration runs E2E on device/emulator with a driver; widget tests use the test engine
Lời giải
Mở trang câu hỏi này →Câu hỏi này hỏi về sự khác biệt giữa **`integration_test`** và `flutter_test`. **`integration_test`** và `flutter_test` đều là các công cụ kiểm tra trong Flutter, nhưng chúng phục vụ cho các mục đích khác nhau. **`flutter_test`** là một công cụ kiểm tra widget, nó kiểm tra các widget và các hành vi của chúng. Trong khi đó, **`integration_test`** là một công cụ kiểm tra tích hợp, nó kiểm tra các tính năng và các giao diện của ứng dụng từ đầu đến cuối (end-to-end) trên thiết bị hoặc máy ảo. Điều này có nghĩa là **`integration_test`** sẽ kiểm tra toàn bộ ứng dụng, bao gồm cả các giao diện người dùng và các tính năng, trong khi **`flutter_test`** chỉ kiểm tra các widget và các hành vi của chúng.
398In Lab 11.2, which function is used to enter text into a `TextField` during a widget test?4 lựa chọn
A
precacheImage()B
tester.enterText()C
ListView.builderD
Navigator.pushNamedLời giải
Mở trang câu hỏi này →Trong Lab 11.2, chúng ta cần tìm hiểu về cách nhập văn bản vào một TextField trong quá trình kiểm tra widget. Để thực hiện điều này, chúng ta sử dụng hàm tester.enterText(). Hàm này cho phép chúng ta nhập văn bản vào TextField một cách dễ dàng và chính xác. Ví dụ, nếu chúng ta muốn nhập văn bản 'Hello World' vào TextField, chúng ta có thể sử dụng lệnh tester.enterText('Hello World'). Điều này giúp chúng ta kiểm tra chức năng của TextField một cách hiệu quả.
AIt ensures the UI avoids system intrusions like notches, status bars, and camera cutouts.
BIt encapsulates all network communication logic, separating it from the UI layer.
CUnit tests validate pure logic, while widget tests validate UI rendering and interaction.
DTo improve performance and prevent sensitive information from being logged in production.
Lời giải
Mở trang câu hỏi này →Trong Lab 12, việc xóa bỏ các câu lệnh `print()` trước khi xây dựng bản phát hành Release là rất quan trọng. Điều này giúp cải thiện hiệu suất và ngăn chặn thông tin nhạy cảm được ghi lại trong môi trường sản xuất. Khi bạn chạy ứng dụng trong môi trường phát triển, việc in ra console thông tin như giá trị biến, trạng thái ứng dụng,... là hoàn toàn bình thường. Tuy nhiên, trong môi trường sản xuất, việc in ra console có thể gây ra vấn đề bảo mật và ảnh hưởng đến hiệu suất ứng dụng. Vì vậy, việc xóa bỏ các câu lệnh `print()` trước khi xây dựng bản phát hành Release giúp đảm bảo ứng dụng hoạt động ổn định và an toàn trong môi trường sản xuất.
A
TrueB
FalseLời giải
Mở trang câu hỏi này →Mẫu AAA trong kiểm thử là một phương pháp kiểm thử đơn vị được sử dụng để viết các trường hợp kiểm thử đơn giản và hiệu quả. Mẫu AAA được chia thành ba phần chính: Arrange, Act và Assert.
Arrange: Đây là phần đầu tiên trong mẫu AAA, nơi bạn sẽ chuẩn bị dữ liệu và môi trường cần thiết cho trường hợp kiểm thử. Bạn sẽ tạo các đối tượng, thiết lập các giá trị và tạo ra các điều kiện cần thiết để thực hiện trường hợp kiểm thử.
Act: Đây là phần thực hiện của mẫu AAA, nơi bạn sẽ thực hiện hành động hoặc phương thức cần kiểm thử. Bạn sẽ gọi phương thức, thực hiện hành động và tạo ra các kết quả mong muốn.
Assert: Đây là phần cuối cùng của mẫu AAA, nơi bạn sẽ xác minh kết quả thực hiện trong phần Act. Bạn sẽ so sánh kết quả thực hiện với kết quả mong muốn và xác định xem trường hợp kiểm thử đã thành công hay chưa.
Mẫu AAA giúp các nhà phát triển viết các trường hợp kiểm thử đơn giản và hiệu quả, giúp họ có thể dễ dàng xác định và sửa lỗi các vấn đề trong mã nguồn.
A
TrueB
FalseLời giải
Mở trang câu hỏi này →Trong một dự án Flutter, các đơn vị kiểm thử (unit tests) nên được lưu trữ trong thư mục 'test/'. Điều này giúp phân biệt rõ ràng giữa mã nguồn chính thức và mã nguồn kiểm thử, đồng thời cũng giúp dễ dàng tìm kiếm và chạy các đơn vị kiểm thử. Việc lưu trữ các đơn vị kiểm thử trong thư mục 'test/' cũng giúp duy trì tính nhất quán và dễ dàng bảo trì dự án.
402What does `find.text('X')` match in widget tests?4 lựa chọn
A`Text` with that exact string (or descendant)
B`TextField` only
CA file on disk
DRoute name
Lời giải
Mở trang câu hỏi này →Trong các widget test, `find.text('X')` được sử dụng để tìm kiếm các widget có chứa chuỗi văn bản 'X'. Điều này có nghĩa là nó sẽ tìm kiếm tất cả các widget có chứa chuỗi 'X' hoặc là con của nó. Ví dụ, nếu bạn có một widget `Text` có nội dung 'Hello World', và một widget `RichText` có nội dung 'Hello World, tôi là một widget khác', thì cả hai widget này đều sẽ được tìm thấy bởi `find.text('Hello World')'. Điều này là vì `find.text('X')` không chỉ tìm kiếm widget `Text` có nội dung chính xác 'X', mà còn tìm kiếm tất cả các widget có chứa chuỗi 'X' hoặc là con của nó.
AIt searches the widget tree for a widget that contains the specified string of text.
BHot Reload updates the UI without losing state, while Hot Restart resets the app state.
CIt uniquely identifies the Form and allows access to its state for validation and saving.
DIt allows a single codebase to render UI using its own engine across different platforms.
Lời giải
Mở trang câu hỏi này →Trong một thử nghiệm widget Flutter, hàm `find.text()` được sử dụng để tìm kiếm một widget cụ thể trong cây widget dựa trên nội dung văn bản mà nó chứa. Hàm này sẽ tìm kiếm widget đầu tiên trong cây widget mà có nội dung văn bản khớp với chuỗi văn bản được chỉ định. Điều này cho phép bạn xác định vị trí của một widget cụ thể trong ứng dụng và kiểm tra xem nó có chứa nội dung văn bản mong muốn hay không. Ví dụ, nếu bạn muốn kiểm tra xem một nút bấm có chứa văn bản 'Xác nhận' hay không, bạn có thể sử dụng hàm `find.text()` để tìm kiếm widget có chứa văn bản này.
AIt prevents unnecessary rebuilds of widgets that do not change during the app's lifecycle.
BIt ensures the UI avoids system intrusions like notches, status bars, and camera cutouts.
CUnit tests validate pure logic, while widget tests validate UI rendering and interaction.
DTo improve performance and prevent sensitive information from being logged in production.
Lời giải
Mở trang câu hỏi này →Trong Flutter, một bài kiểm tra đơn vị (unit test) và một bài kiểm tra widget (widget test) đều đóng vai trò quan trọng trong quá trình phát triển ứng dụng. Bài kiểm tra đơn vị giúp xác minh logic sạch (pure logic) của mã nguồn, trong khi bài kiểm tra widget giúp xác minh cách trình bày và tương tác của giao diện người dùng (UI). Bài kiểm tra đơn vị thường được sử dụng để kiểm tra các hàm, phương thức và lớp, trong khi bài kiểm tra widget được sử dụng để kiểm tra cách các widget được render và tương tác với nhau. Điều này giúp đảm bảo rằng ứng dụng của bạn hoạt động chính xác và ổn định, ngay cả khi có thay đổi trong mã nguồn.