Đề thi trắc nghiệm

Quiz: PRM393_FE_B5_SU26 - Có đáp án và giải thích chi tiết

50Câu hỏi
Lập trình di động (Flutter) - Mobile ProgrammingMôn học

Phiên có lưu tiến độ dùng toàn bộ 50 câu của bộ đề để tiến độ khớp với máy chủ.

Phiên sắp tạo
50 câu Chế độ học Không giới hạn

Bạn cần đăng nhập để bắt đầu làm bài và lưu tiến độ.

Tổng câu hỏi

50

Thời gian làm bài

Không giới hạn

Lượt xem

0

Câu có lời giải

50

Câu có link chi tiết

50

Xem trước câu hỏi

Bấm vào từng câu để xem đáp án
#001
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AsaveInt()
BputInt()
setInt()ĐÚNG
DwriteInt()
Giải thích

Đáp án đúng: C. Trong Flutter, gói shared_preferences cung cấp các phương thức đặt giá trị theo kiểu dữ liệu: setInt, setString, setBool, setDouble và setStringList, đi kèm các phương thức đọc getInt, getString... Vì vậy để lưu một số nguyên ta gọi prefs.setInt('key', value). Cần phân biệt với SharedPreferences NATIVE của Android, nơi API là editor.putInt() - đó chính là bẫy của phương án B. Các phương án saveInt() (A) và writeInt() (D) không tồn tại trong cả hai nền tảng. Lưu ý các phương thức set này trả về Future<bool> nên thường được await.

#002
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ATo store application data permanently
To provide tools and libraries for Flutter developmentĐÚNG
CTo deploy applications directly to app stores
DTo replace the operating system of a device
Giải thích

Đáp án đúng: B. Flutter SDK là bộ công cụ phát triển gồm framework widget, công cụ dòng lệnh (flutter run, flutter build), trình biên dịch Dart, engine kết xuất và các thư viện hỗ trợ. Nói ngắn gọn, nó cung cấp CÔNG CỤ VÀ THƯ VIỆN để lập trình viên xây dựng ứng dụng Flutter. Phương án A nhầm sang vai trò của các giải pháp lưu trữ như shared_preferences, Hive hay sqflite; phương án C sai vì việc phát hành lên cửa hàng ứng dụng do các công cụ và quy trình riêng của Google Play hoặc App Store đảm nhiệm; phương án D vô lý vì SDK chạy trên hệ điều hành chứ không thay thế nó.

#003
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AReducing widget tree depth
Limiting rebuild to affected widgetsĐÚNG
CCaching API responses
DUsing global state
Giải thích

Tối ưu hóa phạm vi xây dựng lại (rebuild scope optimization) trong Flutter là một kỹ thuật giúp tối ưu hóa hiệu suất ứng dụng bằng cách hạn chế việc xây dựng lại (rebuild) các widget không cần thiết. Khi một widget thay đổi, Flutter sẽ tự động xây dựng lại toàn bộ cây widget để phản ánh sự thay đổi này. Tuy nhiên, việc này có thể dẫn đến lãng phí tài nguyên và giảm hiệu suất ứng dụng. Tối ưu hóa phạm vi xây dựng lại giúp Flutter chỉ xây dựng lại các widget bị ảnh hưởng trực tiếp bởi sự thay đổi, từ đó giảm thiểu lãng phí tài nguyên và tăng hiệu suất ứng dụng.

#004
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AListView
BSingleChildScrollView
CustomScrollViewĐÚNG
DColumn
Giải thích

Trong Flutter, CustomScrollView là một widget cho phép tạo ra các hiệu ứng cuộn tùy chỉnh. Nó cung cấp các phương thức để tạo ra các hiệu ứng cuộn phức tạp như cuộn theo chiều ngang, cuộn theo chiều dọc, hoặc thậm chí là cuộn theo cả hai chiều cùng lúc. CustomScrollView cũng cho phép bạn thêm các widget khác vào bên trong nó, tạo ra một cấu trúc dữ liệu phức tạp và linh hoạt. Điều này làm cho CustomScrollView trở thành một lựa chọn tuyệt vời cho các ứng dụng cần có hiệu ứng cuộn tùy chỉnh.

