Meneruskan data ke StatefulWidget dan mengaksesnya dalam statusnya di Flutter

124

Saya memiliki 2 layar di aplikasi Flutter saya: daftar catatan dan layar untuk membuat dan mengedit catatan.

Jika saya mengirimkan objek ke layar kedua itu berarti saya akan mengedit ini dan jika saya memberikan null itu berarti saya membuat item baru. Layar pengeditan adalah widget Stateful dan saya tidak yakin bagaimana menggunakan pendekatan ini https://flutter.io/cookbook/navigation/passing-data/ untuk kasus saya.

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

Bagaimana saya dapat mengakses recordObject di dalam _RecordPageState ?

moonvader.dll
sumber
1
Kemungkinan duplikat dari Meneruskan Data ke Stateful Widget
Herohtar
bagaimana kita bisa menggunakan nilai variabel 'recordObject' dalam fungsi kelas _RecordPageState?
Kamlesh

Jawaban:

208

Untuk menggunakan recordObject di _RecordPageState, Anda harus menulis widget.objectname seperti di bawah ini

class _RecordPageState extends State<RecordPage> {
  @override
  Widget build(BuildContext context) {
   .....
   widget.recordObject
   .....
  }
}
dhuma1981
sumber
9
Mereka yang baru mengenal Flutter, jangan lupa untuk mendefinisikan widget seperti '@override RecordPage get widget => super.widget;'
hhk
22
@hhk Mengapa itu perlu?
Herohtar
2
Bukankah seharusnya recordObjectmenjadi bagian dari Statekelas? Secara logis, StatefulWidgetmemasukkannya tidak benar (dalam istilah kohesi). Selain itu, semua bidang StatefulWidgetharus tidak dapat diubah - bagaimana jika Anda ingin mengubah recordObjectreferensi?
Alex Semeniuk
Saya memiliki yang persis sama dan tidak berfungsi melakukan sesuatu seperti Text(widget.recordObject), dikatakan bahwa var saya adalah null
Dani
bagaimana kita bisa menggunakan nilai variabel 'recordObject' dalam fungsi kelas _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
sumber
1
Mohon jelaskan mengapa ini adalah widget statefull.
localhoost
@atilkan karena skrip awal OP adalah StatefulWidget, dia hanya menambahkan beberapa baris agar sesuai dengan kebutuhan.
adadion
3
Saya tidak berpikir bahwa memiliki recordObjectlapangan baik dalam Statedan StatefulWidgetkelas adalah seperti ide yang baik (meskipun aku melihat tutorial melakukan persis ini). Pendekatan mengakses field StatefulWidgetdengan menggunakan widgetfield of Stateclass sepertinya pendekatan yang lebih tepat (meskipun memiliki masalah sendiri)
Alex Semeniuk
21

Contoh Lengkap

Anda tidak perlu meneruskan parameter ke Status menggunakan konstruktornya. Anda dapat dengan mudah mengaksesnya menggunakan 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
  }
}

Kirimkan data Anda saat Anda Menavigasi layar:

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