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

344/512 câuCòn 168
ATrue
BFalse
Lời giải
Unit tests trong Flutter được thiết kế để xác minh layout và rendering trực quan của các widget. Chúng giúp phát hiện ra các vấn đề về layout và rendering ngay từ giai đoạn đầu, trước khi ứng dụng được triển khai. Điều này giúp tiết kiệm thời gian và công sức khi phát triển ứng dụng. Ngoài ra, unit tests cũng giúp đảm bảo rằng ứng dụng hoạt động đúng như mong đợi, ngay cả khi có thay đổi về layout hoặc rendering.
Mở trang câu hỏi này →
AControl focus
BChange font size
CManage state
DAdd labels, icons, and hint text
Lời giải
Thuộc tính decoration trong TextField cho phép người dùng thêm các yếu tố như nhãn, biểu tượng và văn bản gợi ý vào TextField. Điều này giúp người dùng có thể dễ dàng hiểu được mục đích của TextField và cách sử dụng nó. Ví dụ, bạn có thể thêm một biểu tượng tìm kiếm vào TextField để người dùng biết rằng họ cần nhập một từ khóa để tìm kiếm. Tương tự, bạn có thể thêm một nhãn vào TextField để người dùng biết rằng họ cần nhập một địa chỉ email hoặc một số điện thoại. Việc thêm các yếu tố này vào TextField không chỉ giúp người dùng hiểu rõ hơn về mục đích của TextField mà còn giúp họ sử dụng nó một cách hiệu quả hơn.
Mở trang câu hỏi này →
AValidate after the user interacts with a field — balances UX
BValidate every frame
CNever validate
DOnly for plain `TextField`
Lời giải
AutovalidateMode.onUserInteraction là một cách thức tự động xác thực dữ liệu trong Flutter. Khi người dùng tương tác với một trường dữ liệu (ví dụ: nhập văn bản vào TextField), thì hệ thống sẽ tự động xác thực dữ liệu đó. Điều này giúp cân bằng giữa trải nghiệm người dùng (UX) và xác thực dữ liệu. Nếu người dùng nhập sai dữ liệu, hệ thống sẽ ngay lập tức hiển thị thông báo lỗi, giúp người dùng biết được lỗi và có thể sửa đổi dữ liệu một cách nhanh chóng. AutovalidateMode.onUserInteraction thường được sử dụng trong các trường dữ liệu quan trọng, như nhập mật khẩu hoặc xác thực thông tin cá nhân.
Mở trang câu hỏi này →
AIt is called exactly once when the widget is inserted into the tree, used for one-time initialisation.
BIt allows for the persistence of simple key-value pairs (like tokens or settings) on the device.
CIt allows a single child widget to be scrollable when it exceeds the screen's vertical or horizontal space.
DIt manages the focus state of a specific widget, such as a text field, and handles keyboard events.
Lời giải
Trong Flutter, FocusNode là một đối tượng được sử dụng để quản lý trạng thái tập trung của một widget cụ thể, chẳng hạn như một trường văn bản. Nó cũng xử lý các sự kiện bàn phím. FocusNode được gọi một lần khi widget được chèn vào cây widget và được sử dụng để thực hiện các tác vụ khởi tạo một lần. Ngoài ra, nó cũng có thể được sử dụng để thực hiện các tác vụ khi widget mất tập trung. FocusNode giúp chúng ta có thể quản lý tập trung của widget một cách linh hoạt và hiệu quả.
Mở trang câu hỏi này →
AHandle validation
BControl which widget has keyboard focus
CManage text value
DStyle the input
Lời giải
Trong trường hợp TextField, focusNode có mục đích là kiểm soát widget nào đang nhận bàn phím. Điều này có nghĩa là khi người dùng nhập liệu vào TextField, focusNode sẽ xác định widget đó đang được chọn. Ví dụ, nếu bạn có một TextField và một Button, focusNode sẽ giúp bạn xác định TextField đang được chọn để nhập liệu. Điều này rất quan trọng trong việc thiết kế giao diện người dùng (UI) vì nó giúp người dùng dễ dàng sử dụng và tương tác với ứng dụng. Ngoài ra, focusNode cũng có thể được sử dụng để tạo ra các hiệu ứng như thay đổi màu sắc hoặc hình dạng của widget khi nó được chọn.
Mở trang câu hỏi này →
330What is the purpose of onSaved callback?4 lựa chọnTrung bình67% trả lời đúng
AReset form
BValidate input
CStore form values
DDisplay errors
Lời giải
Callback onSaved được sử dụng để lưu trữ giá trị của các trường form khi người dùng rời khỏi màn hình. Điều này giúp bạn có thể lấy lại được giá trị của các trường form sau khi người dùng quay lại màn hình. Ví dụ, bạn có thể sử dụng callback này để lưu trữ giá trị của trường nhập liệu khi người dùng nhấn nút submit. Điều này giúp bạn có thể lấy lại được giá trị của trường nhập liệu sau khi người dùng rời khỏi màn hình.
Mở trang câu hỏi này →
331What is the role of a `4 lựa chọncó codeKhó33% trả lời đúng
Đề bài
GlobalKey<FormState>` in Flutter forms?
AIt allows a single codebase to render UI using its own engine across different platforms.
BHot Reload updates the UI without losing state, while Hot Restart resets the app state.
CIt ensures the UI avoids system intrusions like notches, status bars, and camera cutouts.
DIt uniquely identifies the Form and allows access to its state for validation and saving.
Lời giải