#005
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ACompiling Dart code
BManaging databases
CHandling network requests
Describing the user interfaceĐÚNG
Giải thích

Trong Flutter, các widget đóng vai trò quan trọng trong việc mô tả giao diện người dùng (UI). Chúng là các thành phần cơ bản của ứng dụng, bao gồm các yếu tố như text, hình ảnh, nút bấm, danh sách và nhiều hơn nữa. Mỗi widget có thể được sử dụng độc lập hoặc kết hợp lại với nhau để tạo nên giao diện phức tạp. Widget giúp developers dễ dàng xây dựng và tùy chỉnh giao diện của ứng dụng mà không cần phải viết mã phức tạp. Ngoài ra, widget cũng giúp ứng dụng trở nên linh hoạt và dễ dàng thích nghi với các thiết bị và kích thước màn hình khác nhau.

#006
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AFix layout
BSpeed up builds
Prevent memory leaksĐÚNG
DImprove UI
Giải thích

Animations trong ứng dụng thường tạo ra các đối tượng tạm thời, nếu không được xóa bỏ đúng cách sẽ dẫn đến tình trạng "nhớ" bộ nhớ, gây ra hiện tượng "memory leaks". Điều này có thể khiến ứng dụng trở nên chậm chạp và thậm chí bị treo. Vì vậy, việc xóa bỏ animations một cách hợp lý là rất quan trọng để đảm bảo ứng dụng hoạt động trơn tru và hiệu suất cao.

#007
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
Ahttp
flutter_blocĐÚNG
Csqflite
Dprovider
Giải thích

BLoC (Business Logic Component) là một kiến trúc ứng dụng được sử dụng trong Flutter để quản lý logic kinh doanh. Để sử dụng kiến trúc BLoC trong Flutter, chúng ta cần sử dụng gói flutter_bloc. Gói này cung cấp các lớp và phương thức cần thiết để xây dựng và quản lý logic kinh doanh trong ứng dụng. Nó giúp chúng ta tách rời logic kinh doanh khỏi giao diện người dùng và tạo ra ứng dụng có khả năng mở rộng và dễ bảo trì hơn.

#008
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AStore UI
Trigger state changesĐÚNG
CHandle layout
DRender widgets
Giải thích

Trong mô hình BLoC, các sự kiện đóng vai trò quan trọng trong việc điều khiển trạng thái ứng dụng. Khi một sự kiện được kích hoạt, nó sẽ truyền thông tin đến BLoC (Business Logic Component), sau đó BLoC sẽ xử lý thông tin đó và cập nhật trạng thái ứng dụng. Điều này giúp ứng dụng trở nên linh hoạt và dễ dàng quản lý trạng thái. Ví dụ, khi người dùng nhập thông tin vào một trường văn bản, sự kiện 'nhập thông tin' sẽ được kích hoạt và truyền thông tin đó đến BLoC. BLoC sẽ xử lý thông tin đó và cập nhật trạng thái ứng dụng, chẳng hạn như cập nhật dữ liệu trong cơ sở dữ liệu hoặc hiển thị thông báo cho người dùng.

#009
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ASimplify syntax
BReduce code
CImprove theme
Avoid blocking UI threadĐÚNG
Giải thích

Các hoạt động cơ sở dữ liệu nên được thực hiện theo cách đồng bộ vì nó giúp tránh chặn luồng UI. Khi một ứng dụng thực hiện các yêu cầu cơ sở dữ liệu đồng bộ, nó sẽ tạm dừng mọi hoạt động khác cho đến khi yêu cầu được hoàn thành. Điều này có thể dẫn đến trải nghiệm người dùng không mượt mà và ứng dụng có thể trở nên chậm chạp. Ngược lại, các hoạt động cơ sở dữ liệu được thực hiện theo cách đồng bộ cho phép ứng dụng tiếp tục thực hiện các tác vụ khác trong khi chờ đợi kết quả từ cơ sở dữ liệu. Điều này giúp cải thiện hiệu suất và trải nghiệm người dùng.

