Ngân hàng câu hỏi của chương

Câu hỏi: PRM393 - Quản lý trạng thái và Provider

23 câu trắc nghiệm kèm lời giải của môn Lập trình di động (Flutter) - Mobile Programming, xếp theo thứ tự nhập vào ngân hàng.

Danh sách câu hỏi

20/23 câuCòn 3
AReduce code size
BImprove maintainability
CFaster execution
DBetter animations
Lời giải
Việc tách rời logic UI và logic trạng thái được khuyến nghị vì nó giúp cải thiện tính bảo trì của ứng dụng. Khi logic UI và trạng thái được tách rời, mỗi phần có thể được phát triển và bảo trì độc lập mà không ảnh hưởng đến phần còn lại của ứng dụng. Điều này giúp giảm thiểu sự phức tạp và tăng cường khả năng mở rộng của ứng dụng. Ngoài ra, việc tách rời logic UI và trạng thái cũng giúp giảm thiểu sự lặp lại mã và tăng cường khả năng tái sử dụng mã. Điều này giúp giảm thiểu thời gian và chi phí phát triển ứng dụng.
Mở trang câu hỏi này →
Abuild()
BsetState()
CinitState()
Ddispose()
Lời giải
Khi trạng thái thay đổi, phương thức được sử dụng để cập nhật giao diện người dùng là setState(). Phương thức setState() cho phép cập nhật trạng thái của ứng dụng một cách an toàn và hiệu quả. Nó được sử dụng rộng rãi trong các ứng dụng React để phản ứng với các sự kiện và cập nhật giao diện người dùng theo thời gian thực. Phương thức setState() có thể được gọi từ bất kỳ đâu trong ứng dụng, bao gồm cả các hàm và các phương thức khác. Nó sẽ tự động cập nhật giao diện người dùng sau khi trạng thái được thay đổi.
Mở trang câu hỏi này →
3What does a Tween define?4 lựa chọnDễ
AAnimation speed
BValue range for animation
CUI layout
DState logic
Lời giải
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.
Mở trang câu hỏi này →
4Why should setState() be called sparingly?4 lựa chọnDễ
AIt increases app size
BIt may trigger unnecessary rebuilds
CIt blocks UI thread
DIt causes memory leaks
Lời giải
setState() được gọi quá nhiều có thể gây ra hiệu suất chậm và tiêu tốn tài nguyên. Khi bạn gọi setState(), React sẽ thực hiện một lần render lại toàn bộ ứng dụng. Điều này có thể gây ra hiệu suất chậm nếu bạn gọi setState() quá nhiều lần trong một khoảng thời gian ngắn. Ngoài ra, nếu bạn gọi setState() trong một vòng lặp, nó có thể gây ra hiệu suất chậm và thậm chí là gây ra lỗi. Vì vậy, bạn nên gọi setState() một cách cẩn thận và chỉ khi thực sự cần thiết.
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 →
AIt allows a widget to rebuild only when a specific part of a model changes, rather than the entire model.
BIt allows a single child widget to be scrollable when it exceeds the screen's vertical or horizontal space.
CIt manages the focus state of a specific widget, such as a text field, and handles keyboard events.
DIt allows a constructor to return an existing instance or a subclass instance instead of always creating a new one.
Lời giải
Widget Selector từ gói Provider giúp cải thiện hiệu suất bằng cách cho phép một widget được xây dựng lại chỉ khi một phần cụ thể của mô hình thay đổi, thay vì toàn bộ mô hình. Điều này giúp giảm thiểu việc xây dựng lại không cần thiết và cải thiện hiệu suất của ứng dụng. Khi một phần của mô hình thay đổi, Selector sẽ chỉ cập nhật phần đó, thay vì cập nhật toàn bộ mô hình. Điều này giúp giảm thiểu việc sử dụng tài nguyên và cải thiện hiệu suất của ứng dụng. Ngoài ra, Selector cũng giúp giảm thiểu việc xây dựng lại không cần thiết khi một widget không bị ảnh hưởng bởi thay đổi của mô hình.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Trong Flutter, CircularProgressIndicator là widget tiêu chuẩn để chỉ định trạng thái đang tải. Nó thường được sử dụng để hiển thị trạng thái chờ hoặc tải dữ liệu. CircularProgressIndicator có thể được tùy chỉnh để phù hợp với thiết kế và màu sắc của ứng dụng. Nó thường được sử dụng trong các trường hợp như tải dữ liệu từ mạng, tải hình ảnh hoặc video, hoặc trong quá trình xử lý dữ liệu. CircularProgressIndicator giúp người dùng hiểu được ứng dụng đang làm gì và chờ đợi kết quả.
Mở trang câu hỏi này →
ATrue
BFalse
Lời giải
Widget 'Selector' hiệu suất cao hơn so với 'Provider.of' vì nó chỉ cập nhật lại khi dữ liệu cụ thể thay đổi. Điều này giúp giảm thiểu việc rebuild widget không cần thiết, từ đó tăng hiệu suất của ứng dụng. Trong khi đó, 'Provider.of' thường sẽ rebuild widget khi có bất kỳ thay đổi nào trong dữ liệu, dẫn đến lãng phí tài nguyên và giảm hiệu suất.
Mở trang câu hỏi này →
AOnly for animation
BPush data down the tree without passing every constructor arg
COnly draw borders
DReplace `Navigator`
Lời giải
InheritedWidget và các lớp bọc như Provider giúp chúng ta truyền dữ liệu xuống cây widget mà không cần phải truyền từng tham số vào mỗi constructor. Điều này giúp giảm bớt sự phức tạp khi xây dựng ứng dụng, đặc biệt là khi chúng ta cần truyền dữ liệu từ trên cao xuống dưới. Ví dụ, nếu chúng ta muốn truyền một giá trị từ màn hình chính xuống các màn hình con, chúng ta có thể sử dụng InheritedWidget để truyền giá trị đó xuống cây widget. Điều này giúp chúng ta tránh được việc phải truyền từng tham số vào mỗi constructor, làm cho mã code trở nên dễ đọc và dễ bảo trì hơn. Ngoài ra, InheritedWidget cũng giúp chúng ta chia sẻ dữ liệu giữa các widget khác nhau, giúp chúng ta xây dựng ứng dụng phức tạp hơn mà không cần phải lo lắng về việc truyền dữ liệu.
Mở trang câu hỏi này →
11What does context.read() do in Provider?4 lựa chọnTrung bình
ACreates provider
BListens to changes
CDisposes provider
DReads value without listening
Lời giải
Trong quá trình sử dụng Provider, context.read() đóng vai trò quan trọng. Nó cho phép bạn đọc giá trị của provider mà không cần lắng nghe các thay đổi sau này. Điều này đặc biệt hữu ích khi bạn cần truy cập vào giá trị của provider một lần và không cần cập nhật khi giá trị thay đổi. Context.read() khác với context.watch() ở chỗ, nó không lắng nghe các thay đổi sau này, vì vậy nó không gây ra bất kỳ hiệu ứng phụ nào. Điều này giúp bạn có thể sử dụng Provider một cách linh hoạt và hiệu quả hơn.
Mở trang câu hỏi này →
ADoes not exist
BRebuild only when the selected slice of state changes — fewer rebuilds
CPick colors
DReplace `Navigator`
Lời giải
Provider Selector là một tính năng giúp giảm thiểu số lần rebuild trong ứng dụng Flutter. Khi sử dụng Provider, ứng dụng của bạn sẽ rebuild mỗi khi trạng thái thay đổi. Tuy nhiên, nếu bạn chỉ muốn rebuild một phần của trạng thái, thì Provider Selector sẽ giúp bạn thực hiện điều đó. Nó giúp bạn chọn một phần cụ thể của trạng thái và chỉ rebuild khi phần đó thay đổi. Điều này giúp giảm thiểu số lần rebuild và cải thiện hiệu suất của ứng dụng.
Mở trang câu hỏi này →
13What does setState() do?4 lựa chọnDễ
ADeletes widget
BUpdates UI
CStops app
DChanges theme only
Lời giải
setState() là một phương thức quan trọng trong React, giúp cập nhật trạng thái của một widget. Khi bạn gọi setState(), React sẽ tự động cập nhật giao diện người dùng (UI) để phản ánh những thay đổi mới. Điều này xảy ra vì setState() sẽ tạo ra một sự kiện mới, khiến React phải tái tạo lại giao diện người dùng. Đ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 một cách chính xác và đồng bộ với trạng thái của ứng dụng. Ngoài ra, setState() cũng giúp ứng dụng của bạn trở nên linh hoạt và dễ dàng thay đổi, giúp bạn có thể tạo ra những ứng dụng phức tạp và đa dạng mà không gặp phải bất kỳ vấn đề nào.
Mở trang câu hỏi này →
AFaster rendering
BImproved navigation
CBetter animations
DSimpler state sharing and management
Lời giải
Provider là một công cụ quan trọng trong Flutter giúp quản lý và chia sẻ trạng thái giữa các widget. Khi sử dụng Provider, bạn có thể dễ dàng quản lý trạng thái của ứng dụng và cập nhật trạng thái cho các widget con. Điều này giúp đơn giản hóa quá trình chia sẻ và quản lý trạng thái, giảm thiểu sự phức tạp trong việc quản lý trạng thái của ứng dụng.
Mở trang câu hỏi này →
AMemory management
BState persistence
CEfficient data propagation
DAutomatic layout
Lời giải
InheritedWidget là một loại widget trong Flutter có thể truyền dữ liệu từ cha sang con mà không cần phải tạo một chuỗi widget mới. Lợi ích chính của InheritedWidget là giúp truyền dữ liệu một cách hiệu quả và tiết kiệm thời gian. Khi sử dụng InheritedWidget, bạn có thể dễ dàng truy cập và sử dụng dữ liệu từ cha widget mà không cần phải truyền qua từng widget con. Điều này giúp giảm thiểu số lượng widget và cải thiện hiệu suất của ứng dụng. Ngoài ra, InheritedWidget cũng giúp duy trì trạng thái của ứng dụng một cách ổn định và hiệu quả.
Mở trang câu hỏi này →
ACreate state
BListen and rebuild specific parts of the UI
CDefine themes
DManage navigation
Lời giải
Trong Provider, Consumer widget đóng vai trò quan trọng trong việc giao tiếp giữa Provider và Consumer. Nó cho phép Consumer lắng nghe và cập nhật trạng thái từ Provider. Khi trạng thái thay đổi, Consumer sẽ được thông báo và rebuild lại các phần của giao diện người dùng (UI) cần thiết. Điều này giúp đảm bảo giao diện người dùng luôn được cập nhật và phản ánh đúng trạng thái dữ liệu. Consumer widget không tạo ra trạng thái mới, cũng không định nghĩa chủ đề hoặc quản lý điều hướng. Nó chỉ đơn giản là lắng nghe và phản ứng với các thay đổi trạng thái từ Provider.
Mở trang câu hỏi này →
17What problem does state lifting help solve?4 lựa chọnTrung bình
ASharing state between widgets
BAPI errors
CLayout overflow
DUI rendering
Lời giải
State lifting là một kỹ thuật giúp giải quyết vấn đề chia sẻ trạng thái giữa các widget. Khi một widget cần truy cập vào trạng thái của widget khác, việc chia sẻ trạng thái trực tiếp có thể dẫn đến sự phức tạp và khó khăn trong việc quản lý trạng thái. State lifting giúp giải quyết vấn đề này bằng cách di chuyển trạng thái lên một cấp độ cao hơn, thường là cấp độ của widget cha hoặc cấp độ ứng dụng. Điều này cho phép các widget con truy cập vào trạng thái mà không cần phải chia sẻ trạng thái trực tiếp. Kỹ thuật này giúp giảm thiểu sự phức tạp và khó khăn trong việc quản lý trạng thái, đồng thời cải thiện hiệu suất và tính linh hoạt của ứng dụng.
Mở trang câu hỏi này →
18When should you prefer Provider over setState()?4 lựa chọnTrung bình
AFor global or shared state
BFor navigation
CFor simple UI updates
DFor animations
Lời giải
Khi nào bạn nên ưu tiên Provider so với setState()? Provider là một công cụ mạnh mẽ trong React Native giúp bạn quản lý state toàn cầu hoặc chung. Nó cho phép bạn chia sẻ state giữa các component khác nhau trong ứng dụng của mình. Điều này đặc biệt hữu ích khi bạn cần cập nhật state trong nhiều component khác nhau. Ví dụ, khi bạn muốn hiển thị thông tin người dùng trên nhiều màn hình khác nhau, bạn có thể sử dụng Provider để chia sẻ state người dùng. Điều này giúp giảm thiểu việc sử dụng setState() và làm cho code của bạn trở nên dễ đọc và dễ bảo trì hơn.
Mở trang câu hỏi này →
19When use `MultiProvider`?4 lựa chọn
AOnly one model
BDoes not exist
CReplace `MaterialApp`
DProvide several `Provider`/`ChangeNotifierProvider` roots for a subtree
Lời giải
Khi sử dụng `MultiProvider`, mục đích chính là để cung cấp nhiều nguồn dữ liệu cho một phần tử con trong cây widget. Điều này đặc biệt hữu ích khi bạn cần truy cập và sử dụng nhiều nguồn dữ liệu khác nhau trong một phần tử con, mà không cần phải di chuyển lên cây widget cha. `MultiProvider` cho phép bạn tạo ra nhiều nguồn dữ liệu khác nhau và cung cấp chúng cho phần tử con mà không cần phải tạo ra một cây widget mới. Điều này giúp giảm thiểu số lượng widget và cải thiện hiệu suất của ứng dụng.
Mở trang câu hỏi này →
Aselect()
Blisten()
Cwatch()
Dread()
Lời giải
Để trả lời câu hỏi này, chúng ta cần hiểu về Provider trong Flutter. Provider là một thư viện giúp quản lý trạng thái ứng dụng. Nó cung cấp một số phương thức để lắng nghe thay đổi trạng thái và cập nhật giao diện người dùng. Trong các phương thức này, phương thức nào lắng nghe thay đổi trạng thái và rebuild giao diện người dùng?
Mở trang câu hỏi này →