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

284/512 câuCòn 228
ATrue
BFalse
Lời giải
Widget 'Hero' được sử dụng để tạo hiệu ứng chuyển đổi giữa các màn hình khác nhau. Nó cho phép bạn tạo một hiệu ứng chuyển đổi hấp dẫn và chuyên nghiệp giữa các màn hình, giúp tăng cường trải nghiệm người dùng. Ví dụ, bạn có thể sử dụng Hero để chuyển đổi giữa màn hình chính và màn hình chi tiết sản phẩm. Hero cũng cho phép bạn thêm các hiệu ứng chuyển đổi như lật, xoay, hoặc di chuyển để tạo ra một hiệu ứng chuyển đổi độc đáo.
Mở trang câu hỏi này →
266What does Navigator.pop() do?4 lựa chọn
ARestart app
BOpen a new screen
CClear stack
DClose current screen
Lời giải
Navigator.pop() là một phương thức trong Flutter được sử dụng để loại bỏ một màn hình khỏi ngăn xếp màn hình. Khi bạn gọi Navigator.pop(), nó sẽ loại bỏ màn hình hiện tại khỏi ngăn xếp và quay trở lại màn hình trước đó. Điều này có nghĩa là nếu bạn đang ở màn hình A và bạn gọi Navigator.pop(), bạn sẽ quay trở lại màn hình B nếu màn hình B là màn hình trước đó trong ngăn xếp. Nếu ngăn xếp chỉ có một màn hình, thì việc gọi Navigator.pop() sẽ đóng ứng dụng. Vì vậy, Navigator.pop() không chỉ đơn giản là đóng màn hình hiện tại mà còn có thể ảnh hưởng đến ngăn xếp màn hình.
Mở trang câu hỏi này →
267What is a route in Flutter?4 lựa chọn
AA database path
BAn abstraction for a screen or page
CA theme configuration
DA network request
Lời giải
Trong Flutter, một route (hay còn gọi là đường dẫn) là một khái niệm quan trọng trong việc quản lý các màn hình hoặc trang. Nó đại diện cho một màn hình hoặc trang cụ thể trong ứng dụng. Một route có thể được xem như một điểm đến trong ứng dụng, nơi mà người dùng có thể di chuyển đến từ một màn hình hoặc trang khác. Mỗi route có thể có một số thuộc tính như tên, tham số, và hành vi khi người dùng di chuyển đến hoặc rời khỏi màn hình đó. Các route trong Flutter thường được sử dụng để quản lý các màn hình khác nhau trong ứng dụng, chẳng hạn như màn hình đăng nhập, màn hình đăng ký, hoặc màn hình chính của ứng dụng.
Mở trang câu hỏi này →
ABetter animations
BReduced memory usage
CFaster performance
DEasier navigation management in large apps
Lời giải
Sử dụng đường dẫn tên (named routes) mang lại nhiều lợi ích trong việc quản lý điều hướng, đặc biệt là trong các ứng dụng lớn. Khi sử dụng đường dẫn tên, bạn có thể dễ dàng quản lý và cập nhật các trang trong ứng dụng mà không cần phải thay đổi mã nguồn. Điều này giúp giảm thiểu lỗi và tăng cường hiệu suất của ứng dụng. Ngoài ra, đường dẫn tên cũng giúp bạn dễ dàng thực hiện các tác vụ như chuyển hướng và cập nhật trạng thái ứng dụng. Điều này đặc biệt hữu ích khi bạn cần quản lý nhiều trang và tính năng trong ứng dụng.
Mở trang câu hỏi này →
AAutomatic themes
BBetter control over the navigation stack
CSimpler code
DFaster rendering
Lời giải
Navigator 2.0 là một công cụ hỗ trợ thiết kế giao diện người dùng, giúp người dùng có thể tạo ra các ứng dụng di động và web với giao diện đẹp mắt và dễ sử dụng. Trong đó, ưu điểm chính của Navigator 2.0 là người dùng có thể có được sự kiểm soát tốt hơn đối với ngăn xếp điều hướng. Điều này có nghĩa là người dùng có thể dễ dàng quản lý các trang và chuyển đổi giữa chúng một cách linh hoạt. Điều này giúp người dùng có thể tạo ra các ứng dụng có giao diện dễ sử dụng và dễ dàng di chuyển giữa các trang.
Mở trang câu hỏi này →
ATheme management
BScreen navigation
CAPI calls
DState management
Lời giải
Trong Flutter, Navigator đóng vai trò quan trọng trong việc quản lý các trang màn hình. Nó cho phép bạn di chuyển giữa các màn hình khác nhau trong ứng dụng của mình. Navigator sử dụng một cấu trúc cây để quản lý các trang màn hình, giúp bạn dễ dàng di chuyển giữa các màn hình và quản lý trạng thái của ứng dụng. Khi bạn sử dụng Navigator, bạn có thể dễ dàng thêm hoặc xóa các trang màn hình khỏi cây cấu trúc, giúp bạn quản lý ứng dụng của mình một cách hiệu quả.
Mở trang câu hỏi này →
AIt forcefully asserts that a nullable expression is non-null.
BIt manages the platform-specific transition animation between screens.
CColumn arranges children vertically, while Row arranges children horizontally.
DIt contains the source code for unit, widget, and integration tests.
Lời giải
Trong Flutter, `MaterialPageRoute` là một lớp được sử dụng để quản lý chuyển đổi màn hình giữa các trang. Nó giúp tạo ra các hiệu ứng chuyển đổi mượt mà và hấp dẫn giữa các màn hình, tùy thuộc vào nền tảng mà ứng dụng đang chạy. Ví dụ, trên Android, `MaterialPageRoute` sẽ tạo ra một hiệu ứng chuyển đổi giống như trên các thiết bị Android, trong khi trên iOS, nó sẽ tạo ra một hiệu ứng chuyển đổi giống như trên các thiết bị iOS. Điều này giúp tạo ra một trải nghiệm người dùng mượt mà và thống nhất trên tất cả các nền tảng.
Mở trang câu hỏi này →
AWrap
BHero
Ctrue
DCard
Lời giải
Khi sử dụng hàm `identical(a, b)` trong Dart, nó sẽ trả về giá trị `true` nếu cả hai biến `a` và `b` tham chiếu đến cùng một đối tượng. Trong trường hợp này, chúng ta đang nói về một lớp đơn thể (singleton class). Lớp đơn thể là một lớp chỉ có một đối tượng được tạo ra trong suốt quá trình chạy chương trình. Nếu cả hai biến tham chiếu đến cùng một đối tượng của lớp đơn thể, hàm `identical(a, b)` sẽ trả về `true`, vì chúng đang tham chiếu đến cùng một đối tượng.
Mở trang câu hỏi này →
AiOS only
BDeclarative stack/URL sync — better for web and complex deep links
CRemoves routes
DNo difference
Lời giải
Navigator 2.0 được thiết kế để giải quyết các vấn đề của Navigator 1.0, đặc biệt là trong việc quản lý các liên kết phức tạp và đồng bộ hóa giữa stack và URL. Navigator 1.0 chủ yếu tập trung vào các ứng dụng di động iOS, trong khi Navigator 2.0 được tối ưu hóa cho cả web và các ứng dụng di động phức tạp. Điều này cho phép Navigator 2.0 xử lý các liên kết sâu và phức tạp một cách hiệu quả hơn, đồng thời đảm bảo rằng trạng thái của ứng dụng được đồng bộ hóa chính xác giữa stack và URL. Điều này đặc biệt quan trọng trong các ứng dụng có nhiều màn hình và yêu cầu quản lý trạng thái phức tạp.
Mở trang câu hỏi này →
AiOS plist only
B`pubspec.yaml`
C`AndroidManifest.xml` (`intent-filter` on the activity)
D`main.dart` only
Lời giải