#010
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AFree memory
End user session securelyĐÚNG
CImprove UI
DChange theme
Giải thích

Đáp án đúng: B. Chức năng đăng xuất tồn tại vì lý do BẢO MẬT: nó kết thúc phiên làm việc một cách an toàn, xoá token đang lưu, xoá thông tin nhạy cảm khỏi bộ nhớ và bộ nhớ cục bộ, đồng thời báo cho máy chủ thu hồi phiên. Nếu thiếu, người dùng tiếp theo trên cùng thiết bị vẫn truy cập được tài khoản cũ. Giải phóng bộ nhớ (A) chỉ là hệ quả phụ không đáng kể; cải thiện giao diện (C) và đổi giao diện màu sắc (D) hoàn toàn không liên quan tới mục đích của thao tác đăng xuất.

#011
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AUI widget
Simplified BLoC without eventsĐÚNG
CDatabase layer
DAnimation helper
Giải thích

Cubit là một khái niệm quan trọng trong kiến trúc BLoC của Flutter. Nó được định nghĩa là một lớp trừu tượng hóa các logic nghiệp vụ, giúp phân tách logic kinh doanh khỏi logic giao diện người dùng. Trong BLoC, Cubit được sử dụng như một lớp trạng thái trung gian, giúp lưu trữ và cập nhật trạng thái ứng dụng. Nó không phải là một UI widget, cũng không phải là một lớp cơ sở dữ liệu, cũng không phải là một lớp trợ giúp cho animation. Thay vào đó, Cubit là một lớp trừu tượng hóa các logic nghiệp vụ, giúp phân tách logic kinh doanh khỏi logic giao diện người dùng. Nó giúp chúng ta xây dựng các ứng dụng có khả năng mở rộng, dễ dàng bảo trì và sửa lỗi.

#012
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AContainer
RepaintBoundaryĐÚNG
CColumn
DFutureBuilder
Giải thích

Widget giúp tránh tái xây dựng các phần giao diện không thay đổi là RepaintBoundary. Khi một widget được thay đổi, Flutter sẽ tự động tái xây dựng lại giao diện. Tuy nhiên, nếu một phần giao diện không thay đổi, việc tái xây dựng lại không cần thiết và có thể gây lãng phí tài nguyên. RepaintBoundary giúp ngăn chặn việc tái xây dựng lại các phần giao diện không thay đổi, giúp cải thiện hiệu suất của ứng dụng.

#013
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
Aasync
awaitĐÚNG
Cfuture
Ddelay
Giải thích

Đáp án đúng: B. Từ khoá await tạm dừng việc thực thi hàm hiện tại cho tới khi Future hoàn tất rồi trả về giá trị của Future đó, giúp viết mã bất đồng bộ theo phong cách tuần tự dễ đọc. Nó chỉ dùng được bên trong hàm đã được đánh dấu async, và đó chính là vai trò của từ khoá async (A): đánh dấu hàm trả về Future chứ bản thân nó không tạm dừng gì cả. Future (C) là KIỂU dữ liệu biểu diễn một giá trị sẽ có trong tương lai, không phải từ khoá điều khiển; còn delay (D) không phải từ khoá của Dart - liên quan là hàm Future.delayed.

#014
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ASingle function
BWidget rendering
End-to-end app behaviorĐÚNG
DTheme consistency
Giải thích

