Mối quan hệ giữa các widget trạng thái và không trạng thái trong Flutter là gì?


105

Một widget trạng thái được định nghĩa là bất kỳ widget nào thay đổi trạng thái của nó trong vòng đời của nó. Nhưng đó là một thực tế rất phổ biến đối StatelessWidgetvới một StatefulWidgettrong những đứa con của nó. Không StatelessWidgettrở thành trạng thái nếu nó có StatefulWidgetlà một trong những đứa con của nó?

Tôi đã thử xem xét tài liệu như một phần của mã của StatelessWidget, nhưng không thể tìm ra cách một StatelessWidgetcó thể có Statefulwidgetlà con của nó và vẫn còn StatelessWidget.

Mối quan hệ và sự khác biệt giữa widget trạng thái và không trạng thái trong Flutter là gì?


2
Bạn có thể tạo bố cục của mình từ các loại tiện ích con khác nhau, tuy nhiên điều đó không có nghĩa là bạn đang kế thừa các đặc điểm của bố cục để ảnh hưởng đến từng tiện ích con. Ý tôi là bạn có thể có một Container không trạng thái mà có con của một Container khác được khai báo là StatefulWidget ở một nơi khác, trạng thái của container sẽ chỉ ảnh hưởng đến một thành phần này mà thôi. Vì vậy, tất cả là về việc có một thành phần từ các loại vật dụng khác nhau, mỗi chức năng khi bạn cần chúng.
aziza

1
Để mớ hỗn độn những thứ thậm chí nhiều hơn, có một loại thứ 3 của phụ tùng: InheritedWidget; Cái nào có thể StatelessWidgetcập nhật.
Rémi Rousselet

Câu trả lời:


103

Một StatelessWidget sẽ không bao giờ xây dựng lại bởi chính nó (nhưng có thể từ các sự kiện bên ngoài). Một StatefulWidget có thể. Đó là quy tắc vàng.

NHƯNG bất kỳ loại phụ tùng nào cũng có thể được sơn lại bất kỳ lúc nào.

Không trạng thái chỉ có nghĩa là tất cả các thuộc tính của nó là bất biến và cách duy nhất để thay đổi chúng là tạo một phiên bản mới của widget đó. Ví dụ, nó không khóa cây widget.

Nhưng bạn không nên quan tâm đến kiểu con cái của bạn. Nó không có bất kỳ tác động đến bạn.


11
(Tương đối mới đối với khuôn khổ). Sự khác nhau giữa là gì rebuildrepaint
user462455

Ngoài ra, từ các bình luận trong mã khung làm việc, dường như StateFulWidgets cũng không thay đổi được.
user462455

3
Việc xây dựng một widget về cơ bản là một lời gọi phương thức "xây dựng", tiếp theo là tạo / cập nhật hộp kết xuất tương ứng; tiếp theo là quá trình sơn. Thao tác này sẽ in các hộp kết xuất này trên màn hình.
Rémi Rousselet

các lớp kế thừa "StatefulWidget" là bất biến. Nhưng bản thân trạng thái (State <YourWidget>) là có thể thay đổi.
Rémi Rousselet

1
@ RémiRousselet Các widget trạng thái và không trạng thái đều xây dựng lại mọi khung hình, theo flut.dev/docs/get-started/flutter-for/…
Matt

82

StatefulWidget vs StatelessWidget.

nhập mô tả hình ảnh ở đây

StatelessWidget - Một widget không yêu cầu trạng thái có thể thay đổi.

  • Tiện ích con không trạng thái là một tiện ích mô tả một phần của giao diện người dùng bằng cách xây dựng một nhóm các tiện ích con khác mô tả giao diện người dùng cụ thể hơn. Quá trình xây dựng tiếp tục đệ quy cho đến khi mô tả giao diện người dùng hoàn toàn cụ thể (ví dụ: bao gồm hoàn toàn RenderObjectWidgets, mô tả RenderObjects cụ thể).

  • Các statelesswidget hữu ích khi một phần của giao diện người dùng mà bạn mô tả không phụ thuộc vào bất cứ điều gì khác hơn là thông tin cấu hình trong đối tượng chính nó và BuildContext trong đó các phụ tùng được thổi phồng. Đối với các thành phần có thể thay đổi động, ví dụ như do có trạng thái điều khiển đồng hồ bên trong hoặc tùy thuộc vào một số trạng thái hệ thống, hãy cân nhắc sử dụng StatefulWidget.

