Verileri StatefulWidget'e iletme ve Flutter'daki durumundayken ona erişme


125

Flutter uygulamamda 2 ekranım var: kayıt listesi ve kayıt oluşturma ve düzenleme ekranı.

Nesneyi ikinci ekrana geçirirsem, bu, bunu düzenleyeceğim anlamına gelir ve null geçirirsem, yeni öğe oluşturduğum anlamına gelir. Düzenleme ekranı Stateful widget'tır ve bu yaklaşımı https://flutter.io/cookbook/navigation/passing-data/ durumum için nasıl kullanacağımdan emin değilim .

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

_RecordPageState içindeki recordObject'e nasıl erişebilirim ?



_RecordPageState sınıfının bir fonksiyonunda 'recordObject' değişken değerini nasıl kullanabiliriz?
Kamlesh

Yanıtlar:


209

_RecordPageState içinde recordObject kullanmak için, aşağıdaki gibi widget.objectname yazmanız yeterlidir.

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

9
Flutter'da yeni olanlar, '@override RecordPage get widget => super.widget;' gibi widget tanımlamayı unutmayın.
hhk

22
@hhk Bu neden gerekli?
Herohtar

2
Sınıfın bir recordObjectparçası olması gerekmiyor Statemu? Mantıksal olarak, içinde StatefulWidgetolması yanlıştır (uyum açısından). Ayrıca, tüm alanları StatefulWidgetdeğişmez olmalıdır - recordObjectreferansı değiştirmek isterseniz ne olur ?
Alex Semeniuk

Bende tam olarak aynısına sahibim ve çalışmıyor Text(widget.recordObject), benim varlığımın boş olduğunu söylüyor
Dani

_RecordPageState sınıfının bir fonksiyonunda 'recordObject' değişken değerini nasıl kullanabiliriz?
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
Lütfen bunun neden durumlu bir pencere öğesi olduğunu açıklayın.
localhoost

@atilkan OP ilk betiği bir StatefulWidget olduğundan, ihtiyaçlara uyacak bazı satırlar ekledi.
adadion

3
Ben sahip olduğunu sanmıyorum recordObjecthem alan Stateve StatefulWidget(tam olarak bunu öğreticiler gördüm olsa bile) sınıfları kadar iyi bir fikir olduğunu. Alanlarını ulaşma yaklaşımı StatefulWidgetkullanarak widgetalanını Statesınıfında daha doğru bir yaklaşım (kendi sorunları var olsa bile) gibi görünebilir
Alex Semeniuk

22

Tam Örnek

Yapıcısını kullanarak parametreleri State'e aktarmanıza gerek yoktur. Bunlara widget.myField'ı kullanarak kolayca erişebilirsiniz .

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

Gezinme ekranında verilerinizi iletin:

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyRecord("WonderWorld")));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.