Android deep links là một tính năng cho phép ứng dụng Android mở trang cụ thể trong ứng dụng khác khi người dùng nhấp vào liên kết. Để khai báo Android deep links, bạn cần thêm thông tin vào file `AndroidManifest.xml`. Cụ thể, bạn cần thêm thẻ `intent-filter` vào hoạt động (activity) mà bạn muốn khai báo deep links. Trong thẻ `intent-filter`, bạn cần thêm thông tin về loại dữ liệu mà hoạt động này có thể xử lý và hành động mà hoạt động này sẽ thực hiện khi nhận được dữ liệu đó. Ví dụ, nếu bạn muốn khai báo deep links cho hoạt động xem chi tiết sản phẩm, bạn có thể thêm thẻ `intent-filter` như sau:

Lời giải
<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:scheme="https" android:host="example.com" android:pathPrefix="/product"/>
</intent-filter>

Bằng cách thêm thẻ `intent-filter` này, bạn đã khai báo deep links cho hoạt động xem chi tiết sản phẩm và cho phép người dùng mở trang này bằng cách nhấp vào liên kết có dạng https://example.com/product/...

Mở trang câu hỏi này →
AWrap
BCard
CForm
DHero
Lời giải
Trong lập trình web, khi tạo một trang web có nhiều trường nhập liệu (form field), chúng ta cần một cách tổ chức và nhóm các trường này lại với nhau. Lớp nào trong các lựa chọn dưới đây có thể đóng vai trò như một hộp chứa (container) để nhóm các trường nhập liệu này lại?
Mở trang câu hỏi này →
ACard
BSet
Cas
DHero
Lời giải
Trong Dart, có nhiều loại dữ liệu tập hợp (collection) khác nhau. Để lưu trữ một tập hợp không có thứ tự và chứa các giá trị duy nhất, chúng ta sử dụng loại dữ liệu tập hợp gọi là Set. Set là một tập hợp không có thứ tự, không có giá trị trùng lặp và không có chỉ mục. Điều này giúp chúng ta dễ dàng lưu trữ và tìm kiếm các giá trị trong tập hợp. Ví dụ, nếu chúng ta muốn lưu trữ một tập hợp các màu sắc duy nhất, chúng ta có thể sử dụng Set.
Mở trang câu hỏi này →
AHero
Bas
CSet
DCard
Lời giải