class GreenFrog extends StatelessWidget {
  const GreenFrog({ Key key }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(color: const Color(0xFF2DBD3A));
  }
}

StatefulWidget - Một tiện ích có trạng thái có thể thay đổi.

  • Các widget trạng thái rất hữu ích khi một phần của giao diện người dùng mà bạn đang mô tả có thể thay đổi động.

Khi Flutter xây dựng một StatefulWidget, nó sẽ tạo ra một đối tượng State. Đối tượng này là nơi chứa tất cả trạng thái có thể thay đổi cho tiện ích con đó.

Khái niệm nhà nước được định nghĩa bởi hai điều:

1) Dữ liệu được tiện ích con sử dụng có thể thay đổi.

2) Dữ liệu không thể được đọc đồng bộ khi tiện ích con được tạo. (Tất cả trạng thái phải được thiết lập vào thời điểm phương thức xây dựng được gọi).

Vòng đời StatefulWidget

Vòng đời có các bước đơn giản sau:

  1. createState () - Khi Flutter được hướng dẫn xây dựng một StatefulWidget, nó sẽ gọi ngay lập tức createState().
  • Tạo trạng thái có thể thay đổi cho tiện ích con này tại một vị trí nhất định trên cây.

  • Các lớp con nên ghi đè phương thức này để trả về một phiên bản mới được tạo của lớp con Trạng thái được liên kết của chúng:

@override
_MyState createState() => _MyState();
  1. mount == true - Tất cả các widget đều có thuộc this.mountedtính bool . Nó trở thành sự thật khi buildContextđược chỉ định. Đó là một lỗi setStatekhi gọi khi một tiện ích được ngắt kết nối. Cho dù đối tượng Trạng thái này hiện đang ở trong một cây.
  • Sau khi tạo một đối tượng State và trước khi gọi initState, framework "gắn kết" đối tượng State bằng cách liên kết nó với a
    BuildContext. Đối tượng State vẫn được gắn kết cho đến khi khung công tác
    gọi dispose(), sau thời gian đó, khung công tác sẽ không bao giờ yêu cầu
    đối tượng Trạng thái xây dựng lại.

  • Đó là một lỗi khi gọi setState trừ khi mount là true.

bool get mounted => _element != null;
  1. initState () - Đây là phương thức đầu tiên được gọi khi widget được tạo (tất nhiên là sau hàm tạo lớp).

initStateđược gọi một lần và chỉ một lần. Nó phải gọisuper.initState().

  • Khởi tạo dữ liệu dựa trên BuildContext cụ thể cho phiên bản widget đã tạo.

  • Khởi tạo các thuộc tính dựa trên các widget 'cha' này trong cây.

  • Đăng ký Luồng ChangeNotifiershoặc bất kỳ đối tượng nào khác có thể thay đổi dữ liệu trên tiện ích con này.

@override
initState() {
  super.initState();
  // Add listeners to this class
  cartItemStream.listen((data) {
    _updateWidget(data);
  });
}
  1. didChangeDependencies () - Được gọi khi một phụ thuộc của đối tượng State này thay đổi.
  • Phương thức này cũng được gọi ngay sau đó initState. Nó là an toàn để gọi BuildContext.inheritFromWidgetOfExactTypetừ phương pháp này.

  • Các lớp con hiếm khi ghi đè phương thức này vì khung công tác luôn gọi xây dựng sau khi thay đổi phụ thuộc. Một số lớp con ghi đè phương thức này vì chúng cần thực hiện một số công việc tốn kém (ví dụ: tìm nạp mạng) khi các phụ thuộc của chúng thay đổi và công việc đó sẽ quá tốn kém để thực hiện cho mọi bản dựng.

@protected
@mustCallSuper
void didChangeDependencies() { }
  1. build () - Mô tả một phần của giao diện người dùng được đại diện bởi widget.