Một bài kiểm tra tích hợp (integration test) là một loại kiểm tra phần mềm được sử dụng để xác minh rằng các thành phần khác nhau của một ứng dụng hoạt động cùng nhau một cách chính xác. Bài kiểm tra này không chỉ kiểm tra một chức năng đơn lẻ mà còn kiểm tra cách các chức năng khác nhau tương tác với nhau. Ví dụ, một bài kiểm tra tích hợp có thể kiểm tra việc đăng nhập vào ứng dụng, sau đó thêm một sản phẩm vào giỏ hàng và cuối cùng thực hiện thanh toán. Điều này giúp đảm bảo rằng ứng dụng hoạt động một cách trơn tru và không có lỗi khi người dùng tương tác với nó.

#015
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
Asqflite
Firebase AuthenticationĐÚNG
CProvider
Dhttp
Giải thích

Đáp án đúng: B. Firebase Authentication là dịch vụ xác thực sẵn có, hỗ trợ đăng nhập bằng email/mật khẩu, số điện thoại và các nhà cung cấp như Google, Facebook, Apple; nó quản lý token, làm mới phiên và trạng thái đăng nhập giúp lập trình viên, nên đơn giản hoá đáng kể việc triển khai xác thực trong Flutter. Các phương án còn lại là những gói phục vụ mục đích khác: sqflite (A) là cơ sở dữ liệu SQLite cục bộ, Provider (C) là giải pháp quản lý trạng thái, http (D) là thư viện gọi API - không gói nào tự thân cung cấp cơ chế xác thực.

#016
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AUsing ThemeData
BUsing Scaffold
Via constructor argumentsĐÚNG
DUsing global variables
Giải thích

Để truyền dữ liệu đến một màn hình mới, chúng ta có thể sử dụng nhiều phương pháp khác nhau. Một trong những cách phổ biến nhất là sử dụng tham số constructor. Khi chúng ta tạo một màn hình mới, chúng ta có thể truyền dữ liệu từ màn hình hiện tại sang màn hình mới thông qua tham số constructor. Điều này cho phép chúng ta chia sẻ dữ liệu giữa các màn hình và tạo ra các ứng dụng phức tạp hơn. Ngoài ra, chúng ta cũng có thể sử dụng các phương pháp khác như sử dụng các biến toàn cục, nhưng phương pháp này không được khuyến khích vì nó có thể gây ra các vấn đề về bảo mật và khó khăn trong việc quản lý dữ liệu.

#017
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ADELETE
BPUT
CPOST
GETĐÚNG
Giải thích

Phương thức HTTP được sử dụng để lấy dữ liệu thường là GET. Phương thức GET được sử dụng để yêu cầu dữ liệu từ máy chủ mà không thay đổi dữ liệu hiện có. Nó thường được sử dụng để lấy dữ liệu từ một nguồn cụ thể, chẳng hạn như một trang web hoặc một API. Ví dụ, khi bạn nhập địa chỉ URL của một trang web vào trình duyệt, trình duyệt sẽ gửi một yêu cầu GET đến máy chủ để lấy dữ liệu trang web đó. Phương thức GET thường được sử dụng trong các trường hợp như lấy dữ liệu, liệt kê tài nguyên, hoặc lấy thông tin về một tài nguyên cụ thể.

#018
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ANavigation animation
BAPI animation
Animation without controllerĐÚNG
DManual animation control
Giải thích

Implicit animation là một loại animation được tạo ra mà không cần sử dụng controller. Trong khi animation được tạo ra bằng cách sử dụng controller thường được gọi là explicit animation, implicit animation lại được tạo ra tự động mà không cần sự can thiệp của người dùng. Ví dụ, khi bạn di chuyển một view trên màn hình, implicit animation sẽ tự động được tạo ra để tạo ra một hiệu ứng chuyển động mượt mà. Điều này giúp tạo ra một trải nghiệm người dùng tốt hơn và tạo ra một giao diện người dùng thân thiện hơn.

#019
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ARequires separate codebases for Android and iOS
BUses JavaScript as its primary language
Enables building apps from a single codebase for multiple platformsĐÚNG
DOnly supports mobile platforms
Giải thích

