StatefulWidget ve StatelessWidget.
StatelessWidget - Değiştirilebilir durum gerektirmeyen bir widget.
Durum bilgisi olmayan bir pencere öğesi, kullanıcı arayüzünü daha somut bir şekilde tanımlayan diğer pencere öğelerinin bir takımyıldızını oluşturarak kullanıcı arayüzünün bir bölümünü tanımlayan bir pencere öğesidir. Oluşturma süreci, kullanıcı arayüzünün tanımı tamamen somut hale gelene kadar yinelemeli olarak devam eder (örneğin, tamamen somut RenderObjects'i tanımlayan tamamen RenderObjectWidgets'dan oluşur).
stateless
Sizin tarif edilmektedir arayüz kullanıcı parçası nesnenin kendisi ve yapılandırma bilgisi dışında bir bağlı değildir Kullanıcı widget yararlıdır
BuildContext Widget şişirilmiş olduğu. Dinamik olarak değişebilen kompozisyonlar için, örneğin dahili bir saat güdümlü duruma sahip olma nedeniyle veya bazı sistem durumuna bağlı olarak kullanmayı düşünün
StatefulWidget
.
class GreenFrog extends StatelessWidget {
const GreenFrog({ Key key }) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(color: const Color(0xFF2DBD3A));
}
}
StatefulWidget - Değiştirilebilir duruma sahip bir widget.
- Durum bilgili pencere öğeleri, tanımladığınız kullanıcı arabiriminin parçası dinamik olarak değişebildiği zaman kullanışlıdır.
Flutter a StatefulWidget
oluşturduğunda, bir State nesnesi oluşturur. Bu nesne, o parçacığın tüm değiştirilebilir durumunun tutulduğu yerdir.
Devlet kavramı iki şeyle tanımlanır:
1) Widget tarafından kullanılan veriler değişebilir.
2) Widget oluşturulduğunda veriler eşzamanlı olarak okunamaz. (Tüm durum, oluşturma yöntemi çağrıldığında belirlenmelidir).
StatefulWidget yaşam döngüsü
Yaşam döngüsü aşağıdaki basitleştirilmiş adımlara sahiptir:
- createState () - Flutter'a bir StatefulWidget oluşturma talimatı verildiğinde, hemen çağırır
createState()
.
Ağaçta belirli bir konumda bu widget için değiştirilebilir durumu oluşturur.
Alt sınıflar, ilişkili Durum alt sınıfının yeni oluşturulmuş bir örneğini döndürmek için bu yöntemi geçersiz kılmalıdır:
@override
_MyState createState() => _MyState();
- mount == true - Tüm widget'ların bool
this.mounted
özelliği vardır. Atandığında gerçek olur buildContext
. setState
Bir parçacığın bağlantısı kesildiğinde arama yapmak bir hatadır . Bu State nesnesinin şu anda bir ağaçta olup olmadığı.
Bir State nesnesi yarattıktan sonra ve çağırmadan önce initState
, çerçeve State nesnesini a ile ilişkilendirerek "bağlar"
BuildContext
. State nesnesi, çerçeve
çağrılarına kadar bağlı kalır dispose()
, bu sürenin sonunda çerçeve,
Devlet nesnesinin bir daha inşa etmesini asla istemez .
Mount doğru olmadığı sürece setState'i çağırmak bir hatadır.
bool get mounted => _element != null;
- initState () - Bu, widget oluşturulduğunda çağrılan ilk yöntemdir (tabii ki sınıf yapıcısından sonra.)
initState
sadece bir kez çağrılır. Aramalısuper.initState().
Widget'ın oluşturulan örneği için belirli BuildContext'e dayanan verileri başlatın.
Ağaçtaki bu widget'lara bağlı olan özellikleri başlatın.
Akışlara ChangeNotifiers
veya bu widget'taki verileri değiştirebilecek başka herhangi bir nesneye abone olun .
@override
initState() {
super.initState();
cartItemStream.listen((data) {
_updateWidget(data);
});
}
- didChangeDependencies () - Bu State nesnesinin bir bağımlılığı değiştiğinde çağrılır.
Bu yöntem hemen ardından da çağrılır initState
. BuildContext.inheritFromWidgetOfExactType
Bu yöntemden aramak güvenlidir .
Alt sınıflar bu yöntemi nadiren geçersiz kılar çünkü çerçeve her zaman bağımlılık değişikliklerinden sonra build çağırır. Bazı alt sınıflar bu yöntemi geçersiz kılar çünkü bağımlılıkları değiştiğinde bazı pahalı işler (örneğin ağ getirmeleri) yapmaları gerekir ve bu iş her derleme için çok pahalı olur.
@protected
@mustCallSuper
void didChangeDependencies() { }
- build () - Kullanıcı arabiriminin pencere öğesi tarafından temsil edilen bölümünü açıklar.
Çerçeve, bu yöntemi birkaç farklı durumda çağırır:
- Aradıktan sonra
initState
.
- Aradıktan sonra
didUpdateWidget
.
- İçin bir çağrı aldıktan sonra
setState
.
- Bu State nesnesinin bir bağımlılığı değiştikten sonra (örneğin, önceki yapı değişiklikleri tarafından başvurulan bir InheritedWidget).
- Devre dışı bırakma çağrıldıktan sonra State nesnesini başka bir konumdaki ağaca yeniden yerleştirin.
Çerçeve, mevcut alt ağacı güncelleyerek veya alt ağacı kaldırıp yeni bir alt ağacı şişirerek bu pencere aracının altındaki alt ağacı bu yöntemle döndürülen pencere öğesi ile değiştirir, bu yöntemle döndürülen pencere aracının mevcut alt ağacın kökünü güncelleyip güncellememesine bağlı , arayarak belirlendiği gibi
Widget.canUpdate
.
Tipik olarak uygulamalar, bu pencere aracının yapıcısından, verilen BuildContext'ten ve bu Durum nesnesinin dahili durumundan gelen bilgilerle yapılandırılmış yeni oluşturulmuş bir pencere öğesi takımyıldızı döndürür .
@override
Widget build(BuildContext context, MyButtonState state) {
... () { print("color: $color"); } ...
}
- didUpdateWidget () - Widget yapılandırması her değiştiğinde çağrılır.
Ana pencere öğesi yeniden oluşturur ve ağaçtaki bu konumun aynı çalışma zamanı türüne ve Widget.key'e sahip yeni bir pencere öğesi görüntülemesini talep ederse, çerçeve bu Durum nesnesinin pencere öğesi özelliğini yeni pencere aracına başvuracak şekilde günceller ve ardından bunu çağırır argüman olarak önceki widget ile yöntem.
Widget değiştiğinde yanıt vermek için bu yöntemi geçersiz kılın (ör. Örtük animasyonları başlatmak için).
Çerçeve didUpdateWidget'i çağırdıktan sonra her zaman build çağırır, bu da didUpdateWidget içindeki setState çağrılarının gereksiz olduğu anlamına gelir.
@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
- setState () - Bir State nesnesinin dahili durumunu her değiştirdiğinizde, ilettiğiniz bir işlevde değişikliği yapın
setState
:
Arayan setState bu nesnenin iç durumu için bir yapı zamanlama çerçeveyi neden bu alt ağaç, kullanıcı arabirimini etkileyebilecek şekilde değiştiğini çerçeve bildirebilmesi
bu Devlet nesne.
SetState'i çağırmadan durumu doğrudan değiştirirseniz, çerçeve bir yapı planlamayabilir ve bu alt ağacın kullanıcı arabirimi yeni durumu yansıtacak şekilde güncellenmeyebilir.
setState(() { _myState = newValue });
- deactivate () - Deactivate, ağaçtan Durum kaldırıldığında çağrılır, ancak geçerli çerçeve değişikliği tamamlanmadan önce yeniden eklenebilir. Bu yöntem temelde vardır çünkü State nesneleri bir ağaçtaki bir noktadan diğerine taşınabilir.
- Çerçeve, bu State nesnesini ağaçtan kaldırdığında bu yöntemi çağırır. Bazı durumlarda çerçeve, State nesnesini ağacın başka bir kısmına yeniden yerleştirecektir (örneğin, bu Durum nesnesini içeren alt ağacın ağaçtaki bir konumdan diğerine aşılanması durumunda). Böyle bir durumda çerçeve, State nesnesine ağaçtaki yeni konumuna uyum sağlaması için bir şans vermek için build çağrısı yapmasını sağlayacaktır. Çerçeve bu alt ağacı yeniden yerleştirirse, bunu alt ağacın ağaçtan kaldırıldığı animasyon karesinin sonundan önce yapacaktır. Bu nedenle, State nesneleri, çerçeve dispose yöntemini çağırana kadar çoğu kaynağı serbest bırakmayı erteleyebilir.
Bu nadiren kullanılır.
@protected
@mustCallSuper
void deactivate() { }
- dispose () - Bu nesne ağaçtan kalıcı olarak kaldırıldığında çağrılır.
Çerçeve, bu State nesnesi bir daha asla oluşturulmayacağı zaman bu yöntemi çağırır. Çerçeve çağrılarından sonra, dispose()
State nesnesi unmounted olarak kabul edilir ve mount özelliği false olur. Bu noktada setState'i çağırmak bir hatadır. Yaşam döngüsünün bu aşaması terminaldir: Elden çıkarılmış bir State nesnesini yeniden bağlamanın bir yolu yoktur.
Alt sınıflar, bu nesne tarafından tutulan kaynakları serbest bırakmak için bu yöntemi geçersiz kılmalıdır (örneğin, tüm etkin animasyonları durdurun).
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}
Daha fazla bilgi için gitmek burada burada , burada