Khuôn khổ gọi phương thức này trong một số trường hợp khác nhau:

  • Sau khi gọi initState.
  • Sau khi gọi didUpdateWidget.
  • Sau khi nhận được cuộc gọi đến setState.
  • Sau khi sự phụ thuộc của đối tượng Trạng thái này thay đổi (ví dụ: một InheritedWidget được tham chiếu bởi các thay đổi bản dựng trước đó).
  • Sau khi gọi hủy kích hoạt và sau đó chèn lại đối tượng Trạng thái vào cây ở vị trí khác.
  • Khuôn khổ thay thế cây con bên dưới tiện ích con này bằng tiện ích con được trả về bởi phương thức này, bằng cách cập nhật cây con hiện có hoặc bằng cách xóa cây con và thổi phồng cây con mới, tùy thuộc vào việc tiện ích con được trả về bởi phương thức này có thể cập nhật gốc của cây con hiện có hay không , được xác định bằng cách gọi Widget.canUpdate.

  • Thông thường, các triển khai trả về một nhóm widget mới được tạo được cấu hình với thông tin từ phương thức khởi tạo của widget này, BuildContext đã cho và trạng thái bên trong của đối tượng State này.

@override
  Widget build(BuildContext context, MyButtonState state) {
    ... () { print("color: $color"); } ...
  }
  1. didUpdateWidget () - Được gọi bất cứ khi nào cấu hình widget thay đổi.
  • Nếu widget cha xây dựng lại và yêu cầu vị trí này trong bản cập nhật cây hiển thị một widget mới có cùng loại thời gian chạy và Widget.key, thì khung công tác sẽ cập nhật thuộc tính widget của đối tượng State này để tham chiếu đến widget mới và sau đó gọi nó với widget trước đó làm đối số.

  • Ghi đè phương thức này để phản hồi khi tiện ích thay đổi (ví dụ: để bắt đầu hoạt ảnh ngầm).

  • Khung công tác luôn gọi xây dựng sau khi gọi didUpdateWidget, có nghĩa là bất kỳ lệnh gọi nào đến setState trong didUpdateWidget đều dư thừa.

@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
  1. setState () - Bất cứ khi nào bạn thay đổi trạng thái bên trong của một đối tượng State, hãy thực hiện thay đổi trong một hàm mà bạn chuyển đến setState:
  • Việc gọi setState thông báo cho khung rằng trạng thái bên trong của đối tượng này đã thay đổi theo cách có thể ảnh hưởng đến giao diện người dùng trong cây con này, điều này khiến khung lên lịch xây dựng cho
    đối tượng Trạng thái này.

  • Nếu bạn chỉ thay đổi trạng thái trực tiếp mà không gọi setState , khung công tác có thể không lên lịch xây dựng và giao diện người dùng cho cây con này có thể không được cập nhật để phản ánh trạng thái mới.

setState(() { _myState = newValue });
  1. hủy kích hoạt () - Hủy kích hoạt được gọi khi Trạng thái bị xóa khỏi cây, nhưng nó có thể được lắp lại trước khi kết thúc thay đổi khung hiện tại. Phương thức này tồn tại về cơ bản vì các đối tượng Trạng thái có thể được di chuyển từ điểm này sang điểm khác.
  • Khuôn khổ gọi phương thức này bất cứ khi nào nó loại bỏ đối tượng Trạng thái này khỏi cây. Trong một số trường hợp, khung công tác sẽ chèn lại đối tượng State vào một phần khác của cây (ví dụ: nếu cây con chứa đối tượng State này được ghép từ vị trí này trong cây sang vị trí khác). Nếu điều đó xảy ra, khung công tác sẽ đảm bảo rằng nó gọi xây dựng để cho đối tượng Trạng thái cơ hội thích nghi với vị trí mới của nó trong cây. Nếu khung công tác chèn lại cây con này, nó sẽ làm như vậy trước khi kết thúc khung hoạt hình mà cây con đã bị xóa khỏi cây. Vì lý do này, các đối tượng State có thể trì hoãn việc giải phóng hầu hết các tài nguyên cho đến khi khuôn khổ gọi phương thức xử lý của chúng.

Điều này hiếm khi được sử dụng.

