Itu penting untuk mixins (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 deactivatememiliki mustCallSuperanotasi .
Selain itu , beberapa orang mixinberharap 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 mixins Statedalam kerangka berharap bahwa ini adalah masalahnya.
Misalnya: TickerProviderStateMixindanSingleTickerProviderStateMixin nyatakan super.dispose di akhir:
Semua Ticker harus [..] dibuang sebelum memanggil super.dispose ().
Contoh lain: AutomaticKeepAliveMixinjalankan logika diinitState dan dispose.
Kesimpulan
Mulailah initStatedengansuper.initState dan akhiri disposedengansuper.dispose jika Anda ingin menambahkan sisi yang mudah dan aman mixinke 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.initStatedan super.disposedilakukan dalam Statekelas 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.initStatedan super.disposelakukan di State, yang merupakan semua kode yang akan dieksekusi ketika Anda tidak memiliki mixin tambahan.
initState
Mari kita lihat kode apa yang dieksekusi super.initStateterlebih 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 AssertionErrorjika widget Anda tidak berfungsi sebagaimana dimaksud. Tidak masalah jika Anda mengambil tindakan sebelumnya karena asserthanya dimaksudkan untuk melaporkan bahwa ada sesuatu dalam kode Anda yang salah dan Anda akan melihat bahwa bahkan jika Anda menelepon super.initStatedi akhir metode Anda.
dispose
The disposeMetode 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 assertsini adalah trik yang bagus karena memastikan bahwa _debugLifecycleStatehanya 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.