Przekazywanie danych do StatefulWidget i uzyskiwanie do nich dostępu w jego stanie we Flutterze

125

Mam 2 ekrany w mojej aplikacji Flutter: lista nagrań i ekran do tworzenia i edycji rekordów.

Jeśli przekażę obiekt na drugi ekran, oznacza to, że zamierzam go edytować, a jeśli przekażę wartość null, oznacza to, że tworzę nowy element. Ekran edycji to widget Stateful i nie jestem pewien, jak zastosować to podejście https://flutter.io/cookbook/navigation/passing-data/ w moim przypadku.

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

Jak mogę uzyskać dostęp do recordObject w _RecordPageState ?

moonvader
źródło
1
Możliwy duplikat przekazywania danych do Stateful Widget
Herohtar
jak możemy użyć wartości zmiennej „recordObject” w funkcji klasy _RecordPageState?
Kamlesh
Czy to odpowiada na twoje pytanie? Przekaż dane StatefulWidget do klasy State bez użycia konstruktora
Blasanka

Odpowiedzi:

209

Aby użyć recordObject w _RecordPageState, musisz po prostu napisać widget.objectname jak poniżej

class _RecordPageState extends State<RecordPage> {
  @override
  Widget build(BuildContext context) {
   .....
   widget.recordObject
   .....
  }
}
dhuma1981
źródło
9
Ci, którzy są nowicjuszami w Flutter, nie zapomnij zdefiniować widżetu typu „@override RecordPage get widget => super.widget;”
hhk
22
@hhk Dlaczego jest to konieczne?
Herohtar
2
Czy to nie recordObjectpowinno być częścią Statezajęć? Logicznie rzecz biorąc, posiadanie go StatefulWidgetjest nieprawidłowe (pod względem spójności). Poza tym wszystkie pola StatefulWidgetpowinny być niezmienne - a co jeśli chcesz zmienić recordObjectodniesienie?
Alex Semeniuk
Mam dokładnie to samo i nie działa robiąc coś w stylu Text(widget.recordObject), mówi, że mój var jest zerowy
Dani
jak możemy użyć wartości zmiennej „recordObject” w funkcji klasy _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
źródło
1
Proszę wyjaśnić, dlaczego jest to widżet pełnostanowy.
localhoost
@atilkan, ponieważ początkowy skrypt OP to StatefulWidget, po prostu dodał kilka wierszy, aby dopasować je do potrzeb.
adadion
3
Nie sądzę, aby posiadanie recordObjectpola zarówno na zajęciach, jak Statei na StatefulWidgetzajęciach było takim dobrym pomysłem (chociaż widziałem tutoriale robiące dokładnie to). Podejście do uzyskiwania dostępu do pól StatefulWidgetza pomocą widgetpola Stateklasy wydaje się bardziej poprawnym podejściem (chociaż ma swoje własne problemy)
Alex Semeniuk
22

Pełny przykład

Nie musisz przekazywać parametrów do State za pomocą jego konstruktora. Możesz łatwo uzyskać do nich dostęp za pomocą 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
  }
}

Przekaż swoje dane podczas nawigacji na ekranie:

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyRecord("WonderWorld")));
Sanjayrajsinh
źródło