@protected
@mustCallSuper
void deactivate() { }
  1. dispose () - Được gọi khi đối tượng này bị xóa vĩnh viễn khỏi cây.
  • Khuôn khổ gọi phương thức này khi đối tượng Trạng thái này sẽ không bao giờ xây dựng lại. Sau khi khuôn khổ gọi dispose(), đối tượng State được coi là không gắn kết và thuộc tính được gắn kết là sai. Đó là một lỗi khi gọi setState tại thời điểm này. Giai đoạn này của vòng đời là giai đoạn cuối: không có cách nào để đánh giá lại một đối tượng Trạng thái đã bị xử lý.

  • Các lớp con nên ghi đè phương thức này để giải phóng bất kỳ tài nguyên nào được giữ lại bởi đối tượng này (ví dụ: dừng mọi hoạt ảnh đang hoạt động).

@protected
@mustCallSuper
void dispose() {
  assert(_debugLifecycleState == _StateLifecycle.ready);
  assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}

nhập mô tả hình ảnh ở đây

Để biết thêm thông tin, hãy vào đây tại đây , tại đây


26

Từ tài liệu tại flay.io :

... Điều quan trọng cần lưu ý ở đây là cốt lõi của cả hai widget Stateless và Stateful đều hoạt động giống nhau. Họ xây dựng lại mọi khung, sự khác biệt là StatefulWidget có một đối tượng State để lưu trữ dữ liệu trạng thái trên các khung và khôi phục nó.

Nếu bạn nghi ngờ, hãy luôn nhớ quy tắc này: Nếu một widget thay đổi (ví dụ: người dùng tương tác với nó) thì nó ở trạng thái. Tuy nhiên, nếu một đứa trẻ đang phản ứng với thay đổi, thì phụ huynh chứa vẫn có thể là một widget Không trạng thái nếu phụ huynh không phản ứng với thay đổi.


14

Như đã đề cập trong tài liệu về Flagship

Vấn đề ở đây là gì?

Một số widget có trạng thái và một số không trạng thái. Nếu một tiện ích thay đổi — chẳng hạn như người dùng tương tác với tiện ích — thì tiện ích đó ở trạng thái. Trạng thái của tiện ích con bao gồm các giá trị có thể thay đổi, như giá trị hiện tại của thanh trượt hoặc hộp kiểm có được chọn hay không. Trạng thái của tiện ích con được lưu trữ trong đối tượng Trạng thái, tách biệt trạng thái của tiện ích con khỏi sự xuất hiện của nó. Khi trạng thái của tiện ích thay đổi, đối tượng trạng thái sẽ gọi setState (), yêu cầu khung công tác vẽ lại tiện ích.

Một widget không trạng thái không có trạng thái nội bộ để quản lý. Icon, IconButton và Text là những ví dụ về các widget không trạng thái, thuộc phân lớp StatelessWidget.

Một widget trạng thái là động. Người dùng có thể tương tác với một widget trạng thái (ví dụ: bằng cách nhập vào biểu mẫu hoặc di chuyển thanh trượt) hoặc nó thay đổi theo thời gian (có lẽ nguồn cấp dữ liệu khiến giao diện người dùng cập nhật). Checkbox, Radio, Slider, InkWell, Form và TextField là những ví dụ về các widget trạng thái, thuộc lớp con StatefulWidget.

https://flutter.io/tutorials/interactive/#stateful-stateless


10

Trạng thái là thông tin mà (1) có thể được đọc đồng bộ khi tiện ích con được xây dựng và (2) có thể thay đổi trong thời gian tồn tại của tiện ích con. Người triển khai widget có trách nhiệm đảm bảo rằng Trạng thái được thông báo kịp thời khi trạng thái đó thay đổi, bằng cách sử dụng State.setState.

StatefulWidget :

Tiện ích con trạng thái là một tiện ích mô tả một phần của giao diện người dùng bằng cách xây dựng một nhóm các tiện ích con khác mô tả giao diện người dùng cụ thể hơn. Quá trình xây dựng tiếp tục đệ quy cho đến khi mô tả giao diện người dùng hoàn toàn cụ thể (ví dụ: bao gồm hoàn toàn RenderObjectWidgets, mô tả RenderObjects cụ thể).

Tiện ích trạng thái hữu ích khi một phần của giao diện người dùng mà bạn đang mô tả có thể thay đổi động, ví dụ: do có trạng thái hướng đồng hồ bên trong hoặc tùy thuộc vào một số trạng thái hệ thống. Đối với các tác phẩm chỉ phụ thuộc vào thông tin cấu hình trong chính đối tượng và BuildContext trong đó tiện ích con được thổi phồng, hãy cân nhắc sử dụng StatelessWidget.

