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 ?



jak możemy użyć wartości zmiennej „recordObject” w funkcji klasy _RecordPageState?
Kamlesh

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

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

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")));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.