Đáp án đúng: C. Ưu thế lớn nhất của Flutter là cho phép xây dựng ứng dụng từ MỘT bộ mã nguồn duy nhất rồi biên dịch ra nhiều nền tảng: Android, iOS, web, Windows, macOS và Linux, nhờ engine tự vẽ giao diện nên hiển thị nhất quán giữa các nền tảng. Phương án A mô tả cách phát triển native truyền thống, đúng là điều Flutter khắc phục; phương án B sai vì Flutter dùng Dart chứ không phải JavaScript; phương án D sai vì từ phiên bản 2 trở đi Flutter đã hỗ trợ chính thức cả web và desktop, không giới hạn ở di động.

#020
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AIt manages database servers
It provides UI components and rendering logicĐÚNG
CIt replaces the operating system
DIt runs backend business logic
Giải thích

Câu hỏi này hỏi về vai trò của framework Flutter trong quá trình phát triển ứng dụng. Flutter là một framework mã nguồn mở được sử dụng để xây dựng các ứng dụng di động và web. Nó cung cấp một bộ công cụ mạnh mẽ để tạo ra các giao diện người dùng (UI) và logic rendering. Flutter sử dụng ngôn ngữ lập trình Dart để xây dựng các ứng dụng. Nó cho phép các nhà phát triển tạo ra các ứng dụng di động và web với giao diện người dùng đẹp mắt và hiệu suất cao. Flutter cũng cung cấp một số tính năng khác như hỗ trợ đa nền tảng, khả năng tùy chỉnh cao và hệ sinh thái lớn của các thư viện và công cụ.

#021
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AXML
BCSV
JSONĐÚNG
DBinary
Giải thích

Đáp án đúng: C. JSON là định dạng trao đổi dữ liệu phổ biến nhất trong các REST API hiện nay vì gọn nhẹ, dễ đọc với con người, ánh xạ tự nhiên sang cấu trúc đối tượng của hầu hết ngôn ngữ và được hỗ trợ sẵn ở cả trình duyệt lẫn máy chủ. Trong Flutter, dữ liệu JSON được xử lý bằng dart:convert với jsonDecode và jsonEncode. XML (A) từng thống trị thời SOAP nhưng nay ít dùng vì dài dòng; CSV (B) chỉ phù hợp dữ liệu bảng phẳng; còn định dạng nhị phân (D) chỉ dùng trong các trường hợp đặc thù cần hiệu năng cao như gRPC hay Protobuf.

#022
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AScreens are arranged in a grid layout
Screens are managed using a stack (push and pop)ĐÚNG
CScreens are loaded randomly
DScreens are replaced automatically without control
Giải thích

Đá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.

#023
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ACannot persist data
BOnly works on web
Not suitable for large or complex dataĐÚNG
DRequires SQL queries
Giải thích

Đá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.

#024
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AAnimation speed
Value range for animationĐÚNG
CUI layout
DState logic
Giải thích

Tween trong lập trình đồ họa là một thuật ngữ dùng để chỉ một đoạn animation được định nghĩa bởi một giá trị ban đầu và một giá trị cuối cùng. Nó thường được sử dụng để mô tả một quá trình chuyển đổi từ một trạng thái ban đầu sang một trạng thái cuối cùng trong một khoảng thời gian nhất định. Trong nhiều trường hợp, Tween được sử dụng để tạo ra các hiệu ứng animation như di chuyển, thay đổi kích thước, màu sắc, v.v. của các đối tượng trong một ứng dụng. Nó giúp tạo ra một trải nghiệm người dùng thú vị và hấp dẫn hơn. Trong câu hỏi này, Tween được định nghĩa là phạm vi giá trị cho animation, điều này có nghĩa là nó xác định khoảng giá trị mà animation sẽ di chuyển từ ban đầu đến cuối cùng.

#025
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AUI animation
Handling large datasets efficientlyĐÚNG
CTheme management
DAuthentication
Giải thích

