Widget stateful didefinisikan sebagai widget apa pun yang mengubah statusnya selama masa pakainya. Tapi itu adalah praktik yang sangat umum untuk StatelessWidget
memiliki anak StatefulWidget
sebagai salah satu anaknya. Tidak StatelessWidget
menjadi stateful jika memiliki StatefulWidget
sebagai salah satu anaknya?
Saya mencoba melihat dokumentasi sebagai bagian dari kode StatelessWidget
, tetapi tidak dapat menemukan bagaimana a StatelessWidget
dapat memiliki Statefulwidget
sebagai anaknya dan masih tetap ada StatelessWidget
.
Apa hubungan dan perbedaan antara widget stateful dan stateless di Flutter?
dart
flutter
statefulwidget
statelesswidget
pengguna462455
sumber
sumber
InheritedWidget
; Yang bisa membuatStatelessWidget
pembaruan.Jawaban:
Sebuah StatelessWidget tidak akan pernah kembali dengan sendirinya (tapi dapat dari peristiwa eksternal). Sebuah StatefulWidget bisa. Itu adalah aturan emasnya.
TAPI semua jenis widget dapat dicat ulang kapan saja.
Stateless hanya berarti bahwa semua propertinya tidak dapat diubah dan satu-satunya cara untuk mengubahnya adalah dengan membuat instance baru dari widget itu. Misalnya tidak mengunci pohon widget.
Tapi Anda tidak perlu peduli dengan tipe anak Anda. Itu tidak berdampak apa pun pada Anda.
sumber
rebuild
danrepaint
StateFulWidget
s juga tidak dapat diubah.StatefulWidget vs StatelessWidget.
StatelessWidget - Sebuah widget yang tidak membutuhkan status yang bisa berubah.
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.
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:
Siklus hidup StatefulWidget
Siklus hidup memiliki langkah-langkah sederhana berikut:
createState()
.@override _MyState createState() => _MyState();
this.mounted
properti bool . Ternyata benar saatbuildContext
ditetapkan. Ini adalah kesalahan untuk meneleponsetState
saat widget dilepas. Apakah objek Status saat ini ada di dalam pohon.bool get mounted => _element != null;
initState
dipanggil sekali dan hanya sekali. Itu harus meneleponsuper.initState().
@override initState() { super.initState(); // Add listeners to this class cartItemStream.listen((data) { _updateWidget(data); }); }
@protected @mustCallSuper void didChangeDependencies() { }
Kerangka kerja memanggil metode ini dalam sejumlah situasi berbeda:
initState
.didUpdateWidget
.setState
.@override Widget build(BuildContext context, MyButtonState state) { ... () { print("color: $color"); } ... }
@mustCallSuper @protected void didUpdateWidget(covariant T oldWidget) { }
setState
:Ini jarang digunakan.
@protected @mustCallSuper void deactivate() { }
@protected @mustCallSuper void dispose() { assert(_debugLifecycleState == _StateLifecycle.ready); assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }()); }
Untuk info lebih lanjut buka di sini , di sini
sumber
Dari dokumentasi di flutter.io :
sumber
Seperti disebutkan dalam dokumen flutter
Apa gunanya?
Beberapa widget stateful, dan beberapa stateless. Jika widget berubah — pengguna berinteraksi dengannya, misalnya — itu stateful. Status widget terdiri dari nilai-nilai yang dapat berubah, seperti nilai slider saat ini atau apakah kotak centang dicentang. Status widget disimpan dalam objek Status, memisahkan status widget dari tampilannya. Saat status widget berubah, objek status memanggil setState (), memberi tahu framework untuk menggambar ulang widget.
Sebuah widget stateless tidak memiliki keadaan internal untuk mengelola. Icon, IconButton, dan Text adalah contoh widget stateless, yang merupakan subclass StatelessWidget.
Sebuah widget stateful dinamis. Pengguna dapat berinteraksi dengan widget stateful (dengan mengetik ke dalam formulir, atau menggerakkan slider, misalnya), atau berubah seiring waktu (mungkin data feed menyebabkan UI diperbarui). Checkbox, Radio, Slider, InkWell, Form, dan TextField adalah contoh widget stateful, yang merupakan subclass StatefulWidget.
https://flutter.io/tutorials/interactive/#stateful-stateless
sumber
Status adalah informasi yang (1) dapat dibaca secara sinkron saat widget dibuat dan (2) mungkin berubah selama masa pakai widget. Ini adalah tanggung jawab pelaksana widget untuk memastikan bahwa Status segera diberi tahu ketika status tersebut berubah, menggunakan State.setState.
StatefulWidget :
Widget stateful adalah widget yang mendeskripsikan bagian 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).
Widget stateful berguna ketika bagian dari antarmuka pengguna yang Anda gambarkan dapat berubah secara dinamis, misalnya karena memiliki status internal clock-driven, atau bergantung pada beberapa status sistem. Untuk komposisi yang hanya bergantung pada informasi konfigurasi dalam objek itu sendiri dan BuildContext tempat widget dimekarkan, pertimbangkan untuk menggunakan StatelessWidget.
Instance StatefulWidget itu sendiri tidak dapat diubah dan menyimpan statusnya yang dapat berubah baik dalam objek State terpisah yang dibuat oleh metode createState, atau dalam objek yang berlangganan State tersebut, misalnya objek Stream atau ChangeNotifier, yang referensi disimpan di bidang akhir pada StatefulWidget diri.
StatelessWidget :
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).
Widget tanpa status berguna jika bagian dari antarmuka pengguna yang Anda gambarkan tidak bergantung pada apa pun selain informasi konfigurasi dalam objek itu sendiri dan BuildContext tempat widget tersebut digelembungkan. Untuk komposisi yang dapat berubah secara dinamis, misalnya karena memiliki status clock-driven internal, atau bergantung pada beberapa status sistem, pertimbangkan untuk menggunakan StatefulWidget.
sumber
Widget Stateless adalah widget statis. Anda hanya perlu melewatkan beberapa properti sebelum menginisialisasi Widget Stateless. Mereka tidak bergantung pada perubahan data apa pun atau perubahan perilaku apa pun. Sebagai contoh. Teks, Ikon, Tombol Raised adalah Widget Tanpa Status.
Widget Stateful adalah widget dinamis, mereka dapat diperbarui selama runtime berdasarkan tindakan pengguna atau perubahan data. Jika sebuah Widget dapat mengubah statusnya selama waktu berjalan maka widget tersebut akan menjadi widget yang stateful.
Sunting 15/11/2018
Widget tanpa status dapat dirender ulang jika input / data eksternal berubah (data eksternal menjadi data yang dilewatkan melalui konstruktor). Karena Stateless Widgets tidak memiliki status, maka akan ditampilkan sekali dan tidak akan diupdate sendiri, tetapi hanya akan diupdate saat data eksternal berubah.
Sedangkan Stateful Widgets memiliki status internal dan dapat dirender ulang jika input data berubah atau jika status Widget berubah.
Widget stateless dan stateful memiliki siklus proses yang berbeda.
sumber
Stateless
widget, kita dapat mengubahnya juga dalam waktu proses tetapi itu tidak disebutStateful
widget (berbeda dengan baris terakhir Anda).Saya bisa memikirkan analogi yang sangat sederhana. Anda memiliki beberapa perabot dengan buku, dekorasi, dan TV. Perabotannya tidak bernegara, tidak ada yang tidak bergerak. Di TV, di sisi lain, Anda dapat menyalakan, mematikan, mengganti saluran, memutar film jika ada DVD yang terpasang, dll. TV memiliki kondisi internal yang mempengaruhi perilakunya. Di furnitur Anda tidak memiliki negara bagian. Kehadiran TV di furnitur tidak menambah statusnya. Semoga ini membantu.
sumber
Jawaban untuk pertanyaan Stack Overflow - statefulness vs statelessness .
Di Flutter, perbedaannya adalah widget stateless dapat ditentukan oleh semua argumen konstruktor saja. Jika Anda membuat dua widget stateless menggunakan argumen yang sama, maka keduanya akan sama.
Namun, widget stateful belum tentu sama dengan widget lain yang dibuat dengan argumen konstruktor yang sama. Mungkin dalam keadaan yang berbeda.
Sebenarnya, widget stateful tidak dapat diubah (stateless) itu sendiri, tetapi Flutter mengelola objek status terpisah dan mengaitkannya dengan widget, seperti yang dijelaskan dalam dokumen StatefulWidget . Artinya, saat Flutter membuat ulang widget stateful, Flutter akan memeriksa apakah harus menggunakan kembali objek status sebelumnya dan akan, jika diinginkan, melampirkan objek status tersebut ke widget.
Widget induk tidak memiliki kewarganegaraan karena tidak peduli dengan status anaknya. Anak stateful itu sendiri (atau secara teknis Flutter) akan menjaga negaranya sendiri.
Pada tingkat tinggi, saya setuju bahwa ini membuat widget induk menjadi stateful, karena dua orang tua mungkin berisi dua anak dengan status berbeda dan dengan demikian secara teknis berbeda. Tapi dari sudut pandang Flutter, ia membangun widget induk tanpa mempedulikan statusnya dan hanya ketika membangun turunannya akan mempertimbangkan statefullness-nya.
sumber
Apa itu widget Stateful dan Stateless?
TL; DR: Sebuah widget yang memungkinkan Anda menyegarkan layar adalah widget Stateful. Sebuah widget yang bukan Stateless.
Lebih detailnya, widget dinamis dengan konten yang dapat berubah haruslah widget Stateful. Widget Stateless hanya dapat mengubah konten ketika parameter diubah dan karenanya perlu dilakukan di atas titik lokasinya dalam hierarki widget. Layar atau widget yang berisi konten statis harus menjadi widget tanpa kewarganegaraan, tetapi untuk mengubah konten, harus stateful.
Saya menemukan konten yang relatif ini pada medium story yang menarik. Sama-sama!
sumber
Stateless : Status widget HANYA membuat SEKALI, kemudian dapat memperbarui nilai tetapi tidak menyatakan secara eksplisit. Ini jelas dari struktur sana juga. Itulah mengapa hanya ada satu kelas yang diperpanjang
StatelessWidget
. Jadi jika saya katakan, mereka tidak akan pernah bisa menjalankanbuild()
metode lagi.Stateful : Widget dapat memperbarui STATE (lokal) & nilainya beberapa kali setelah peristiwa dipicu . Karena itu, implementasinya juga berbeda. Dalam hal ini, kita memiliki 2 kelas, satu adalah
StatefulWidget
& yang lainnya adalah pengendali implementasi Negara yaituState<YourWidget>
. Jadi jika saya katakan, mereka dapat menjalankanbuild()
kembali metode lagi & lagi berdasarkan peristiwa yang dipicu.Diagram di bawah ini akan membantu.
sumber
widget stateless dan statefull memiliki siklus hidupnya sendiri untuk membuat dan memperbarui UI. Namun Anda dapat menggunakan stateless atau statefull untuk merender UI tetapi secara praktis statefull lebih berguna ketika ui sepenuhnya atau sebagian bergantung dengan data eksternal (seperti - merender daftar menggunakan api) sedangkan menggunakan widget stateless untuk merender ui statis seperti layar input lainnya praktik yang baik.
sumber
Saat menulis aplikasi, biasanya Anda akan membuat widget baru yang merupakan subkelas dari StatelessWidget atau StatefulWidget
Berikut beberapa Perbedaan Antara
StatelessWidget
danStatefulWidget
Widget:Widget Tanpa Status:
Text
,Icon
,RaisedButton
adalah Stateless Widgets.Widget Stateful:
Checkbox
,Radio Button
,Slider
yang Stateful Widgetsumber
Dengan kata sederhana:
Seperti yang kita ketahui, setiap widget adalah tampilan dalam flutter. Yang memiliki kelas tersendiri. Ketika kita menggunakan kelas-kelas itu, kita membuat objeknya. Kami memberikan nilai pada variabel / properti yang berbeda. Ex. Kami membuat widget Teks sehingga kami dapat memberikannya String, Warna, Ukuran Font, keluarga Font. Jadi dengan memberikan ini, kami mendefinisikan propertinya sambil membuatnya. Hingga saat ini, widget Stateless atau Stateful tetap sama tetapi,
Ketika kita ingin mengubah / mengupdate propertinya (katakanlah String atau Color) lagi dan lagi setelahnya maka itu harus widget Stateful.
Dan ketika kami tidak ingin mengubah propertinya setelah menentukan pertama kali, itu adalah widget tanpa negara.
itu berarti kami peduli dengan data yang disimpan / dikontrol / ditampilkan oleh widget.
Jadi Stateless adalah data yang lebih sedikit dan Stateful adalah data yang penuh.
Sekarang jika Anda mendefinisikan kelas yang stateless itu berarti kelas ini tidak peduli / memiliki variabel di dalamnya atau mengatakan data di kelasnya sendiri yaitu tingkat kelas tetapi dapat memiliki widget / kelas lain di dalamnya yang peduli tentang data yaitu Stateful . Sehingga tidak berdampak apapun satu sama lain.
Harap perbaiki saya jika saya salah di sini.
sumber
Apa itu widget Stateful dan Stateless?
Widget Tanpa Status: Widget tanpa status dibuat hanya jika berasal dari perubahan induk.
Stateful Widgets: Status widget penuh menahan status widget dan dapat dibangun kembali ketika status berubah.
sumber