Bản thân các cá thể StatefulWidget là bất biến và lưu trữ trạng thái có thể thay đổi của chúng trong các đối tượng Trạng thái riêng biệt được tạo bởi phương thức createState hoặc trong các đối tượng mà Trạng thái đó đăng ký, ví dụ như các đối tượng Stream hoặc ChangeNotifier, mà các tham chiếu được lưu trữ trong các trường cuối cùng trên StatefulWidget chinh no.

StatelessWidget :

Tiện ích con không trạng thái là một tiện ích mô tả một phần của giao diện người dùng bằng cách xây dựng một nhóm các tiện ích con khác mô tả giao diện người dùng cụ thể hơn. Quá trình xây dựng tiếp tục đệ quy cho đến khi mô tả giao diện người dùng hoàn toàn cụ thể (ví dụ: bao gồm hoàn toàn RenderObjectWidgets, mô tả RenderObjects cụ thể).

Tiện ích không trạng thái rất hữu ích khi một phần của giao diện người dùng mà bạn đang mô tả không phụ thuộc vào bất kỳ thứ gì khác ngoài thông tin cấu hình trong chính đối tượng và BuildContext trong đó tiện ích được tăng cường. Đối với các thành phần có thể thay đổi động, ví dụ như do có trạng thái điều khiển đồng hồ bên trong hoặc tùy thuộc vào một số trạng thái hệ thống, hãy cân nhắc sử dụng StatefulWidget.


9

Các widget không trạng thái là các widget tĩnh. Bạn chỉ cần chuyển một vài thuộc tính trước khi khởi tạo các Widget không trạng thái. Chúng không phụ thuộc vào bất kỳ thay đổi dữ liệu hoặc bất kỳ thay đổi hành vi nào. Ví dụ. Text, Icon, RaisedButton là các Widget không trạng thái.

Stateful Widget là các widget động, chúng có thể được cập nhật trong thời gian chạy dựa trên hành động của người dùng hoặc thay đổi dữ liệu. Nếu một Widget có thể thay đổi trạng thái của nó trong thời gian chạy thì nó sẽ là widget trạng thái.

Chỉnh sửa 15/11/2018

Các Widget không trạng thái có thể kết xuất lại nếu dữ liệu đầu vào / dữ liệu bên ngoài thay đổi (dữ liệu bên ngoài là dữ liệu được chuyển qua hàm tạo). Vì các Widget không trạng thái không có trạng thái nên chúng sẽ được hiển thị một lần và sẽ không tự cập nhật mà chỉ được cập nhật khi dữ liệu bên ngoài thay đổi.

Trong khi Stateful Widget có trạng thái bên trong và có thể kết xuất lại nếu dữ liệu đầu vào thay đổi hoặc nếu trạng thái của Widget thay đổi.

Cả widget trạng thái và không trạng thái đều có vòng đời khác nhau.


Ngay cả sau khi chuyển một dữ liệu mới từ bên ngoài vào Statelesswidget, chúng ta cũng có thể thay đổi nó trong thời gian chạy nhưng nó không được gọi là Statefulwidget (ngược lại với dòng cuối cùng của bạn).
CopsOnRoad,

Bạn có thể vui lòng giải thích cách một widget Không trạng thái có thể "được cập nhật khi dữ liệu bên ngoài thay đổi" không? (Với "dữ liệu bên ngoài là dữ liệu được chuyển qua hàm tạo".) Liệu hàm tạo không chỉ được gọi một lần? Dữ liệu được truyền qua hàm tạo thay đổi như thế nào?
user1596274

8

Tôi có thể nghĩ về một phép loại suy rất đơn giản. Bạn có một số đồ nội thất với sách, đồ trang trí và TV. Đồ đạc không có trạng thái, không có gì không di chuyển. Mặt khác, trong TV, bạn có thể bật, tắt, thay đổi kênh, phát phim nếu có gắn đĩa DVD nào đó, v.v. TV có trạng thái bên trong ảnh hưởng đến cách hoạt động của nó. Trong đồ đạc bạn không có trạng thái. Sự hiện diện của TV trong đồ nội thất không làm tăng thêm trạng thái cho nó. Hi vọng điêu nay co ich.


