Passando dados para StatefulWidget e acessando-os em seu estado no Flutter

124

Tenho 2 telas no meu app Flutter: lista de registros e tela para criação e edição de registros.

Se eu passar o objeto para a segunda tela significa que vou editar isso e se eu passar null significa que estou criando um novo item. A tela de edição é um widget com estado e não tenho certeza de como usar essa abordagem https://flutter.io/cookbook/navigation/passing-data/ no meu caso.

class RecordPage extends StatefulWidget {
  final Record recordObject;

  RecordPage({Key key, @required this.recordObject}) : super(key: key);

  @override
  _RecordPageState createState() => new _RecordPageState();
}

class _RecordPageState extends State<RecordPage> {
  @override
  Widget build(BuildContext context) {
   //.....
  }
}

Como posso acessar recordObject dentro de _RecordPageState ?

moonvader
fonte
1
Possível duplicata de passagem de dados para um widget com estado
Herohtar
como podemos usar o valor da variável 'recordObject' em uma função da classe _RecordPageState?
Kamlesh

Respostas:

208

Para usar recordObject em _RecordPageState, você tem que escrever widget.nome do objeto como abaixo

class _RecordPageState extends State<RecordPage> {
  @override
  Widget build(BuildContext context) {
   .....
   widget.recordObject
   .....
  }
}
dhuma1981
fonte
9
Aqueles que são novos no Flutter, não se esqueça de definir widgets como '@override RecordPage get widget => super.widget;'
hhk
22
@hhk Por que isso é necessário?
Herohtar
2
Não deveria recordObjectfazer parte da Stateaula? Logicamente, inseri-lo StatefulWidgeté incorreto (em termos de coesão). Além disso, todos os campos de StatefulWidgetdevem ser imutáveis ​​- e se você quiser alterar a recordObjectreferência?
Alex Semeniuk
Eu tenho exatamente o mesmo e não está funcionando fazendo algo como Text(widget.recordObject), diz que meu var é nulo
Dani
como podemos usar o valor da variável 'recordObject' em uma função da classe _RecordPageState?
Kamlesh
32
class RecordPage extends StatefulWidget {
  final Record recordObject;

  RecordPage({Key key, @required this.recordObject}) : super(key: key);

  @override
  _RecordPageState createState() => new _RecordPageState(recordObject);
}

class _RecordPageState extends State<RecordPage> {
  Record  recordObject
 _RecordPageState(this. recordObject);  //constructor
  @override
  Widget build(BuildContext context) {.    //closure has access
   //.....
  }
}
John Mcfetridge
fonte
1
Explique por que este é um widget statefull.
localhoost de
@atilkan porque o script inicial do OP é um StatefulWidget, ele apenas adicionou algumas linhas para atender às necessidades.
adição de
3
Não acho que ter recordObjectcampo nas classes Statee nas StatefulWidgetclasses seja uma ideia tão boa (embora eu tenha visto tutoriais fazendo exatamente isso). A abordagem de acessar campos de StatefulWidgetusando widgetcampo de Stateclasse parece uma abordagem mais correta (embora tenha seus próprios problemas)
Alex Semeniuk
21

Exemplo Completo

Você não precisa passar parâmetros para State usando seu construtor. Você pode acessá-los facilmente usando widget.myField .

class MyRecord extends StatefulWidget {
  final String recordName;
  const MyRecord(this.recordName);

  @override
  MyRecordState createState() => MyRecordState();
}

class MyRecordState extends State<MyRecord> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.recordName); // Here you direct access using widget
  }
}

Passe seus dados ao navegar na tela:

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyRecord("WonderWorld")));
Sanjayrajsinh
fonte