Để chuyển đổi một đối tượng sang một loại cụ thể trong Dart, bạn cần sử dụng toán tử 'as'. Ví dụ, nếu bạn có một biến có kiểu Object và bạn muốn chuyển đổi nó sang kiểu String, bạn có thể sử dụng toán tử 'as' như sau: var str = obj as String; Điều này sẽ giúp bạn truy cập các phương thức và thuộc tính của kiểu String mà không cần phải thực hiện các kiểm tra kiểu phức tạp. Tuy nhiên, nếu bạn cố gắng chuyển đổi một đối tượng sang một kiểu không phù hợp, Dart sẽ không phát hiện ra lỗi và sẽ không báo cáo bất kỳ thông báo nào. Vì vậy, bạn cần phải đảm bảo rằng đối tượng có thể được chuyển đổi sang kiểu mong muốn.

Mở trang câu hỏi này →
AForm
BHero
CCard
DWrap
Lời giải
Widget Hero trong Flutter được thiết kế để xử lý chuyển đổi màn hình, nơi một phần tử 'bay' từ màn hình này sang màn hình khác. Nó cho phép bạn tạo ra các hiệu ứng chuyển đổi màn hình hấp dẫn và chuyên nghiệp. Hero widget thường được sử dụng để hiển thị hình ảnh hoặc văn bản trên các màn hình khác nhau, tạo ra một trải nghiệm người dùng liền mạch và thú vị. Để sử dụng Hero widget, bạn cần đặt nó vào một vị trí cụ thể trên màn hình và sau đó sử dụng nó trong các màn hình khác để tạo ra chuyển đổi màn hình.
Mở trang câu hỏi này →
APOST
BWrap
CCard
DHero
Lời giải
Phương thức HTTP được sử dụng phổ biến để gửi dữ liệu đến máy chủ để tạo một tài nguyên mới là POST. Khi sử dụng phương thức POST, bạn có thể gửi dữ liệu dưới dạng chuỗi, đối tượng JSON hoặc tệp tin. Điều này cho phép bạn tạo một tài nguyên mới trên máy chủ, chẳng hạn như tạo một tài khoản mới, thêm một sản phẩm vào giỏ hàng hoặc tạo một bài đăng mới. Phương thức POST thường được sử dụng trong các ứng dụng web để tạo, cập nhật hoặc xóa dữ liệu trên máy chủ.
Mở trang câu hỏi này →
AHero
BWrap
Chttp
DCard
Lời giải
Để thực hiện các yêu cầu HTTP trong ứng dụng Flutter, bạn cần sử dụng một gói (package) phù hợp. Trong các lựa chọn đã cho, gói nào là tiêu chuẩn cho việc này?
Mở trang câu hỏi này →
AHero
BCard
CForm
DWrap
Lời giải
Widget được sử dụng để áp dụng một phong cách hình ảnh đồng nhất (như bóng và góc tròn) vào một mảnh nội dung là Card. Card là một thành phần thường được sử dụng trong thiết kế giao diện người dùng để trình bày thông tin một cách rõ ràng và hấp dẫn. Nó có thể bao gồm hình ảnh, tiêu đề, văn bản và các yếu tố khác. Khi sử dụng Card, bạn có thể áp dụng các hiệu ứng hình ảnh như bóng, góc tròn, màu sắc và kiểu chữ để tạo ra một phong cách hình ảnh đồng nhất và chuyên nghiệp.
Mở trang câu hỏi này →
AWrap
BHero
CCard
DForm
Lời giải
Widget được sử dụng để hiển thị các con trỏ trong nhiều 'run' ngang hoặc dọc song song, tự động cuộn khi không gian hết. Trong Flutter, widget Wrap được sử dụng để hiển thị các con trỏ trong nhiều hàng hoặc cột. Khi không gian hết, widget Wrap sẽ tự động cuộn sang hàng hoặc cột tiếp theo. Điều này giúp người dùng dễ dàng xem và tương tác với các con trỏ trong ứng dụng.
Mở trang câu hỏi này →
A`read` always rebuilds
B`watch` subscribes and rebuilds when the model changes; `read` gets value once without listening in build
CSame
DBoth only in `initState`
Lời giải
Trong Flutter, `context.watch` và `context.read` là hai cách khác nhau để truy cập vào giá trị của một đối tượng Provider. `context.watch` là một phương thức được sử dụng để lắng nghe giá trị của đối tượng Provider và cập nhật lại khi giá trị thay đổi. Điều này có nghĩa là nếu giá trị của đối tượng Provider thay đổi, thì `context.watch` sẽ được gọi lại và cập nhật lại giá trị. Ngược lại, `context.read` chỉ được gọi một lần khi ứng dụng được khởi tạo và không lắng nghe giá trị của đối tượng Provider. Điều này có nghĩa là nếu giá trị của đối tượng Provider thay đổi, thì `context.read` sẽ không được gọi lại và vẫn giữ lại giá trị ban đầu.
Mở trang câu hỏi này →
ADeletes the app
BReboots the device
COnly logs
DMarks the widget dirty and calls `build` again on the next frame
Lời giải
Sau khi gọi hàm `setState`, framework sẽ đánh dấu widget bị bẩn (dirty) và thực hiện gọi lại hàm `build` trên khung hình tiếp theo. Điều này có nghĩa là framework sẽ cập nhật trạng thái của widget và sau đó gọi lại hàm `build` để tạo lại widget mới với trạng thái mới. Quá trình này được thực hiện trên khung hình tiếp theo để đảm bảo rằng widget được cập nhật một cách mượt mà và không làm gián đoạn quá trình sử dụng ứng dụng. Điều này giúp đảm bảo rằng ứng dụng luôn hiển thị trạng thái mới và cập nhật một cách chính xác.
Mở trang câu hỏi này →