Điều này không trả lời câu hỏi cụ thể của người hỏi.
Isaiah

1
Đây là một sự tương tự tuyệt vời!
William Terrill

6

Câu trả lời cho câu hỏi Stack Overflow - trạng thái và không trạng thái .

Trong Flutter, sự khác biệt là các widget không trạng thái có thể được xác định bởi tất cả các đối số của hàm khởi tạo. Nếu bạn tạo hai widget không trạng thái bằng cách sử dụng các đối số giống nhau, thì chúng sẽ giống nhau.

Tuy nhiên, một widget trạng thái không nhất thiết phải giống với một widget khác được xây dựng với cùng các đối số phương thức khởi tạo. Nó có thể ở một trạng thái khác.
Trên thực tế, một tiện ích trạng thái tự nó là bất biến (không trạng thái), nhưng Flutter quản lý một đối tượng trạng thái riêng biệt và liên kết đối tượng đó với tiện ích, như được giải thích trong tài liệu StatefulWidget . Điều này có nghĩa là khi Flutter xây dựng lại một widget trạng thái, nó sẽ kiểm tra xem nó có nên sử dụng lại một đối tượng trạng thái trước đó hay không và nếu muốn, sẽ đính kèm đối tượng trạng thái đó vào widget.

Widget cha là không trạng thái vì nó không quan tâm đến trạng thái của con của nó. Bản thân stateful child (hoặc Flutter về mặt kỹ thuật) sẽ tự chăm sóc trạng thái của nó.
Ở cấp độ cao, tôi đồng ý rằng điều này làm cho widget cha trở nên trạng thái, bởi vì hai cha mẹ có thể chứa hai con với các trạng thái khác nhau và do đó bản thân chúng cũng khác nhau về mặt kỹ thuật. Nhưng theo quan điểm của Flutter, nó xây dựng widget cha mà không quan tâm đến trạng thái và chỉ khi xây dựng con mới xem xét trạng thái của nó.


5

Vật dụng trạng thái và không trạng thái là gì?

TL; DR: Tiện ích cho phép bạn làm mới màn hình là tiện ích Stateful. Một tiện ích không phải là Không trạng thái.

Chi tiết hơn, một widget động có nội dung có thể thay đổi phải là một widget Stateful. Một widget không trạng thái chỉ có thể thay đổi nội dung khi các thông số được thay đổi và do đó cần phải được thực hiện ở trên điểm vị trí của nó trong hệ thống phân cấp widget. Màn hình hoặc tiện ích chứa nội dung tĩnh phải là tiện ích không trạng thái nhưng để thay đổi nội dung, cần phải ở trạng thái.

Tôi tìm thấy nội dung tương đối này trên một câu chuyện trung gian thú vị. Không có gì!


4

Không trạng thái : Trạng thái widget CHỈ tạo ra MỘT LẦN, sau đó nó có thể cập nhật các giá trị nhưng không phải trạng thái rõ ràng. Điều này cũng rõ ràng từ đó cấu trúc. Đó là lý do tại sao nó chỉ có một lớp mở rộng với StatelessWidget. Vì vậy, nếu tôi nói, họ không bao giờ có thể chạy build()lại phương thức một lần nữa.

Trạng thái : Các tiện ích có thể cập nhật STATE (cục bộ) và các giá trị của chúng nhiều lần khi sự kiện được kích hoạt . Đó là lý do, cách thực hiện cũng khác nhau. Trong này, chúng ta có 2 lớp, một lớp là StatefulWidget& lớp còn lại là trình xử lý triển khai Trạng thái tức là State<YourWidget>. Vì vậy, nếu tôi nói, họ có thể chạy build()lại phương pháp một lần nữa và một lần nữa dựa trên các sự kiện được kích hoạt.

Sơ đồ dưới đây sẽ giúp bạn.

nhập mô tả hình ảnh ở đây


1

Khi viết một ứng dụng, thông thường bạn sẽ tạo ra các widget mới là các lớp con của StatelessWidget hoặc StatefulWidget

