将数据传递给StatefulWidget并在Flutter中以其状态进行访问


122

Flutter应用程序中有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) {
   //.....
  }
}

如何访问recordObject里面_RecordPageState



我们如何在_RecordPageState类的函数中使用'recordObject'变量值?
Kamlesh

Answers:


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

22
@hhk为什么有必要?
Herohtar

2
recordObject应该成为State课程的一部分吗?从逻辑上讲,将其放入StatefulWidget是不正确的(就内聚而言)。此外,的所有字段都StatefulWidget应该是不可变的-如果您想更改recordObject引用该怎么办?
Alex Semeniuk

我完全一样,并且无法正常工作Text(widget.recordObject),它说我的var为空
Dani

我们如何在_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,所以他只是添加了一些行来满足需要。
adadion '19

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")));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.