Saya bertanya-tanya apa cara yang disarankan untuk meneruskan data ke widget stateful, saat membuatnya, adalah.
Dua gaya yang pernah saya lihat adalah:
class ServerInfo extends StatefulWidget {
Server _server;
ServerInfo(Server server) {
this._server = server;
}
@override
State<StatefulWidget> createState() => new _ServerInfoState(_server);
}
class _ServerInfoState extends State<ServerInfo> {
Server _server;
_ServerInfoState(Server server) {
this._server = server;
}
}
Metode ini menyimpan nilai dalam ServerInfo
dan _ServerInfoState
, yang tampaknya sedikit boros.
Metode lainnya adalah dengan menggunakan widget._server
:
class ServerInfo extends StatefulWidget {
Server _server;
ServerInfo(Server server) {
this._server = server;
}
@override
State<StatefulWidget> createState() => new _ServerInfoState();
}
class _ServerInfoState extends State<ServerInfo> {
@override
Widget build(BuildContext context) {
widget._server = "10"; // Do something we the server value
return null;
}
}
Ini tampaknya agak mundur karena status tidak lagi disimpan di _ServerInfoSate
melainkan di widget.
Apakah ada praktik terbaik untuk ini?
ServerInfo(this._server);
Jawaban:
Jangan berikan parameter untuk
State
menggunakan konstruktornya. Anda hanya boleh mengakses ini menggunakanthis.widget.myField
.Tidak hanya mengedit konstruktor membutuhkan banyak pekerjaan manual; itu tidak membawa apapun. Tidak ada alasan untuk menduplikasi semua bidang
Widget
.EDIT:
Berikut contohnya:
sumber
State
sudah sebagai akses ke semua propertiStateful
dengan menggunakanwidget
bidang.void initState()
status untuk menyetel nilai awal. Periksa opsi utas C ini sebagai contoh.Cara terbaik adalah tidak mengirimkan parameter ke kelas State menggunakan konstruktornya. Anda dapat dengan mudah mengakses di kelas Negara menggunakan
widget.myField
.Sebagai contoh
Kirimkan data Anda saat Anda Menavigasi layar:
sumber
Jawaban lain, berdasarkan jawaban @ RémiRousselet dan untuk pertanyaan @ user6638204, jika Anda ingin meneruskan nilai awal dan masih dapat memperbaruinya di status nanti:
sumber
MyStateful
memiliki satu parameter bernama opsional (properti) Anda dapat membuat widget ini dengan meneleponMyStateful(foo: "my string",)
initState
tidak menyelesaikan masalah dalam skenario berikut: misalnya, Anda membuat widget Statefull Anda dengan parameter kosong dan Anda menunggu data Anda dimuat. Ketika data dimuat, Anda ingin memperbarui widget Statefull Anda dengan data baru dan dalam hal ini ketika Anda memanggil MyStatefull (newData), widget ituinitState()
tidak akan dipanggil! Dalam hal inididUpdateWidget(MyStatefull oldWidget)
akan dipanggil dan Anda perlu membandingkan data Anda dari argumenoldWidget.getData()
denganwidget.data
dan jika tidak sama - panggilsetState()
untuk membangun kembali widget.Untuk meneruskan nilai awal (tanpa meneruskan apa pun ke konstruktor)
sumber