Passare i dati a StatefulWidget e accedervi nel suo stato in Flutter


124

Ho 2 schermate nella mia app Flutter: elenco di record e schermata per la creazione e la modifica di record.

Se passo un oggetto alla seconda schermata significa che lo modificherò e se passo null significa che sto creando un nuovo elemento. La schermata di modifica è un widget Stateful e non sono sicuro di come utilizzare questo approccio https://flutter.io/cookbook/navigation/passing-data/ per il mio 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) {
   //.....
  }
}

Come posso accedere a recordObject all'interno di _RecordPageState ?



come possiamo usare il valore della variabile 'recordObject' in una funzione della classe _RecordPageState?
Kamlesh

Risposte:


208

Per usare recordObject in _RecordPageState, devi solo scrivere widget.objectname come sotto

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

9
Coloro che sono nuovi a Flutter, non dimenticare di definire widget come "@override RecordPage get widget => super.widget;"
hhk

22
@hhk Perché è necessario?
Herohtar

2
Non dovrebbe recordObjectfar parte della Stateclasse? Logicamente, averlo dentro StatefulWidgetnon è corretto (in termini di coesione). Inoltre, tutti i campi di StatefulWidgetdovrebbero essere immutabili: cosa succede se si desidera modificare il recordObjectriferimento?
Alex Semeniuk

Ho esattamente lo stesso e non funziona facendo qualcosa del genere Text(widget.recordObject), dice che il mio var è nullo
Dani

come possiamo usare il valore della variabile 'recordObject' in una funzione della 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
Spiega perché questo è un widget statefull.
localhoost

@atilkan perché lo script iniziale di OP è uno StatefulWidget, ha appena aggiunto alcune righe per soddisfare le esigenze.
adadion

3
Non credo che avere recordObjectcampo sia in Statee StatefulWidgetclassi è tale una buona idea (anche se ho visto tutorial facendo esattamente questo). L'approccio di accedere ai campi StatefulWidgetutilizzando il widgetcampo di Stateclasse sembra un approccio più corretto (anche se ha i suoi problemi)
Alex Semeniuk

21

Esempio completo

Non è necessario passare parametri a State usando il suo costruttore. Puoi accedervi facilmente utilizzando 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
  }
}

Passa i tuoi dati quando navighi nella schermata:

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyRecord("WonderWorld")));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.