StatefulWidget vs StatelessWidget.
StatelessWidget - Sebuah widget yang tidak membutuhkan status yang bisa berubah.
Widget stateless adalah widget yang mendeskripsikan bagian dari antarmuka pengguna dengan membuat konstelasi widget lain yang mendeskripsikan antarmuka pengguna secara lebih konkret. Proses pembangunan berlanjut secara rekursif hingga deskripsi antarmuka pengguna benar-benar konkret (misalnya, seluruhnya terdiri dari RenderObjectWidgets, yang mendeskripsikan RenderObjects konkret).
The stateless
widget berguna ketika bagian dari antarmuka pengguna Anda gambarkan tidak bergantung pada apa pun selain informasi konfigurasi di obyek itu sendiri dan
BuildContext di mana widget tersebut meningkat. Untuk komposisi yang dapat berubah secara dinamis, misalnya karena memiliki status clock-driven internal, atau bergantung pada beberapa status sistem, pertimbangkan untuk menggunakan
StatefulWidget
.
class GreenFrog extends StatelessWidget {
const GreenFrog({ Key key }) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(color: const Color(0xFF2DBD3A));
}
}
StatefulWidget - Widget yang statusnya bisa berubah.
- Widget stateful berguna jika bagian dari antarmuka pengguna yang Anda gambarkan dapat berubah secara dinamis.
Saat Flutter membuat StatefulWidget
, itu membuat objek Status. Objek ini adalah tempat semua status yang bisa berubah untuk widget itu diadakan.
Konsep negara didefinisikan oleh dua hal:
1) Data yang digunakan oleh widget mungkin berubah.
2) Data tidak dapat dibaca secara sinkron saat widget dibuat. (Semua status harus ditetapkan pada saat metode build dipanggil).
Siklus hidup StatefulWidget
Siklus hidup memiliki langkah-langkah sederhana berikut:
- createState () - Ketika Flutter diinstruksikan untuk membuat StatefulWidget, itu segera memanggil
createState()
.
@override
_MyState createState() => _MyState();
- mount == true - Semua widget memiliki
this.mounted
properti bool . Ternyata benar saat buildContext
ditetapkan. Ini adalah kesalahan untuk menelepon setState
saat widget dilepas. Apakah objek Status saat ini ada di dalam pohon.
Setelah membuat objek State dan sebelum memanggil initState
, framework "me-mount" objek State dengan mengaitkannya dengan a
BuildContext
. Objek State tetap dipasang hingga framework
memanggil dispose()
, setelah itu framework tidak akan pernah meminta
objek State untuk dibuat lagi.
Ini adalah kesalahan untuk memanggil setState kecuali mount benar.
bool get mounted => _element != null;
- initState () - Ini adalah metode pertama yang dipanggil ketika widget dibuat (tentu saja setelah konstruktor kelas.)
initState
dipanggil sekali dan hanya sekali. Itu harus meneleponsuper.initState().
Inisialisasi data yang bergantung pada BuildContext spesifik untuk instance widget yang dibuat.
Inisialisasi properti yang mengandalkan 'induk' widget ini di pohon.
Berlangganan Stream,, ChangeNotifiers
atau objek lain yang dapat mengubah data di widget ini.
@override
initState() {
super.initState();
cartItemStream.listen((data) {
_updateWidget(data);
});
}
- didChangeDependencies () - Dipanggil ketika dependensi objek Status ini berubah.
Metode ini juga dipanggil segera setelahnya initState
. Aman untuk menelepon BuildContext.inheritFromWidgetOfExactType
dari metode ini.
Subclass jarang mengganti metode ini karena framework selalu memanggil build setelah perubahan dependensi. Beberapa subclass mengganti metode ini karena mereka perlu melakukan beberapa pekerjaan yang mahal (misalnya, pengambilan jaringan) ketika dependensinya berubah, dan pekerjaan itu akan terlalu mahal untuk dilakukan untuk setiap build.
@protected
@mustCallSuper
void didChangeDependencies() { }
- build () - Menjelaskan bagian dari antarmuka pengguna yang diwakili oleh widget.
Kerangka kerja memanggil metode ini dalam sejumlah situasi berbeda:
- Setelah menelepon
initState
.
- Setelah menelepon
didUpdateWidget
.
- Setelah menerima panggilan ke
setState
.
- Setelah ketergantungan objek Status ini berubah (misalnya, InheritedWidget yang direferensikan oleh perubahan build sebelumnya).
- Setelah memanggil nonaktifkan dan kemudian memasukkan kembali objek Negara ke pohon di lokasi lain.
Kerangka kerja mengganti subtree di bawah widget ini dengan widget yang dikembalikan oleh metode ini, baik dengan memperbarui subtree yang ada atau dengan menghapus subtree dan meluaskan subtree baru, bergantung pada apakah widget yang dikembalikan oleh metode ini dapat memperbarui root subtree yang ada , sebagaimana ditentukan dengan menelepon
Widget.canUpdate
.
Biasanya implementasi mengembalikan konstelasi widget yang baru dibuat yang dikonfigurasi dengan informasi dari konstruktor widget ini, BuildContext yang diberikan , dan status internal objek Status ini.
@override
Widget build(BuildContext context, MyButtonState state) {
... () { print("color: $color"); } ...
}
- didUpdateWidget () - Dipanggil setiap kali konfigurasi widget berubah.
Jika widget induk membangun kembali dan meminta lokasi ini dalam pembaruan hierarki untuk menampilkan widget baru dengan jenis waktu proses dan Widget.key yang sama, kerangka kerja akan memperbarui properti widget dari objek Status ini untuk merujuk ke widget baru dan kemudian memanggil ini metode dengan widget sebelumnya sebagai argumen.
Ganti metode ini untuk merespons ketika widget berubah (misalnya, untuk memulai animasi implisit).
Framework selalu memanggil build setelah memanggil didUpdateWidget, yang berarti setiap panggilan ke setState di didUpdateWidget bersifat redundan.
@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
- setState () - Setiap kali Anda mengubah status internal objek State, buat perubahan dalam fungsi yang Anda teruskan ke
setState
:
Memanggil setState memberi tahu framework bahwa status internal objek ini telah berubah dengan cara yang mungkin memengaruhi antarmuka pengguna di subpohon ini, yang menyebabkan framework menjadwalkan build untuk
objek Status ini .
Jika Anda hanya mengubah status secara langsung tanpa memanggil setState , framework mungkin tidak menjadwalkan build dan antarmuka pengguna untuk subpohon ini mungkin tidak diperbarui untuk mencerminkan status baru.
setState(() { _myState = newValue });
- deactivate () - Deactivate dipanggil ketika Status dihapus dari pohon, tetapi mungkin dimasukkan kembali sebelum perubahan frame saat ini selesai. Metode ini ada pada dasarnya karena objek Negara dapat dipindahkan dari satu titik di pohon ke pohon lainnya.
- Kerangka kerja memanggil metode ini setiap kali ia menghapus objek Status ini dari pohon. Dalam beberapa kasus, kerangka kerja akan memasukkan kembali objek Status ke bagian lain dari pohon (misalnya, jika subpohon yang berisi objek Status ini dicangkokkan dari satu lokasi di pohon ke pohon lainnya). Jika itu terjadi, kerangka kerja akan memastikan bahwa ia memanggil build untuk memberi objek Negara kesempatan untuk beradaptasi dengan lokasi barunya di pohon. Jika kerangka kerja memasukkan kembali subpohon ini, kerangka akan melakukannya sebelum akhir bingkai animasi di mana subpohon tersebut telah dihapus dari pohon. Karena alasan ini, objek State dapat menunda pelepasan sebagian besar resource hingga framework memanggil metode pembuangannya.
Ini jarang digunakan.
@protected
@mustCallSuper
void deactivate() { }
- dispose () - Dipanggil saat objek ini dihapus dari pohon secara permanen.
Framework memanggil metode ini saat objek Status ini tidak akan pernah dibuat lagi. Setelah panggilan framework dispose()
, objek State dianggap unmount dan properti mount false. Ini adalah kesalahan untuk memanggil setState pada saat ini. Tahap siklus hidup ini adalah terminal: tidak ada cara untuk memasang kembali objek Status yang telah dibuang.
Subclass harus mengganti metode ini untuk melepaskan resource apa pun yang dipertahankan oleh objek ini (misalnya, menghentikan animasi aktif).
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}
Untuk info lebih lanjut buka di sini , di sini