Trang trí là một kỹ thuật được sử dụng để quản lý và phân trang dữ liệu lớn trong các ứng dụng web. Nó giúp người dùng dễ dàng duyệt qua các trang dữ liệu khác nhau, giảm thiểu thời gian tải dữ liệu và cải thiện hiệu suất của ứng dụng. Khi dữ liệu lớn, việc hiển thị tất cả dữ liệu trên một trang sẽ gây ra sự chậm chạp và khó sử dụng. Trang trí giúp giải quyết vấn đề này bằng cách phân chia dữ liệu thành các trang nhỏ, mỗi trang chỉ hiển thị một lượng dữ liệu nhất định. Điều này cho phép người dùng dễ dàng chuyển đổi giữa các trang và tìm kiếm thông tin mong muốn.

#026
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
Instantly reflect code changes in UIĐÚNG
BReduce memory usage
CPublish apps faster
DImprove runtime performance
Giải thích

Mục đích chính của hot reload trong Flutter là cho phép lập trình viên xem được kết quả của các thay đổi mã nguồn ngay lập tức mà không cần phải khởi động lại ứng dụng. Điều này giúp cho quá trình phát triển và thử nghiệm trở nên nhanh chóng và hiệu quả hơn. Khi sử dụng hot reload, bạn có thể nhanh chóng thử nghiệm các thay đổi mã nguồn và xem được kết quả ngay lập tức, mà không cần phải chờ đợi thời gian khởi động lại ứng dụng. Điều này giúp cho quá trình phát triển ứng dụng trở nên nhanh chóng và hiệu quả hơn.

#027
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ALong forms
BMinimal validation
Clear labels and feedbackĐÚNG
DHidden errors
Giải thích

Đá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.

#028
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AA UI widget only
A blueprint for creating objectsĐÚNG
CA database table
DA network request
Giải thích

Một lớp Dart (class) chủ yếu đại diện cho một bản thiết kế chung (blueprint) để tạo ra các đối tượng (objects). Nó cung cấp một mô hình cơ bản cho việc tạo ra các đối tượng có tính chất và hành vi nhất định. Lớp Dart có thể được sử dụng để tạo ra các đối tượng có thể được sử dụng trong ứng dụng, chẳng hạn như các đối tượng UI, dữ liệu, v.v. Khi bạn tạo một lớp Dart, bạn có thể định nghĩa các thuộc tính (properties) và phương thức (methods) của lớp đó, giúp bạn có thể tạo ra các đối tượng có tính chất và hành vi mong muốn. Điều này giúp cho việc lập trình trở nên dễ dàng và hiệu quả hơn.

#029
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AStoring passwords locally
Encrypting credentialsĐÚNG
CUsing HTTP
DHardcoding tokens
Giải thích

Đá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.

#030
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AStore application data
Locate widgets in the widget treeĐÚNG
CManage navigation history
DRender UI pixels
Giải thích

BuildContext trong Flutter đóng vai trò quan trọng trong việc xác định vị trí của các widget trong cây widget. Nó cung cấp thông tin về vị trí của widget hiện tại, bao gồm cả bố cục và các widget lân cận. BuildContext được sử dụng để truy cập các phương thức và thuộc tính của widget cha, chẳng hạn như tìm kiếm các widget con, cập nhật trạng thái, và quản lý sự kiện. Nó cũng giúp Flutter xác định xem widget nào cần được cập nhật khi có thay đổi trong cây widget. BuildContext được sử dụng rộng rãi trong các ứng dụng Flutter để xây dựng các ứng dụng phức tạp và linh hoạt.

#031
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
Adds space inside a widgetĐÚNG
BAdds space between widgets
CAligns widgets
DControls widget size
Giải thích

Đá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.

#032
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ARemote database
Lightweight local NoSQL storageĐÚNG
CState management
DRouting
Giải thích

