Chủ đề của Lập trình di động (Flutter) - Mobile Programming

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.

Xem danh sách câu hỏi13 câu hỏi100% có giải thích

Bắt đầu bằng Chế độ học nếu bạn muốn đáp án và giải thích hiện ngay sau mỗi câu — không bấm giờ, dừng lúc nào cũng được. Chọn Thi thử khi muốn biết mình đang ở đâu: có bấm giờ, chấm điểm ở cuối, và giải thích chỉ mở sau khi nộp.

Học ngân hàng câu hỏi của chủ đề

Luyện tập theo chủ đề này

13Câu hỏi hiện có

Câu hỏi của chủ đề

13/13 câuHết danh sách
ATrue
BFalse
Lời giải
LayoutBuilder là một công cụ trong Flutter giúp xác định bố cục dựa trên các hạn chế của widget cha chứ không phải dựa trên kích thước toàn bộ màn hình. Điều này cho phép bạn tạo ra các bố cục linh hoạt và phù hợp với từng trường hợp sử dụng khác nhau. Ví dụ, bạn có thể sử dụng LayoutBuilder để tạo ra một bố cục khác nhau cho các thiết bị di động và máy tính để bàn. Ngoài ra, LayoutBuilder cũng giúp bạn tối ưu hóa hiệu suất của ứng dụng bằng cách giảm thiểu số lượng các widget cần được tái tạo khi kích thước màn hình thay đổi.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
MediaQuery là một tính năng trong CSS giúp bạn có thể lấy thông tin về kích thước màn hình và hướng của thiết bị. Nó cho phép bạn viết mã CSS khác nhau dựa trên kích thước màn hình và hướng của thiết bị. Ví dụ, bạn có thể viết mã CSS để thay đổi kích thước font chữ dựa trên kích thước màn hình. Điều này giúp bạn có thể tối ưu hóa trải nghiệm người dùng trên các thiết bị khác nhau.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Widget 'SafeArea' được sử dụng để đảm bảo giao diện người dùng không bị che bởi các tính năng phần cứng như notch camera. Nó giúp ngăn chặn các phần của giao diện người dùng bị che bởi notch camera hoặc các tính năng phần cứng khác. Điều này giúp đảm bảo giao diện người dùng luôn được hiển thị đầy đủ và không bị ảnh hưởng bởi các tính năng phần cứng.
Mở trang câu hỏi này →
AOnly responsive exists
BAdaptive is only font size
CAdaptive changes navigation/platform patterns (rail vs bottom bar); responsive changes layout by space
DSame
Lời giải
Adaptive và responsive là hai thuật ngữ thường được sử dụng trong thiết kế giao diện người dùng (UI) và thiết kế trải nghiệm người dùng (UX). Adaptive và responsive đều liên quan đến việc thiết kế giao diện để phù hợp với các thiết bị di động khác nhau, nhưng chúng có cách tiếp cận khác nhau. Adaptive tập trung vào việc thay đổi các mẫu giao diện dựa trên các yếu tố như loại thiết bị, hệ điều hành và kích thước màn hình. Ví dụ, một ứng dụng có thể sử dụng giao diện rail trên điện thoại di động và giao diện bar dưới trên máy tính bảng. Ngược lại, responsive tập trung vào việc thay đổi bố cục giao diện dựa trên không gian màn hình. Điều này có nghĩa là giao diện sẽ tự động điều chỉnh kích thước và bố cục để phù hợp với kích thước màn hình của thiết bị.
Mở trang câu hỏi này →
ADesktop only
BSame
C`viewInsets` (often bottom) grows when IME covers; `padding` is safe area/notch
DNot usable in Flutter
Lời giải
Khi bàn phím mở, `MediaQuery.paddingOf(context)` và `viewInsetsOf` có cách xử lý khác nhau. `viewInsetsOf` thường sẽ tăng lên khi bàn phím hoặc bàn di chuột mở ra, đặc biệt là phần dưới. Điều này có thể gây ra vấn đề với thiết kế của bạn. Ngược lại, `MediaQuery.paddingOf(context)` sẽ cung cấp khoảng cách an toàn (safe area) hoặc khoảng cách cho notch trên thiết bị. Điều này giúp bạn tránh được các vấn đề về thiết kế khi bàn phím hoặc bàn di chuột mở ra. Vì vậy, khi bàn phím mở, `viewInsets` thường sẽ tăng lên, trong khi `padding` là khoảng cách an toàn.
Mở trang câu hỏi này →
AIt helps Flutter's framework uniquely identify widgets to preserve state during list modifications.
BMediaQuery provides device screen dimensions, while LayoutBuilder provides the constraints of the parent widget.
CA feature that automatically triggers validation logic without waiting for a manual submit button press.
DIt creates a Future that completes after a specified duration, often used to simulate network latency.
Lời giải
LayoutBuilder và MediaQuery là hai cách khác nhau để tạo giao diện người dùng phản hồi trong Flutter. Cả hai đều được sử dụng để tạo ra các ứng dụng có thể tương tác với nhiều kích thước màn hình khác nhau. Tuy nhiên, LayoutBuilder khác với MediaQuery ở chỗ nó cung cấp các hạn chế của widget cha, trong khi MediaQuery cung cấp kích thước màn hình của thiết bị. Điều này có nghĩa là LayoutBuilder cho phép bạn tạo ra các ứng dụng có thể tự điều chỉnh kích thước dựa trên các hạn chế của widget cha, trong khi MediaQuery cho phép bạn tạo ra các ứng dụng có thể tự điều chỉnh kích thước dựa trên kích thước màn hình của thiết bị. Ví dụ, bạn có thể sử dụng LayoutBuilder để tạo ra một ứng dụng có thể tự điều chỉnh kích thước của nó dựa trên kích thước của màn hình, trong khi bạn có thể sử dụng MediaQuery để tạo ra một ứng dụng có thể tự điều chỉnh kích thước của nó dựa trên kích thước của màn hình và các yếu tố khác.
Mở trang câu hỏi này →
7How does `Wrap` differ from `Row`?4 lựa chọnDễ100% trả lời đúng
ASame
B`Row` wraps lines automatically
C`Wrap` wraps to the next line when out of space; `Row` may overflow
D`Wrap` cannot hold `Chip`
Lời giải
Wrap và Row là hai loại widget trong Flutter. Mặc dù cả hai đều có thể chứa nhiều widget con, nhưng chúng có cách xử lý kích thước khác nhau. Row sẽ tự động.wrap dòng khi cần thiết, trong khi Wrap sẽ.wrap widget con sang dòng tiếp theo khi không còn đủ không gian. Điều này có nghĩa là Row có thể gây ra tình trạng tràn màn hình nếu widget con quá lớn, trong khi Wrap sẽ đảm bảo rằng tất cả widget con đều được hiển thị mà không gây ra tràn màn hình. Vì vậy, Wrap phù hợp hơn khi bạn cần đảm bảo rằng widget con của mình sẽ được hiển thị một cách hợp lý trên màn hình.
Mở trang câu hỏi này →
AAlways one column
BiPad only
CMore/fewer columns based on screen width
DDisable scrolling
Lời giải
GridView.count được sử dụng để tạo một lưới có thể điều chỉnh kích thước dựa trên chiều rộng màn hình. Khi sử dụng crossAxisCount từ MediaQuery.width, GridView sẽ tự động điều chỉnh số cột dựa trên chiều rộng màn hình. Điều này giúp tạo ra một giao diện người dùng linh hoạt và phù hợp với nhiều loại thiết bị khác nhau. Ví dụ, trên màn hình rộng, GridView có thể hiển thị nhiều cột hơn, trong khi trên màn hình nhỏ, nó có thể hiển thị ít cột hơn. Điều này giúp tối ưu hóa không gian và tạo ra một trải nghiệm người dùng tốt hơn.
Mở trang câu hỏi này →
ABattery only
BColors only
CPortrait vs landscape to switch layout
DUnrelated to layout
Lời giải
OrientationBuilder là một lớp xây dựng trong Android, giúp chúng ta điều chỉnh layout dựa trên hướng của thiết bị. Nó cho phép chúng ta chuyển đổi layout khi thiết bị được xoay từ ngang sang dọc hoặc ngược lại. Điều này giúp ứng dụng của chúng ta có thể thích nghi với nhiều kích thước màn hình và hướng khác nhau. OrientationBuilder cung cấp một số phương thức để chúng ta có thể điều chỉnh layout, chẳng hạn như việc chuyển đổi layout khi thiết bị được xoay.
Mở trang câu hỏi này →
10What is 'autovalidation' in the context of Flutter forms?4 lựa chọnTrung bình67% trả lời đúng
AIt is called exactly once when the widget is inserted into the tree, used for one-time initialisation.
BMediaQuery provides device screen dimensions, while LayoutBuilder provides the constraints of the parent widget.
CA feature that automatically triggers validation logic without waiting for a manual submit button press.
DIt creates a Future that completes after a specified duration, often used to simulate network latency.
Lời giải
Tính năng tự động xác thực (autovalidation) trong Flutter là một tính năng quan trọng khi xây dựng các form. Nó cho phép tự động kích hoạt logic xác thực mà không cần chờ đợi nút submit được nhấn. Điều này giúp người dùng có trải nghiệm tốt hơn khi nhập dữ liệu vào form. Khi sử dụng autovalidation, Flutter sẽ tự động kiểm tra các trường nhập liệu và thông báo lỗi nếu có. Điều này giúp người dùng dễ dàng nhận biết và sửa lỗi, từ đó tăng hiệu suất và giảm thiểu thời gian chờ đợi. Ngoài ra, tính năng này cũng giúp giảm thiểu số lượng lỗi nhập liệu và tăng cường bảo mật cho ứng dụng.
Mở trang câu hỏi này →
AIt prevents unnecessary rebuilds of widgets that do not change during the app's lifecycle.
BIt allows a single codebase to render UI using its own engine across different platforms.
CIt uniquely identifies the Form and allows access to its state for validation and saving.
DIt ensures the UI avoids system intrusions like notches, status bars, and camera cutouts.
Lời giải
Widget SafeArea được sử dụng để đảm bảo giao diện người dùng (UI) tránh các khu vực hệ thống như notch, thanh trạng thái và camera cutout. Điều này giúp đảm bảo rằng UI luôn được hiển thị một cách đầy đủ và không bị ảnh hưởng bởi các tính năng hệ thống. Khi sử dụng SafeArea, bạn có thể yên tâm rằng UI của mình sẽ luôn được hiển thị một cách chính xác và đầy đủ, ngay cả khi ứng dụng được chạy trên các thiết bị có notch hoặc camera cutout.
Mở trang câu hỏi này →
12When does `MediaQuery.viewInsets.bottom` increase?4 lựa chọnDễ100% trả lời đúng
AWhen the soft keyboard covers the bottom — used to push UI
BNever changes
COn rotation
DWhen enabling dark mode
Lời giải
Khi bạn muốn biết khi nào giá trị `MediaQuery.viewInsets.bottom` sẽ tăng lên, hãy hiểu rằng đây là một thuộc tính được sử dụng để xác định khoảng trống ở dưới cùng của màn hình. Giá trị này sẽ tăng lên khi bàn phím ảo mềm (soft keyboard) che phủ phần dưới cùng của màn hình. Điều này thường xảy ra khi bạn nhập văn bản vào một trường văn bản (text field) trên màn hình. Khi bàn phím ảo mềm xuất hiện, nó sẽ đẩy phần dưới cùng của màn hình lên, khiến giá trị `MediaQuery.viewInsets.bottom` tăng lên. Điều này cho phép các ứng dụng điều chỉnh bố cục của mình để tránh bị che khuất bởi bàn phím ảo mềm.
Mở trang câu hỏi này →
13When prefer `LayoutBuilder` over `MediaQuery.sizeOf` in a tight area?4 lựa chọnDễ100% trả lời đúng
AWhen you need **parent** constraints (card, dialog), not full screen
BOnly with `GridView`
CNever
DWhen writing tests
Lời giải
Khi nào nên ưu tiên sử dụng `LayoutBuilder` so với `MediaQuery.sizeOf` trong một khu vực chật hẹp? Đó là khi bạn cần đặt các ràng buộc cho **phụ cha** (parent) của widget, chẳng hạn như card hoặc dialog, thay vì toàn bộ màn hình. `LayoutBuilder` cho phép bạn đặt các ràng buộc cho widget con dựa trên kích thước của widget cha, giúp bạn có thể tạo ra các layout phức tạp và linh hoạt hơn. Ví dụ, bạn có thể sử dụng `LayoutBuilder` để tạo ra một card có kích thước tùy chỉnh dựa trên kích thước của màn hình, hoặc để tạo ra một dialog có kích thước phù hợp với nội dung của nó.
Mở trang câu hỏi này →

Chưa có đề nào dùng câu hỏi của chủ đề này

Câu hỏi phía trên vẫn học được. Đề ôn tập của môn nằm ở tab Làm đề khi môn đã có đề.