Itu penting untuk mixin
s (dan karena itu untuk Anda juga)
Ini adalah paradigma dalam kerangka Flutter untuk memanggil metode super ketika mengesampingkan metode siklus hidup dalam a State
. Inilah sebabnya mengapa bahkan deactivate
memiliki mustCallSuper
anotasi .
Selain itu , beberapa orang mixin
berharap Anda memanggil metode super dari metode siklus hidup tersebut pada titik tertentu dalam fungsi.
Ini berarti bahwa Anda harus mengikuti dokumentasi dan menelepon super.dispose
di akhirdispose
metode Anda karena mixin
s State
dalam kerangka berharap bahwa ini adalah masalahnya.
Misalnya: TickerProviderStateMixin
danSingleTickerProviderStateMixin
nyatakan super.dispose
di akhir:
Semua Ticker harus [..] dibuang sebelum memanggil super.dispose ().
Contoh lain: AutomaticKeepAliveMixin
jalankan logika diinitState
dan dispose
.
Kesimpulan
Mulailah initState
dengansuper.initState
dan akhiri dispose
dengansuper.dispose
jika Anda ingin menambahkan sisi yang mudah dan aman mixin
ke State
.
Selanjutnya, ikuti dokumentasi untuk metode siklus hidup lainnya (metode apa pun yang Anda timpa State
) karena kerangka kerja akan mengharapkan Anda memanggil metode super seperti yang dijelaskan dalam dokumentasi.
Jadi, berikut ini yang harus Anda lakukan:
void initState() {
super.initState();
//DO OTHER STUFF
}
Namun, itu tidak terlalu penting State
, yang akan saya jelaskan berikut ini dan bahkan untuk mixin, itu hanya masalah untuk pernyataan dari apa yang saya temukan - jadi itu tidak akan mempengaruhi aplikasi produksi Anda.
Itu tidak masalah untuk State
Saya pikir dua jawaban sebelumnya dari Pablo Barrera dan CopsOnRoad adalah menyesatkan karena kebenaran dari masalah ini adalah bahwa itu benar-benar tidak peduli dan Anda tidak perlu melihat jauh.
Satu-satunya tindakan yang super.initState
dan super.dispose
dilakukan dalam State
kelas itu sendiri adalah pernyataan dan karena - pernyataanassert
hanya dievaluasi dalam mode debug , tidak masalah sama sekali setelah membangun aplikasi Anda, yaitu dalam mode produksi.
Berikut ini, saya akan memandu Anda melalui apa super.initState
dan super.dispose
lakukan di State
, yang merupakan semua kode yang akan dieksekusi ketika Anda tidak memiliki mixin tambahan.
initState
Mari kita lihat kode apa yang dieksekusi super.initState
terlebih dahulu ( sumber ):
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
Seperti yang Anda lihat, hanya ada pernyataan siklus hidup dan tujuannya adalah untuk memastikan widget Anda berfungsi dengan benar. Jadi selama Anda menelepon di super.initState
suatu tempat di Anda sendiri initState
, Anda akan melihat AssertionError
jika widget Anda tidak berfungsi sebagaimana dimaksud. Tidak masalah jika Anda mengambil tindakan sebelumnya karena assert
hanya dimaksudkan untuk melaporkan bahwa ada sesuatu dalam kode Anda yang salah dan Anda akan melihat bahwa bahkan jika Anda menelepon super.initState
di akhir metode Anda.
dispose
The dispose
Metode ini analog ( sumber ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
Seperti yang Anda lihat, itu juga hanya berisi pernyataan yang menangani pemeriksaan siklus hidup debug . Yang kedua di assert
sini adalah trik yang bagus karena memastikan bahwa _debugLifecycleState
hanya diubah dalam mode debug (karena assert
-Statement hanya dieksekusi dalam mode debug).
Ini berarti bahwa selama Anda memanggil super.dispose
suatu tempat dalam metode Anda sendiri, Anda tidak akan kehilangan nilai apa pun tanpa mixin menambahkan fungsionalitas tambahan.
initState()
metode iniassert(...)
, jadi apa manfaatnya bahkan memanggilsuper.initState()
aplikasi produksi?mustCallSuper
metode itu selama lebih dari 2 tahun sekarang sejak Flutter muncul. Apa manfaatnya meletakkannya di sana, Tuan?mixin
, masih ada akan menjadi pernyataan tunggal dalam hal iniinitState
yangassert(...)
, jadi apa pentingnya bahkan memanggilsuper.initState()
untuk aplikasi produksi?super.initState()
harus selalu menjadi baris pertama dalaminitState
metode Anda .Dari dokumen:
sumber
Seperti yang bisa Anda lihat di kelas dari framework, Anda harus melakukan segalanya setelah widget diinisialisasi, artinya setelah
super.initState()
.Saya kasus membuang akan secara logis dengan cara lain, pertama lakukan semuanya dan kemudian telepon
super.dispose()
.sumber
initState dipanggil secara default setiap kali widget stateful baru ditambahkan ke pohon widget. Sekarang super.initState melakukan implementasi standar kelas dasar widget Anda. Jika Anda memanggil sesuatu sebelum super.initState yang tergantung pada kelas dasar maka ini dapat menyebabkan masalah. Karena itu disarankan agar Anda memanggil initState dengan cara ini:
sumber
dispose
itu adalah sebaliknya. Kerangka kerja mengharapkan Anda untuk meneleponsuper.dispose
di akhir , tetapi rekomendasi itu benar.