Hive là một công cụ được sử dụng rộng rãi trong lĩnh vực phân tích dữ liệu lớn (Big Data). Nó được thiết kế để cung cấp một giao diện SQL cho dữ liệu được lưu trữ trong Hadoop Distributed File System (HDFS). Hive chủ yếu được sử dụng để tạo và quản lý cơ sở dữ liệu, tạo các truy vấn và báo cáo, cũng như thực hiện các phép tính toán tính trên dữ liệu. Nó cho phép người dùng sử dụng ngôn ngữ SQL để truy vấn và xử lý dữ liệu, mà không cần phải biết về chi tiết kỹ thuật của Hadoop.

#033
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AReduce UI size
Improve maintainabilityĐÚNG
CIncrease speed
DAvoid widgets
Giải thích

Đá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.

#034
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AReset form
BValidate input
Store form valuesĐÚNG
DDisplay errors
Giải thích

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.

#035
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ADynamic typing
BHot reload
Null safetyĐÚNG
DAsynchronous execution
Giải thích

Đá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.

#036
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
ASliverGrid
SliverListĐÚNG
CSliverAppBar
DSliverFillRemaining
Giải thích

Đá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.

#037
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AFramework Layer
Engine LayerĐÚNG
CEmbedder Layer
DWidget Layer
Giải thích

Đá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.

#038
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
Alinear
BeaseIn
bounceOutĐÚNG
Ddecelerate
Giải thích

Đá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.

#039
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AKotlin
BSwift
DartĐÚNG
DJavaScript
Giải thích

Đá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.

#040
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AOn every frame
When state changesĐÚNG
COnly when app restarts
DOnly during hot restart
Giải thích

Flutter sẽ rebuild cây widget khi nào? Cây widget trong Flutter là một cấu trúc dữ liệu được sử dụng để hiển thị giao diện người dùng. Khi một widget thay đổi trạng thái, Flutter sẽ rebuild cây widget để cập nhật giao diện người dùng. Điều này xảy ra vì Flutter sử dụng một phương pháp gọi là "build once, run many" để tối ưu hóa hiệu suất. Khi một widget thay đổi trạng thái, Flutter sẽ gọi lại phương thức build() của widget đó để tạo lại cây widget mới. Điều này giúp đảm bảo rằng giao diện người dùng luôn được cập nhật và chính xác.

#041
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
APackage conflicts
UI inconsistencyĐÚNG
CLonger compile time
DBuild errors
Giải thích

Quá trình quản lý trạng thái không đúng có thể dẫn đến sự không nhất quán trong giao diện người dùng. Khi không có quản lý trạng thái phù hợp, ứng dụng có thể không phản hồi đúng cách với các tương tác của người dùng, dẫn đến sự không nhất quán trong giao diện. Điều này có thể gây ra sự khó chịu cho người dùng và ảnh hưởng đến trải nghiệm của họ. Ngoài ra, sự không nhất quán trong giao diện cũng có thể dẫn đến sự nhầm lẫn và khó khăn trong việc sử dụng ứng dụng. Vì vậy, quản lý trạng thái phù hợp là rất quan trọng để đảm bảo giao diện người dùng được nhất quán và dễ sử dụng.

#042
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AUnit Tests
BWidget Tests
Integration TestsĐÚNG
DDebug Tests
Giải thích

Đá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.

#043
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AHot restart
BUsing global variables
CLarge widgets
Fine-grained state updatesĐÚNG
Giải thích

Để giảm thiểu việc rebuild widget không cần thiết, chúng ta cần hiểu về các khái niệm liên quan đến widget và cách thức hoạt động của chúng trong ứng dụng. Fine-grained state updates là một phương pháp giúp tối ưu hóa quá trình rebuild widget. Phương pháp này liên quan đến việc cập nhật trạng thái của widget một cách tinh tế và có chọn lọc, giúp giảm thiểu số lượng rebuild không cần thiết. Điều này giúp cải thiện hiệu suất của ứng dụng và giảm thiểu thời gian tải trang. Fine-grained state updates cũng giúp giảm thiểu việc sử dụng tài nguyên hệ thống, từ đó giúp ứng dụng trở nên nhanh chóng và ổn định hơn. Vì vậy, phương pháp này là lựa chọn tốt nhất để giảm thiểu việc rebuild widget không cần thiết.

