Estou me perguntando qual é a maneira recomendada de passar dados para um widget com estado, ao criá-lo.
Os dois estilos que vi são:
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;
}
}
Este método mantém um valor em ServerInfo
e _ServerInfoState
, o que parece um desperdício.
O outro método é usar 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;
}
}
Isso parece um pouco para trás, pois o estado não é mais armazenado, _ServerInfoSate
mas sim no widget.
Existe uma prática recomendada para isso?
ServerInfo(this._server);
Respostas:
Não passe parâmetros para
State
usar seu construtor. Você só deve acessá-los usandothis.widget.myField
.Não apenas editar o construtor requer muito trabalho manual; não traz nada. Não há razão para duplicar todos os campos de
Widget
.EDITAR:
Aqui está um exemplo:
fonte
State
já tem acesso a todas as propriedades deStateful
usando owidget
campo.void initState()
no estado para definir o valor inicial. Verifique esta opção de thread C como exemplo.A melhor maneira é não passar parâmetros para a classe State usando seu construtor. Você pode acessar facilmente na classe State usando
widget.myField
.Por exemplo
Passe seus dados ao navegar na tela:
fonte
Outra resposta, com base na resposta de @RémiRousselet e para a pergunta de @ user6638204, se você deseja passar os valores iniciais e ainda ser capaz de atualizá-los no estado mais tarde:
fonte
MyStateful
tem um parâmetro nomeado opcional (propriedade) que você pode criar este widget chamandoMyStateful(foo: "my string",)
initState
não resolve um problema no seguinte cenário: por exemplo, você criou seu widget Statefull com parâmetros vazios e está esperando que seus dados sejam carregados. Quando os dados são carregados, você deseja atualizar seu widget Statefull com os dados novos e, neste caso, quando você chama MyStatefull (newData), eleinitState()
não será chamado! Neste casodidUpdateWidget(MyStatefull oldWidget)
, será chamado e você precisaria comparar seus dados do argumentooldWidget.getData()
comwidget.data
e se não forem iguais - chamarsetState()
para reconstruir o widget.Para passar valores iniciais (sem passar nada para o construtor)
fonte