Dưới đây là một số điểm khác biệt giữa widget StatelessWidgetStatefulWidgetwidget:

Widget không trạng thái:

  1. Một tiện ích có trạng thái bất biến.
  2. Stateless Widget là các widget tĩnh.
  3. Chúng không phụ thuộc vào bất kỳ thay đổi dữ liệu hoặc bất kỳ thay đổi hành vi nào.
  4. Stateless Widget không có trạng thái, chúng sẽ được hiển thị một lần và không tự cập nhật mà chỉ được cập nhật khi dữ liệu bên ngoài thay đổi.
  5. Ví dụ: Text, Icon, RaisedButtonlà Stateless Widgets.

Widget không trạng thái:

  1. Một tiện ích có trạng thái có thể thay đổi.
  2. Stateful Widget là các widget động.
  3. Chúng có thể được cập nhật trong thời gian chạy dựa trên hành động của người dùng hoặc thay đổi dữ liệu.
  4. Tiện ích trạng thái có trạng thái bên trong và có thể hiển thị lại nếu dữ liệu đầu vào thay đổi hoặc nếu trạng thái của tiện ích thay đổi.
  5. Ví dụ: Checkbox, Radio Button, Sliderlà Stateful Widgets

1

tuyên bố từ chối trách nhiệm: - bắt đầu làm việc với sự rung chuyển từ tuần trước :)

widget trạng tháikhông trạng thái có vòng đời riêng để tạo và cập nhật giao diện người dùng. tuy nhiên bạn có thể sử dụng trạng thái không trạng thái hoặc trạng thái đầy đủ để hiển thị giao diện người dùng nhưng trên thực tế trạng thái hoàn toàn tiện dụng hơn khi ui phụ thuộc hoàn toàn hoặc một phần vào dữ liệu bên ngoài (như - hiển thị danh sách bằng api) trong khi sử dụng tiện ích không trạng thái để hiển thị ui tĩnh như bất kỳ màn hình nhập nào. một thực hành tốt.


1
Tôi nghĩ tác giả có ý ngược lại: · D
Roc Boronat

0

Nói một cách đơn giản:

Như chúng ta biết mỗi widget là một chế độ xem trong sự rung chuyển. Trong đó có các lớp riêng của nó. Khi chúng ta sử dụng các lớp đó, chúng ta tạo ra một đối tượng của nó. Chúng tôi cung cấp giá trị cho các biến / thuộc tính khác nhau của chúng. Ví dụ. Chúng tôi đang tạo tiện ích Văn bản để chúng tôi có thể cung cấp cho nó Chuỗi, Màu, Kích thước phông chữ, Họ phông chữ. Vì vậy, bằng cách đưa ra điều này, chúng tôi đang xác định các thuộc tính của nó trong khi tạo ra nó. Cho đến thời điểm này, các widget Không trạng thái hoặc Có trạng thái giống nhau nhưng,

Khi chúng ta muốn thay đổi / cập nhật các thuộc tính của nó (giả sử là Chuỗi hoặc Màu) lặp đi lặp lại sau đó thì nó sẽ là tiện ích Stateful.

Và khi chúng ta không muốn thay đổi các thuộc tính của nó sau khi xác định lần đầu tiên nó là một widget không trạng thái.

điều đó có nghĩa là chúng tôi quan tâm đến dữ liệu mà tiện ích con nắm giữ / kiểm soát / hiển thị.

Vì vậy, Stateless là dữ liệu ít hơn và Stateful là dữ liệu đầy đủ.

Bây giờ nếu bạn xác định một lớp không trạng thái có nghĩa là lớp này không quan tâm / có các biến trong đó hoặc nói dữ liệu trong lớp của chính nó tức là mức lớp nhưng nó có thể có một tiện ích / lớp khác trong đó quan tâm đến dữ liệu tức là nó có trạng thái . Vì vậy nó không có bất kỳ tác động nào đến nhau.

Vui lòng sửa cho tôi nếu tôi sai ở đây.


0

Vật dụng trạng thái và không trạng thái là gì?

Widget không trạng thái: Widget không trạng thái chỉ được xây dựng khi nó có những thay đổi chính.

Stateful Widgets: Stateful widgets giữ trạng thái của widget và có thể được xây dựng lại khi trạng thái thay đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.