#044
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AA cloud hosting service
BA physical server
An emulator or physical deviceĐÚNG
DA database management system
Giải thích

Đá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.

#045
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
Avar
Bfinal
constĐÚNG
Dstatic
Giải thích

Trong Dart, từ khóa được sử dụng để định nghĩa một giá trị hằng số tại thời điểm biên dịch là "const". Từ khóa này được sử dụng để chỉ định một giá trị không thể thay đổi trong suốt quá trình thực thi chương trình. Điều này giúp tăng cường tính bảo mật và tránh được các lỗi do việc thay đổi giá trị hằng số không mong muốn. Ví dụ, nếu bạn định nghĩa một hằng số như sau: const pi = 3.14; thì giá trị của pi sẽ không thể thay đổi trong suốt quá trình thực thi chương trình. Ngoài ra, từ khóa "const" cũng được sử dụng để chỉ định các thuộc tính của một lớp không thể thay đổi. Điều này giúp tăng cường tính bảo mật và tránh được các lỗi do việc thay đổi thuộc tính không mong muốn.

#046
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AContainer
ScaffoldĐÚNG
CColumn
DListView
Giải thích

Đá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ó.

#047
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
A301
B404
500ĐÚNG
D200
Giải thích

Trạng thái mã lỗi 500 là một trong những mã lỗi phổ biến nhất trên máy chủ. Nó thường được sử dụng khi máy chủ gặp sự cố hoặc không thể thực hiện yêu cầu của người dùng. Ví dụ, nếu máy chủ gặp sự cố hoặc không thể truy cập dữ liệu, nó sẽ trả về mã lỗi 500. Ngoài ra, mã lỗi 500 cũng có thể được sử dụng khi máy chủ không thể thực hiện yêu cầu của người dùng do lỗi kỹ thuật hoặc lỗi logic. Trong trường hợp này, người dùng sẽ nhận được thông báo lỗi và có thể phải thử lại yêu cầu sau.

#048
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
Ensure consistent access controlĐÚNG
BReduce UI code
CImprove animations
DSimplify layout
Giải thích

Authentication state được trung tâm hóa để đảm bảo rằng mọi người dùng đều có quyền truy cập đồng nhất. Khi trạng thái xác thực được trung tâm hóa, hệ thống có thể kiểm soát và quản lý quyền truy cập một cách hiệu quả. Điều này giúp ngăn chặn các vấn đề liên quan đến quyền truy cập không đồng nhất và đảm bảo rằng mọi người dùng đều có quyền truy cập phù hợp với vai trò của họ. Ngoài ra, việc trung tâm hóa trạng thái xác thực cũng giúp đơn giản hóa quy trình quản lý quyền truy cập và giảm thiểu khả năng xảy ra lỗi.

#049
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
flutter_testĐÚNG
Bprovider
Chttp
Dsqflite
Giải thích

Đá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.

#050
ĐỘ CHÍNH XÁC
4 LỰA CHỌN
AThey add state
They reduce rebuild costĐÚNG
CThey handle navigation
DThey improve readability
Giải thích

Widgets không thể thay đổi được (const widgets) được khuyến nghị vì chúng giúp giảm thiểu chi phí tái xây dựng (rebuild cost). Khi một widget không thể thay đổi được, nó sẽ không cần phải được tái xây dựng khi trạng thái của ứng dụng thay đổi. Điều này giúp tăng tốc độ và hiệu suất của ứng dụng. Ngoài ra, sử dụng const widgets cũng giúp giảm thiểu việc sử dụng tài nguyên hệ thống, vì chúng không cần phải được tái xây dựng liên tục. Điều này đặc biệt quan trọng trong các ứng dụng có yêu cầu về hiệu suất cao, chẳng hạn như các trò chơi hoặc các ứng dụng trực tuyến.