Đá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.
Lập trình di động (Flutter) - Mobile Programming
Chủ đề học tập
PRM393 - Bất đồng bộ: Future, async/await, Stream
Xử lý bất đồng bộ trong Dart: Future đại diện cho một giá trị sẽ có trong tương lai, Stream cung cấp chuỗi sự kiện liên tục. Chủ đề làm rõ cách đánh dấu hàm async, dùng await để chờ Future, kiểu trả về luôn là Future dù thân hàm trả giá trị thường, xử lý lỗi bằng try-catch trong hàm async, chuỗi .then(), Future.delayed để mô phỏng độ trễ mạng, StreamController.broadcast cho nhiều listener, và thứ tự ưu tiên microtask trên event queue.
PRM393 - Bố cục và layout
Dựng bố cục trong Flutter theo mô hình cha truyền ràng buộc — con chọn kích thước. Chủ đề bao quát Column xếp dọc và Row xếp ngang, Container gộp padding, margin và trang trí, SizedBox điều khiển kích thước, Expanded chiếm phần không gian còn trống trên trục chính, Stack cho phép các phần tử chồng lên nhau, ListView.builder dựng lười cho danh sách dài, GridView, SingleChildScrollView, cùng cách xử lý lỗi tràn bố cục.
PRM393 - Dart cơ bản: biến, kiểu dữ liệu, null safety
Nền tảng ngôn ngữ Dart: khai báo biến với var, final, const và late; các kiểu int, double, num, bool, String; ba collection List, Set, Map và điểm khác nhau về thứ tự cùng tính duy nhất. Chủ đề đi sâu vào null safety — dấu ? cho biến nullable, toán tử ?? trả giá trị mặc định, ??= chỉ gán khi null, và dấu ! khẳng định không null — kèm các toán tử số học, so sánh, ép kiểu as và nội suy chuỗi.
PRM393 - Dart nâng cao: OOP, thư viện, cấu trúc điều khiển
Lập trình hướng đối tượng trong Dart: class là bản thiết kế còn object là thể hiện, constructor mặc định và constructor có tên, factory constructor trả về thể hiện sẵn có hoặc lớp con, kế thừa với extends, cài đặt giao diện với implements và trộn mã bằng mixin. Chủ đề bao gồm cấu trúc điều khiển if/else, for, while, do-while, switch cùng break và continue, cách tổ chức thư viện bằng import, show, hide, as và cặp part/part of.
PRM393 - Form và Validation
Thu thập và kiểm tra dữ liệu người dùng. Chủ đề trình bày widget Form nhóm nhiều trường, GlobalKey<FormState> để gọi validate, save và reset trên toàn biểu mẫu, khác biệt giữa TextField và TextFormField, hàm validator trả về null khi hợp lệ và trả chuỗi lỗi khi không, callback onSaved lưu giá trị, AutovalidateMode.onUserInteraction cân bằng trải nghiệm, FocusNode và textInputAction điều khiển tiêu điểm cùng bàn phím.
PRM393 - Giới thiệu Flutter và kiến trúc
Tổng quan Flutter — bộ công cụ giao diện đa nền tảng của Google — và kiến trúc ba lớp Framework (Dart), Engine (C/C++) và Embedder. Chủ đề làm rõ vì sao Flutter tự vẽ pixel bằng engine riêng thay vì gọi view native, cách Dart biên dịch JIT khi phát triển và AOT khi phát hành, đường đi từ cây widget qua Element và RenderObject tới GPU, vai trò của Platform Channel khi cần gọi mã Kotlin/Swift, cùng các lệnh nền tảng như flutter doctor và pubspec.yaml.
PRM393 - Hiệu năng và triển khai
Tối ưu hiệu năng và đưa ứng dụng lên cửa hàng. Chủ đề gồm lý do đo FPS và độ giật ở chế độ Profile thay vì Debug, dùng const cho widget tĩnh để tránh dựng lại, ValueKey giữ trạng thái khi danh sách thay đổi thứ tự, Selector thu hẹp phạm vi rebuild, precacheImage nạp ảnh trước, lệnh flutter clean và flutter build apk --analyze-size xem thành phần chiếm dung lượng, định dạng AppBundle .aab cho Google Play, cùng versionCode và versionName.
PRM393 - Kiểm thử và gỡ lỗi
Bảo đảm chất lượng ứng dụng Flutter. Chủ đề trình bày kim tự tháp kiểm thử với nhiều unit test nhanh và ổn định, ít bài integration chậm nhưng bao phủ đầu cuối. Nội dung gồm mẫu Arrange–Act–Assert, thư mục test lưu mã kiểm thử, pumpWidget dựng giao diện, khác biệt giữa pump một khung hình và pumpAndSettle chờ hết hoạt ảnh, find.text cùng find.byKey định vị widget, tester.enterText mô phỏng nhập liệu, và Widget Inspector trong DevTools.
PRM393 - Lưu trữ cục bộ
Lưu dữ liệu ngay trên thiết bị. Chủ đề so sánh SharedPreferences cho cặp khóa–giá trị đơn giản như token và cài đặt, gói path_provider tìm thư mục Documents hay Temporary, ghi đọc tệp JSON cho cấu trúc phức tạp hơn, sqflite cung cấp SQLite quan hệ với tham số version phục vụ nâng cấp lược đồ, cùng Hive. Nội dung gồm nguyên tắc offline-first đọc dữ liệu cục bộ trước rồi đồng bộ khi có mạng, và xử lý khi lưu trữ thất bại.
PRM393 - Quản lý trạng thái và Provider
Quản lý trạng thái từ cục bộ tới toàn cục. Chủ đề bắt đầu ở setState cho thay đổi trong phạm vi một State, chỉ ra khi nào nên nâng trạng thái lên widget cha để chia sẻ, rồi tới InheritedWidget truyền dữ liệu xuống cây mà không phải chuyền tham số từng cấp. Phần Provider làm rõ ChangeNotifier, khác biệt giữa context.watch đăng ký dựng lại và context.read chỉ đọc một lần, widget Consumer, Selector giảm rebuild, và MultiProvider.
PRM393 - REST API và JSON
Kết nối ứng dụng Flutter với máy chủ. Chủ đề bao gồm gói http gửi yêu cầu GET, POST, PUT, DELETE, ý nghĩa các mã trạng thái như 200, 201, 401 và 403, thư viện dart:convert với jsonEncode và jsonDecode, factory Model.fromJson ánh xạ Map thành đối tượng Dart, FutureBuilder tự dựng lại giao diện theo trạng thái Future, lý do tách lớp Service hoặc Repository khỏi widget, xử lý SocketException, timeout và nút thử lại.
PRM393 - Responsive và Adaptive
Xây dựng giao diện thích ứng nhiều kích thước màn hình. Chủ đề phân biệt responsive — đổi bố cục theo không gian — với adaptive — đổi kiểu điều hướng theo nền tảng. Nội dung gồm MediaQuery cung cấp kích thước và hướng thiết bị, LayoutBuilder lấy ràng buộc từ widget cha thay vì toàn màn hình, OrientationBuilder phân biệt dọc ngang, Wrap tự xuống dòng khi hết chỗ, SafeArea tránh notch và thanh trạng thái, cùng viewInsets khi bàn phím hiện lên.
PRM393 - Widget và vòng đời
Widget là đơn vị dựng nên toàn bộ giao diện Flutter và luôn bất biến. Chủ đề phân biệt StatelessWidget không có trạng thái nội bộ với StatefulWidget thay đổi theo thời gian, vai trò của phương thức build trả về cây widget, ý nghĩa BuildContext định vị widget trên cây, vòng đời từ initState tới dispose, cách setState đánh dấu widget cần dựng lại, các widget khung như MaterialApp và Scaffold, ThemeData, cùng khác biệt giữa Hot Reload và Hot Restart.
PRM393 - Xác thực và phiên đăng nhập
Xác thực người dùng và duy trì phiên đăng nhập. Chủ đề phân biệt authentication xác định bạn là ai với authorization quyết định bạn được làm gì, cấu trúc JWT với phần payload chỉ mã hoá Base64URL nên đọc được còn chữ ký mới chống sửa, khác biệt giữa access token ngắn hạn và refresh token, header Authorization dạng Bearer, Firebase Authentication cùng Google Sign-In và khoá SHA, SplashScreen định tuyến theo token, hết phiên và đăng xuất an toàn.
PRM393 - Điều hướng và Navigator
Điều hướng giữa các màn hình bằng Navigator. Chủ đề trình bày ngăn xếp route, push mở màn mới và pop đóng màn hiện tại, pushReplacement thay thế route để tránh quay lại màn đăng nhập, named route khai báo tập trung cùng Navigator.pushNamed cho ứng dụng lớn, MaterialPageRoute quản lý hoạt ảnh chuyển cảnh theo nền tảng, cách nhận dữ liệu trả về từ màn con, widget Hero cho hiệu ứng bay, cùng ưu điểm khai báo của Navigator 2.0.
Đề thi trắc nghiệm
Xem tất cả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ó.
Người học chấm Lập trình di động (Flutter) - Mobile Programming ra sao?
Trung bình từ các phiên học hợp lệ.
Ngân hàng câu hỏi
Xem trước · Cuộn vô hạnĐá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.