Trong Flutter, `GlobalKey<FormState>`đóng vai trò quan trọng trong việc quản lý trạng thái của các form. Nó giúp duy trì trạng thái của form và cho phép truy cập trạng thái này để thực hiện các tác vụ như xác thực và lưu trữ dữ liệu. Điều này cho phép các nhà phát triển dễ dàng quản lý và cập nhật trạng thái của form mà không cần phải viết mã phức tạp. Ngoài ra, `GlobalKey<FormState>`cũng giúp giảm thiểu lỗi và tăng hiệu suất khi sử dụng các form trong ứng dụng Flutter.

Mở trang câu hỏi này →
ArootBundle.loadString()
BAutovalidateMode.onUserInteraction
Cflutter_local_notifications
Dtester.pumpAndSettle()
Lời giải
Để cung cấp phản hồi ngay lập tức cho người dùng khi họ nhập vào một biểu mẫu, bạn nên sử dụng AutovalidateMode.onUserInteraction. Điều này cho phép kiểm tra nhập liệu ngay lập tức khi người dùng nhập vào, giúp người dùng nhận được phản hồi tức thời về việc nhập liệu của họ. Điều này đặc biệt hữu ích khi người dùng nhập vào một biểu mẫu và muốn biết ngay lập tức liệu nhập liệu của họ có hợp lệ hay không. Ngoài ra, sử dụng AutovalidateMode.onUserInteraction cũng giúp người dùng nhận được phản hồi ngay lập tức khi họ thực hiện các hành động như nhấn nút hoặc thay đổi nhập liệu.
Mở trang câu hỏi này →
ArunApp()
BThemeData
Cmain.dart
Dvalidator
Lời giải
Để định nghĩa các chủ đề tùy chỉnh, bao gồm màu sắc và kiểu font, cho toàn bộ ứng dụng Flutter, bạn cần sử dụng lớp ThemeData. Lớp này cho phép bạn tạo ra các chủ đề tùy chỉnh có thể được áp dụng cho toàn bộ ứng dụng. Bạn có thể sử dụng ThemeData để định nghĩa màu sắc, kiểu font, kích thước font, và các thuộc tính khác để tạo ra một chủ đề duy nhất cho ứng dụng của mình. Ngoài ra, bạn cũng có thể sử dụng ThemeData để tạo ra các chủ đề khác nhau cho các màn hình hoặc các phần khác nhau của ứng dụng.
Mở trang câu hỏi này →
AMediaQuery
Bvalidator
Cmain.dart
Dimplements
Lời giải
Để xác định kích thước màn hình, hướng màn hình và khoảng trống của màn hình trong Flutter, bạn có thể sử dụng công cụ 'MediaQuery'. 'MediaQuery' cung cấp thông tin về kích thước màn hình, hướng màn hình và khoảng trống của màn hình, giúp bạn có thể điều chỉnh ứng dụng của mình để phù hợp với các thiết bị khác nhau. Ví dụ, bạn có thể sử dụng 'MediaQuery' để lấy kích thước màn hình và điều chỉnh vị trí của các widget trong ứng dụng của mình. Ngoài ra, 'MediaQuery' cũng cung cấp các phương thức để lấy thông tin về hướng màn hình và khoảng trống của màn hình, giúp bạn có thể điều chỉnh ứng dụng của mình để phù hợp với các thiết bị khác nhau.
Mở trang câu hỏi này →
Aflutter_local_notifications
BrootBundle.loadString()
CAutovalidateMode.onUserInteraction
Dtester.pumpAndSettle()
Lời giải
Để hiển thị thông báo địa phương trên thiết bị của người dùng mà không cần sử dụng một máy chủ đẩy, chúng ta cần sử dụng gói phần mềm phù hợp. Trong các lựa chọn đã cho, gói phần mềm được sử dụng để hiển thị thông báo địa phương là "flutter_local_notifications". Đây là một gói phần mềm phổ biến được sử dụng để hiển thị thông báo trên thiết bị di động chạy hệ điều hành Android và iOS. Nó cho phép bạn tạo và hiển thị thông báo địa phương mà không cần sử dụng một máy chủ đẩy. Ngoài ra, nó cũng cung cấp các tính năng như quản lý thông báo, tùy chỉnh thông báo và hỗ trợ đa ngôn ngữ. Vì vậy, nếu bạn cần hiển thị thông báo địa phương trên thiết bị của người dùng mà không cần sử dụng một máy chủ đẩy, "flutter_local_notifications" là lựa chọn phù hợp.
Mở trang câu hỏi này →
Amain.dart
Bvalidator
CrunApp()
DThemeData
Lời giải
Để xác định logic tùy chỉnh để kiểm tra xem đầu vào có hợp lệ hay không, bạn cần sử dụng thuộc tính "validator" của "TextFormField". Thuộc tính này cho phép bạn định nghĩa các chức năng kiểm tra để xác minh dữ liệu nhập vào.
Mở trang câu hỏi này →
337Why call `validate()` before `save()`?4 lựa chọn
A`validate` clears the form
BOrder does not matter
COnly commit data via `save()` when fields are valid
D`save()` always throws
Lời giải
Khi gọi hàm `validate()` trước `save()`, mục đích chính là để kiểm tra dữ liệu nhập vào có hợp lệ hay không. Nếu dữ liệu không hợp lệ, hàm `validate()` sẽ tự động báo lỗi và ngăn chặn việc lưu trữ dữ liệu vào cơ sở dữ liệu. Điều này giúp đảm bảo rằng dữ liệu được lưu trữ vào cơ sở dữ liệu luôn chính xác và hợp lệ. Vì vậy, việc gọi hàm `validate()` trước `save()` là một bước quan trọng trong quy trình lưu trữ dữ liệu.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
FutureBuilder là một widget trong Flutter có khả năng tự động cập nhật giao diện khi trạng thái của một hoạt động bất đồng bộ thay đổi. Điều này có nghĩa là khi bạn thực hiện một yêu cầu mạng hoặc một quá trình tính toán phức tạp, FutureBuilder sẽ tự động cập nhật giao diện của mình khi kết quả của hoạt động đó thay đổi. Điều này giúp bạn có thể hiển thị trạng thái hiện tại của hoạt động mà không cần phải viết mã phức tạp để cập nhật giao diện.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Mẹo sử dụng json.decode() trong Dart là một phương thức từ thư viện 'dart:convert' giúp chuyển đổi một chuỗi JSON thành một Map hoặc List. Phương thức này rất hữu ích khi bạn cần xử lý dữ liệu JSON trong ứng dụng của mình. Ví dụ, bạn có thể sử dụng json.decode() để chuyển đổi một chuỗi JSON thành một Map và sau đó sử dụng các khóa và giá trị trong Map để truy cập và xử lý dữ liệu. Ngoài ra, phương thức này cũng giúp giảm thiểu lỗi khi xử lý dữ liệu JSON, vì nó sẽ tự động chuyển đổi dữ liệu thành các loại dữ liệu phù hợp.
Mở trang câu hỏi này →
340`Uri.parse` is used to?4 lựa chọn
AReplace `jsonDecode`
BParse JSON
CBuild a `Uri` from a URL string for `http.get`/`post`
DOnly validate email
Lời giải
Hàm `Uri.parse` được sử dụng để xây dựng một đối tượng `Uri` từ một chuỗi URL. Điều này thường được sử dụng trong các yêu cầu HTTP GET hoặc POST để xác định địa chỉ URL của một trang web hoặc một nguồn dữ liệu. Ví dụ, nếu bạn muốn gửi một yêu cầu GET đến trang web https://example.com/api/data, bạn có thể sử dụng hàm `Uri.parse` để tạo một đối tượng `Uri` từ chuỗi URL này. Đối tượng `Uri` này sau đó có thể được sử dụng trong các phương thức HTTP để gửi yêu cầu đến trang web.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Một nút 'Retry' (Làm lại) là một yếu tố UX được khuyến nghị khi một cuộc gọi API dẫn đến trạng thái lỗi. Khi một ứng dụng web thực hiện một cuộc gọi API, nó có thể gặp phải một số vấn đề như kết nối mạng yếu, dữ liệu không chính xác hoặc các vấn đề khác. Trong trường hợp này, nút 'Retry' sẽ giúp người dùng có thể thực hiện lại cuộc gọi API một cách dễ dàng. Điều này giúp cải thiện trải nghiệm người dùng và tăng cường độ tin cậy của ứng dụng. Ngoài ra, nút 'Retry' cũng giúp ứng dụng có thể tự động hóa quá trình xử lý lỗi và giảm thiểu thời gian chờ đợi của người dùng.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Một 'Service Layer' (ApiService) nên xử lý logic mạng để tách biệt nó khỏi mã nguồn UI. Điều này giúp giảm thiểu sự phụ thuộc giữa các lớp và tăng tính bảo trì của ứng dụng. Khi logic mạng được tách biệt khỏi mã nguồn UI, bạn có thể dễ dàng thay đổi hoặc cập nhật logic mạng mà không ảnh hưởng đến giao diện người dùng. Điều này cũng giúp giảm thiểu sự phức tạp của mã nguồn và tăng hiệu suất của ứng dụng. Ngoài ra, việc tách biệt logic mạng cũng giúp dễ dàng thực hiện các tính năng mới mà không ảnh hưởng đến mã nguồn hiện có.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Hot Reload là một tính năng giúp bạn cập nhật mã nguồn của ứng dụng mà không cần phải khởi động lại ứng dụng. Tuy nhiên, điều quan trọng cần lưu ý là Hot Reload không phải lúc nào cũng reset toàn bộ trạng thái của ứng dụng. Nó chỉ cập nhật các thay đổi trong mã nguồn mà không ảnh hưởng đến trạng thái hiện tại của ứng dụng. Vì vậy, câu trả lời đúng cho câu hỏi này là không phải là True.
Mở trang câu hỏi này →
AIt uniquely identifies the Form and allows access to its state for validation and saving.
BIt searches the widget tree for a widget that contains the specified string of text.
CIt allows a single codebase to render UI using its own engine across different platforms.
DHot Reload updates the UI without losing state, while Hot Restart resets the app state.
Lời giải
Hot Reload và Hot Restart là hai tính năng quan trọng trong Flutter giúp tăng tốc độ phát triển ứng dụng. Hot Reload cho phép cập nhật mã nguồn mà không cần phải khởi động lại ứng dụng, giúp bạn xem được kết quả ngay lập tức. Trong khi đó, Hot Restart lại khởi động lại ứng dụng từ đầu, giúp bạn có thể thử nghiệm các thay đổi mà không ảnh hưởng đến trạng thái hiện tại của ứng dụng. Điều này giúp bạn có thể nhanh chóng thử nghiệm và sửa lỗi trong quá trình phát triển ứng dụng.
Mở trang câu hỏi này →