StatefulWidgetにデータを渡し、Flutterの状態でそのデータにアクセスする


122

Flutterアプリに2つの画面があります。レコードのリストと、レコードを作成および編集するための画面です。

オブジェクトを2番目の画面に渡すと、これが編集されることを意味し、nullを渡すと、新しいアイテムを作成することになります。編集画面はステートフルウィジェットであり、私の場合、このアプローチhttps://flutter.io/cookbook/navigation/passing-data/の使用方法がわかりません。

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内のrecordObjectにアクセスするにはどうすればよいですか?



_RecordPageStateクラスの関数で「recordObject」変数値を使用するにはどうすればよいですか?
Kamlesh

回答:


207

_RecordPageStateでrecordObjectを使用するには、以下のようにwidget.objectnameを記述するだけです。

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

9
Flutterを初めて使用する場合は、「@ override RecordPage get widget => super.widget;」のようなウィジェットを定義することを忘れないでください。
hhk 2018年

22
@hhkなぜそれが必要なのですか?
ヘロタール

2
クラスのrecordObject一部であるべきではありStateませんか?論理的には、それをStatefulWidget(凝集度の点で)正しくありません。さらに、のすべてのフィールドはStatefulWidget不変である必要があります- recordObject参照を変更したい場合はどうなりますか?
Alex Semeniuk

私はまったく同じですがText(widget.recordObject)、のように動作していません、それは私の変数がnullであると言います
ダニ

_RecordPageStateクラスの関数で「recordObject」変数値を使用するにはどうすればよいですか?
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
これがステートフルウィジェットである理由を説明してください。
localhoost

@atilkan OPの初期スクリプトはStatefulWidgetであるため、彼はニーズに合わせていくつかの行を追加しました。
アダディオン

3
私はrecordObjectフィールドStateStatefulWidgetクラスの両方を持つことは良いアイデアだとは思いません(私がこれを正確に行うチュートリアルを見たとしても)。クラスのフィールドをStatefulWidget使用してwidgetフィールドにアクセスするアプローチはState、より正確なアプローチのように見えます(独自の問題があります)
Alex Semeniuk

20

完全な例

コンストラクターを使用してStateにパラメーターを渡す必要はありません。これらには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
  }
}

画面をナビゲートするときにデータを渡します。

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyRecord("WonderWorld")));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.