Đáp án đúng: A. flutter_test là gói kiểm thử chính thức đi kèm SDK, cung cấp testWidgets, WidgetTester, các matcher như findsOneWidget và các tiện ích bơm khung hình để kiểm thử unit lẫn widget; nó được khai báo trong dev_dependencies của pubspec.yaml. Provider (B) là giải pháp quản lý trạng thái, http (C) dùng để gọi API và sqflite (D) là cơ sở dữ liệu cục bộ - cả ba đều là gói chức năng của ứng dụng chứ không phải hạ tầng kiểm thử. Riêng kiểm thử tích hợp dùng thêm gói integration_test.
Ngân hàng câu hỏi môn 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ó đáp án 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.
Bắt đầu một phiên học theo môn
Tiến độ của bạn sẽ luôn được tính toán và đồng bộ trực tiếp theo tổng số lượng câu hỏi mới nhất của môn học này.
Bạn cần đăng nhập để bắt đầu học từ ngân hàng câu hỏi và lưu tiến độ theo môn.
Đang tải phân bố độ khó.
Đáp án đúng: B. Scaffold là widget dựng khung cho một màn hình theo Material Design: nó cung cấp sẵn các khe cho appBar, body, floatingActionButton, drawer, bottomNavigationBar và snackBar, đồng thời xử lý đúng vùng an toàn cùng bàn phím. Container (A) chỉ là hộp trang trí và định kích thước cho một widget con; Column (C) sắp xếp các widget theo chiều dọc; ListView (D) hiển thị danh sách cuộn được. Cả ba đều thường nằm BÊN TRONG body của Scaffold chứ không thay thế được vai trò khung màn hình của nó.
Đáp án đúng: C. Để chạy và kiểm thử ứng dụng Flutter trên máy cá nhân, bạn cần một đích chạy thực sự: máy ảo Android, trình giả lập iOS hoặc một thiết bị vật lý kết nối qua USB - flutter devices sẽ liệt kê chúng. Dịch vụ lưu trữ đám mây (A) và máy chủ vật lý (B) là hạ tầng phía sau, không cần cho việc chạy ứng dụng di động cục bộ; hệ quản trị cơ sở dữ liệu (D) chỉ cần khi ứng dụng thực sự dùng tới, không phải điều kiện để khởi chạy.
Đáp án đúng: C. Kim tự tháp kiểm thử có đáy rộng là unit test - nhiều nhất vì nhanh, rẻ và dễ khoanh vùng lỗi; ở giữa là widget test (tương đương integration/component test trong các nền tảng khác); trên đỉnh là integration test chạy toàn ứng dụng trên thiết bị hoặc trình giả lập. Vì integration test chậm, đắt và dễ gãy nhất nên phải dùng ÍT nhất, chỉ cho các luồng nghiệp vụ then chốt. "Debug Tests" (D) không phải một loại kiểm thử trong kim tự tháp này.
Đáp án đúng: C. Flutter dùng ngôn ngữ Dart do chính Google phát triển. Dart phù hợp với Flutter nhờ hai chế độ biên dịch: JIT khi phát triển để hỗ trợ hot reload, và AOT khi phát hành để sinh mã máy chạy nhanh; kèm theo là mô hình đơn luồng với isolate và cơ chế thu gom rác tối ưu cho việc dựng cây widget liên tục. Kotlin (A) và Swift (B) là ngôn ngữ native của Android và iOS, chỉ xuất hiện trong Flutter khi cần viết platform channel; JavaScript (D) là ngôn ngữ của React Native, không phải Flutter.
Đáp án đúng: C. Curves.bounceOut tạo hiệu ứng nảy ở CUỐI hoạt ảnh: giá trị vượt qua đích rồi nảy lại vài lần với biên độ giảm dần trước khi dừng hẳn, giống quả bóng rơi xuống sàn. Curves.linear (A) chạy đều tuyệt đối, không có gia tốc nên không nảy; Curves.easeIn (B) khởi động chậm rồi nhanh dần, kết thúc đột ngột; Curves.decelerate (D) bắt đầu nhanh rồi chậm dần tới đích. Ngoài bounceOut, họ đường cong nảy còn có bounceIn và bounceInOut cho hiệu ứng ở đầu hoặc cả hai đầu.
Đáp án đúng: B. Kiến trúc Flutter gồm ba tầng. Tầng Framework viết bằng Dart, chứa widget, hoạt ảnh, cử chỉ. Tầng Engine viết bằng C++, chịu trách nhiệm kết xuất đồ hoạ thông qua Skia (nay là Impeller), quản lý bố cục ở mức thấp, chạy Dart runtime và xử lý văn bản. Tầng Embedder gắn engine vào từng nền tảng cụ thể, lo vòng đời ứng dụng và sự kiện đầu vào. Vì câu hỏi nói tới việc kết xuất bằng C++ với Skia nên đó chính là Engine Layer; Widget Layer (D) là một phần con của Framework, không phải một tầng riêng.
Đáp án đúng: B. Trong CustomScrollView, các phần cuộn được tạo bởi các sliver. SliverList là sliver dùng để hiển thị một danh sách các phần tử theo chiều cuộn, tương đương ListView nhưng đặt được cạnh các sliver khác. SliverGrid (A) sắp phần tử theo lưới nhiều cột; SliverAppBar (C) là thanh tiêu đề co giãn hoặc ghim khi cuộn; SliverFillRemaining (D) lấp đầy phần không gian còn thừa của viewport. Cả ba đều là sliver hợp lệ nhưng không phải dạng dùng cho một danh sách cuộn thông thường.
Đáp án đúng: C. Null safety, có từ Dart 2.12, làm cho mọi kiểu mặc định KHÔNG nhận null; muốn cho phép null phải khai báo tường minh bằng dấu chấm hỏi như String?. Nhờ đó trình biên dịch phát hiện ngay lúc dịch những chỗ có thể truy cập vào biến null, thay vì để lỗi bùng ra lúc chạy. Kiểu động (A) làm điều ngược lại là trì hoãn kiểm tra tới lúc chạy; hot reload (B) chỉ giúp nạp nhanh thay đổi mã vào ứng dụng đang chạy; còn thực thi bất đồng bộ (D) liên quan tới Future và Stream, không dính dáng tới việc kiểm soát giá trị null.
Đáp án đúng: B. Khi logic điều hướng được tổ chức tốt - đặt tên route tập trung, tách phần định nghĩa route ra khỏi widget, dùng router có cấu trúc - thì việc thêm màn hình mới, đổi luồng đi hay xử lý deep link đều gọn gàng và ít gây lỗi lan truyền. Đó chính là cải thiện khả năng BẢO TRÌ. Phương án A và C nhầm sang kích thước giao diện và tốc độ chạy, vốn không phụ thuộc vào cách tổ chức route; phương án D vô nghĩa vì điều hướng luôn làm việc với các widget màn hình chứ không nhằm né tránh chúng.
Đáp án đúng: A. Padding là widget bọc quanh một widget con và chèn thêm khoảng trống Ở BÊN TRONG nó, giữa biên của Padding và widget con, theo giá trị EdgeInsets được truyền vào. Nói cách khác nó tạo lề trong cho phần nội dung mà nó bao. Phương án B mô tả khoảng cách GIỮA các widget anh em, thường đạt được bằng SizedBox, Spacer hoặc thuộc tính spacing của Row/Column; phương án C là việc của Align hay Center; phương án D thuộc về SizedBox, ConstrainedBox hoặc thuộc tính width và height của Container.
Đáp án đúng: B. Mã hoá thông tin xác thực - dùng HTTPS khi truyền, băm mật khẩu phía máy chủ, lưu token trong kho an toàn của hệ điều hành như flutter_secure_storage - là thực hành cốt lõi để bảo vệ danh tính người dùng. Ngược lại, lưu mật khẩu ở dạng thô trên thiết bị (A) tạo ra điểm rò rỉ trực tiếp; dùng HTTP không mã hoá (C) khiến thông tin bị nghe lén trên đường truyền; và nhúng cứng token vào mã nguồn (D) là lỗi nghiêm trọng vì token sẽ lộ ngay khi ứng dụng bị dịch ngược.
Đáp án đúng: C. Nguyên tắc thiết kế nâng cao trải nghiệm biểu mẫu là nhãn rõ ràng và phản hồi tức thời: mỗi trường có nhãn dễ hiểu, gợi ý định dạng, và khi nhập sai thì thông báo lỗi hiện ngay cạnh trường với hướng dẫn cách sửa. Trong Flutter, InputDecoration cùng validator của TextFormField phục vụ đúng mục đích này. Biểu mẫu quá dài (A) làm người dùng bỏ cuộc; kiểm tra dữ liệu sơ sài (B) đẩy lỗi xuống phía sau; ẩn thông báo lỗi (D) khiến người dùng không biết phải sửa gì - cả ba đều làm giảm tính khả dụng.
Đáp án đúng: C. SharedPreferences chỉ được thiết kế để lưu các cặp khoá - giá trị nhỏ, kiểu nguyên thuỷ như cờ đã đăng nhập, chế độ sáng tối, ngôn ngữ đã chọn. Toàn bộ nội dung được nạp vào bộ nhớ và ghi ra một tệp phẳng, nên nó KHÔNG phù hợp với dữ liệu lớn, có cấu trúc phức tạp hay cần truy vấn - những trường hợp đó phải dùng sqflite hoặc Hive. Phương án A sai vì dữ liệu vẫn được lưu bền qua các lần mở ứng dụng; phương án B sai vì gói hoạt động trên mọi nền tảng; phương án D sai vì SharedPreferences không dùng SQL.
Đáp án đúng: B. Navigator quản lý các màn hình theo cấu trúc NGĂN XẾP: Navigator.push đặt một route mới lên đỉnh ngăn xếp, Navigator.pop lấy route trên cùng ra và quay lại màn hình trước đó. Chính mô hình này khiến nút Back của hệ thống hoạt động đúng như người dùng kỳ vọng, và cho phép truyền dữ liệu trả về khi pop. Phương án A nhầm sang cách bố trí widget dạng lưới; phương án C mô tả hành vi ngẫu nhiên không tồn tại; phương án D sai vì lập trình viên hoàn toàn kiểm soát việc đẩy và gỡ route.