Widżet stanowy jest definiowany jako dowolny widget, który zmienia swój stan w trakcie swojego istnienia. Ale to jest bardzo powszechną praktyką, StatelessWidget
że a StatefulWidget
jako jedno ze swoich dzieci. Nie StatelessWidget
staje się stanowy, jeśli jest StatefulWidget
jednym ze swoich dzieci?
Próbowałem zajrzeć do dokumentacji jako części kodu StatelessWidget
, ale nie mogłem dowiedzieć się, jak StatelessWidget
może mieć Statefulwidget
jako dzieci i nadal pozostać StatelessWidget
.
Jaka jest relacja i różnica między widżetami stanowymi i bezstanowymi w Flutterze?
dart
flutter
statefulwidget
statelesswidget
user462455
źródło
źródło
InheritedWidget
; Które mogą spowodowaćStatelessWidget
aktualizację.Odpowiedzi:
StatelessWidget nigdy nie odbudować sama (ale może ze zdarzeń zewnętrznych). StatefulWidget możliwe. To jest złota zasada.
ALE każdy rodzaj widżetu można przemalować w dowolnym momencie.
Bezstanowy oznacza jedynie, że wszystkie jego właściwości są niezmienne i jedynym sposobem ich zmiany jest utworzenie nowej instancji tego widżetu. Nie blokuje np. Drzewa widżetów.
Ale nie powinieneś przejmować się typem twoich dzieci. Nie ma to na ciebie żadnego wpływu.
źródło
rebuild
irepaint
StateFulWidget
są one niezmienne.StatefulWidget vs StatelessWidget.
StatelessWidget - widget, który nie wymaga zmiany stanu.
class GreenFrog extends StatelessWidget { const GreenFrog({ Key key }) : super(key: key); @override Widget build(BuildContext context) { return Container(color: const Color(0xFF2DBD3A)); } }
StatefulWidget - widget, który ma zmienny stan.
Kiedy Flutter buduje obiekt
StatefulWidget
, tworzy obiekt State. Ten obiekt jest miejscem, w którym przechowywany jest cały zmienny stan tego widżetu.Pojęcie stanu definiują dwie rzeczy:
Cykl życia StatefulWidget
Cykl życia składa się z następujących uproszczonych kroków:
createState()
.@override _MyState createState() => _MyState();
this.mounted
właściwość bool . Okazuje się prawdą, gdybuildContext
zostanie przypisany. Błędem jest wywołanie,setState
gdy widget jest odmontowany. Czy ten obiekt State znajduje się obecnie w drzewie.bool get mounted => _element != null;
initState
jest wywoływana raz i tylko raz. To musi zadzwonićsuper.initState().
@override initState() { super.initState(); // Add listeners to this class cartItemStream.listen((data) { _updateWidget(data); }); }
@protected @mustCallSuper void didChangeDependencies() { }
Framework wywołuje tę metodę w wielu różnych sytuacjach:
initState
.didUpdateWidget
.setState
.@override Widget build(BuildContext context, MyButtonState state) { ... () { print("color: $color"); } ... }
@mustCallSuper @protected void didUpdateWidget(covariant T oldWidget) { }
setState
:Jest to rzadko używane.
@protected @mustCallSuper void deactivate() { }
@protected @mustCallSuper void dispose() { assert(_debugLifecycleState == _StateLifecycle.ready); assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }()); }
Więcej informacji można znaleźć tutaj , tutaj
źródło
Z dokumentacji na flutter.io :
źródło
Jak wspomniano w flutter Docs
Jaki jest sens?
Niektóre widżety są stanowe, a inne bezstanowe. Jeśli widget się zmieni - na przykład użytkownik wejdzie z nim w interakcję - jest stanowy. Stan widżetu składa się z wartości, które mogą się zmieniać, takich jak bieżąca wartość suwaka lub zaznaczenie pola wyboru. Stan widgetu jest przechowywany w obiekcie State, oddzielając stan widgetu od jego wyglądu. Kiedy zmienia się stan widgetu, obiekt stanu wywołuje metodę setState (), informując platformę o konieczności ponownego narysowania widgetu.
Widget bezpaństwowcem ma stan wewnętrzny w zarządzaniu. Icon, IconButton i Text to przykłady bezstanowych widgetów, które stanowią podklasę StatelessWidget.
Stateful widget jest dynamiczna. Użytkownik może wchodzić w interakcje z widgetem stanowym (na przykład wpisując w formularzu lub przesuwając suwak) lub zmienia się on w czasie (być może źródło danych powoduje aktualizację interfejsu użytkownika). Checkbox, Radio, Slider, InkWell, Form i TextField to przykłady widgetów stanowych, które stanowią podklasę StatefulWidget.
https://flutter.io/tutorials/interactive/#stateful-stateless
źródło
Stan to informacja, która (1) może być odczytywana synchronicznie podczas budowania widgetu i (2) może się zmieniać w trakcie jego życia. Wdrażający widget jest odpowiedzialny za zapewnienie, że stan zostanie niezwłocznie powiadomiony o zmianie takiego stanu za pomocą funkcji State.setState.
StatefulWidget :
Widżet stanowy to widget, który opisuje część interfejsu użytkownika, tworząc konstelację innych widżetów, które bardziej konkretnie opisują interfejs użytkownika. Proces budowania jest kontynuowany rekurencyjnie, aż opis interfejsu użytkownika jest w pełni konkretny (np. Składa się w całości z RenderObjectWidgets, które opisują konkretne RenderObjects).
Widget pełnostanowy jest przydatny, gdy opisywana część interfejsu użytkownika może zmieniać się dynamicznie, np. Z powodu wewnętrznego stanu sterowanego zegarem lub w zależności od stanu systemu. W przypadku kompozycji, które zależą tylko od informacji konfiguracyjnych w samym obiekcie i BuildContext, w którym widżet jest zawyżony, rozważ użycie StatelessWidget.
Same instancje StatefulWidget są niezmienne i przechowują swój zmienny stan w oddzielnych obiektach State, które są tworzone przez metodę createState, lub w obiektach, które subskrybuje ten stan, na przykład obiekty Stream lub ChangeNotifier, do których odwołania są przechowywane w końcowych polach w StatefulWidget samo.
StatelessWidget :
Bezstanowy widget to widget, który opisuje część interfejsu użytkownika, tworząc konstelację innych widgetów, które opisują interfejs użytkownika bardziej konkretnie. Proces budowania jest kontynuowany rekurencyjnie, aż opis interfejsu użytkownika jest w pełni konkretny (np. Składa się w całości z RenderObjectWidgets, które opisują konkretne RenderObjects).
Widget bezstanowy jest przydatny, gdy opisywana część interfejsu użytkownika nie zależy od niczego innego niż informacje konfiguracyjne w samym obiekcie i BuildContext, w którym widżet jest zawyżony. W przypadku kompozycji, które mogą zmieniać się dynamicznie, np. Z powodu wewnętrznego stanu sterowanego zegarem lub w zależności od stanu systemu, należy rozważyć użycie StatefulWidget.
źródło
Widgety bezstanowe to widżety statyczne. Wystarczy przekazać kilka właściwości przed zainicjowaniem widgetów bezstanowych. Nie są zależne od żadnych zmian danych ani zmian zachowania. Na przykład. Text, Icon, RaisedButton to widżety bezstanowe.
Stateful Widgets to dynamiczne widżety, które można aktualizować w czasie wykonywania na podstawie działań użytkownika lub zmian danych. Jeśli widget może zmienić swój stan w czasie wykonywania, będzie to widget stanowy.
Edycja 15/11/2018
Widżety bezstanowe mogą być ponownie renderowane, jeśli zmieniły się dane wejściowe / zewnętrzne (dane zewnętrzne to dane przekazywane przez konstruktor). Ponieważ bezstanowe widżety nie mają stanu, zostaną wyrenderowane raz i nie zaktualizują się same, ale zostaną zaktualizowane tylko w przypadku zmiany danych zewnętrznych.
Natomiast Stateful Widgets mają stan wewnętrzny i mogą być ponownie renderowane, jeśli zmienią się dane wejściowe lub stan Widgetu ulegnie zmianie.
Zarówno widżety bezstanowe, jak i stanowe mają inny cykl życia.
źródło
Stateless
widżetu możemy je również zmienić w czasie wykonywania, ale nie nazywa się toStateful
widżetem (w przeciwieństwie do ostatniej linii).Przychodzi mi do głowy bardzo prosta analogia. Masz jakiś mebel z książkami, dekoracjami i telewizorem. Meble są bezpaństwowe, nic się nie rusza. W telewizorze z drugiej strony można go włączać, wyłączać, zmieniać kanał, odtwarzać film, jeśli jest do niego dołączona płyta DVD itp. W telewizorze występuje stan wewnętrzny, który wpływa na sposób, w jaki się zachowuje. W meblach nie masz stanu. Obecność telewizora w meblu nie dodaje mu stanu. Mam nadzieję że to pomoże.
źródło
Odpowiedź na pytanie przepełnienia stosu - stanowość a bezpaństwowość .
We Flutterze różnica polega na tym, że bezstanowe widżety mogą być definiowane przez same argumenty konstruktora. Jeśli utworzysz dwa bezstanowe widgety przy użyciu tych samych argumentów, będą one takie same.
Jednak widget stanowy niekoniecznie jest tym samym, co inny widget zbudowany z tymi samymi argumentami konstruktora. Może być w innym stanie.
W rzeczywistości widget stanowy sam w sobie jest niezmienny (bezstanowy), ale Flutter zarządza oddzielnym obiektem stanu i kojarzy go z widgetem, jak wyjaśniono w dokumencie StatefulWidget . Oznacza to, że kiedy Flutter odbuduje widget stanowy, sprawdzi, czy powinien ponownie użyć poprzedniego obiektu stanu i, jeśli to konieczne, dołączy ten obiekt stanu do widgetu.
Widżet rodzica jest bezpaństwowy, ponieważ nie dba o stan swojego dziecka. Samo stanowe dziecko (lub technicznie Flutter) zajmie się swoim własnym stanem.
Na wysokim poziomie zgadzam się, że to sprawia, że widżet rodzica jest stanowy, ponieważ dwoje rodziców może zawierać dwoje dzieci z różnymi stanami, a tym samym być technicznie różni. Ale z punktu widzenia Fluttera buduje widget nadrzędny bez dbania o stan i dopiero podczas budowania dziecko uzna jego stan.
źródło
Co to są widżety stanowe i bezstanowe?
TL; DR: widget, który umożliwia odświeżanie ekranu, jest widgetem Stateful. Widżet, który go nie posiada, jest bezstanowy.
Bardziej szczegółowo, dynamiczny widget z treścią, która może się zmieniać, powinien być widgetem Stateful. Widżet bezstanowy może zmieniać zawartość tylko wtedy, gdy zmieniają się parametry, a zatem należy to zrobić powyżej punktu jego lokalizacji w hierarchii widgetów. Ekran lub widżet zawierający zawartość statyczną powinien być widżetem bezstanowym, ale aby zmienić zawartość, musi być stanowy.
Znalazłem tę względną treść w interesującej historii medium. Nie ma za co!
źródło
Bezstanowy : stan widżetu jest tworzony TYLKO RAZ, wtedy może aktualizować wartości, ale nie jawnie stan . Stąd też jasno wynika struktura. Dlatego ma tylko jedną klasę, która rozszerza się z
StatelessWidget
. Więc jeśli powiem, nie mogą już nigdy ponownie uruchomićbuild()
metody.Stanowe : widżety mogą aktualizować swój STAN (lokalnie) i wartości wiele razy po wyzwoleniu zdarzenia . Dlatego też implementacja jest inna. W tym mamy 2 klasy, jedna to,
StatefulWidget
a druga to program obsługi implementacji stanu, tjState<YourWidget>
. Więc jeśli powiem, mogą ponownie uruchomićbuild()
metodę w oparciu o wywołane zdarzenia.Poniższy schemat pomoże.
źródło
Bezstanowy i stanowy widget ma swój własny cykl życia tworzenia i aktualizowania interfejsu użytkownika. jednak możesz użyć bezstanowego lub stanowego do renderowania interfejsu użytkownika, ale praktycznie stanowe są bardziej przydatne, gdy interfejs użytkownika jest całkowicie lub częściowo zależny od danych zewnętrznych (jak - renderowanie listy za pomocą interfejsu API), podczas gdy używanie bezstanowego widgetu do renderowania statycznego interfejsu użytkownika, jak każdy ekran wejściowy, jest dobra praktyka.
źródło
Podczas pisania aplikacji często tworzysz nowe widżety, które są podklasami StatelessWidget lub StatefulWidget
Oto kilka różnic między
StatelessWidget
iStatefulWidget
widżetami:Widget bezstanowy:
Text
,Icon
,RaisedButton
są bezpaństwowe wzory.Stateful Widget:
Checkbox
,Radio Button
,Slider
są stanowa Widgetyźródło
W prostych słowach:
Jak wiemy, każdy widżet to widok w trzepotaniu. Który ma swoje własne klasy. Kiedy używamy tych klas, tworzymy z nich obiekt. Podajemy wartości ich różnym zmiennym / właściwościom. Dawny. Tworzymy widżet Tekst, abyśmy mogli nadać mu ciąg, kolor, rozmiar czcionki, rodzinę czcionek. Więc dając to, definiujemy jego właściwości podczas jego tworzenia. Do tego momentu widżety bezstanowe i stanowe są takie same, ale
Kiedy chcemy zmieniać / aktualizować jego właściwości (powiedzmy String lub Color) później i znowu, to powinien być widget Stateful.
A kiedy nie chcemy zmieniać jego właściwości po pierwszym zdefiniowaniu, jest to widget bezstanowy.
oznacza to, że zależy nam na danych, które widżet przechowuje / kontroluje / pokazuje.
Zatem bezstanowe to dane mniej, a stanowe to pełne dane.
Teraz, jeśli zdefiniujesz klasę, która jest bezstanowa, oznacza to, że ta klasa nie przejmuje się / ma zmienne w niej lub powiedz, że dane są w swojej własnej klasie, tj. Na poziomie klasy, ale może mieć w sobie inny widget / klasę, która dba o dane, tj. Jest Stanowa . Więc nie ma to na siebie żadnego wpływu.
Proszę mnie poprawić, jeśli się mylę.
źródło
Co to są widżety stanowe i bezstanowe?
Widget bezstanowy: widget bezstanowy jest kompilowany tylko wtedy, gdy zawiera zmiany nadrzędne.
Stateful Widgets: Pełne widgety stanu przechowują stan widżetu i można je odbudować, gdy stan się zmieni.
źródło