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 ?



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
   .....
  }
}

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
   //.....
  }
}

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")));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.