Chuyển dữ liệu đến StatefulWidget và truy cập nó ở trạng thái của nó trong Flutter


122

Tôi có 2 màn hình trong ứng dụng Flutter của mình: danh sách các bản ghi và màn hình để tạo và chỉnh sửa bản ghi.

Nếu tôi chuyển đối tượng sang màn hình thứ hai, điều đó có nghĩa là tôi sẽ chỉnh sửa điều này và nếu tôi chuyển giá trị null nghĩa là tôi đang tạo mục mới. Màn hình chỉnh sửa là tiện ích con Stateful và tôi không chắc cách sử dụng phương pháp này https://flutter.io/cookbook/navigation/passing-data/ cho trường hợp của mình.

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

Làm cách nào để truy cập recordObject bên trong _RecordPageState ?



làm thế nào chúng ta có thể sử dụng giá trị biến 'recordObject' trong một hàm của lớp _RecordPageState?
Kamlesh

Điều này có trả lời câu hỏi của bạn không? Chuyển dữ liệu StatefulWidget vào lớp State mà không sử dụng hàm tạo
Blasanka

Câu trả lời:


207

Để sử dụng recordObject trong _RecordPageState, bạn chỉ cần viết widget.objectname như bên dưới

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

9
Những ai mới sử dụng Flutter, đừng quên xác định widget như '@override RecordPage get widget => super.widget;'
hhk

22
@hhk Tại sao điều đó lại cần thiết?
Herohtar

2
Không recordObjectphải là một phần của Statelớp học? Về mặt logic, việc đưa nó vào StatefulWidgetlà không chính xác (về tính liên kết). Ngoài ra, tất cả các trường của StatefulWidgetphải là bất biến - nếu bạn muốn thay đổi recordObjecttham chiếu thì sao?
Alex Semeniuk,

Tôi có giống hệt nhau và nó không hoạt động khi làm điều gì đó giống như Text(widget.recordObject), nó nói rằng var của tôi là null
Dani

làm thế nào chúng ta có thể sử dụng giá trị biến 'recordObject' trong một hàm của lớp _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
Vui lòng giải thích tại sao đây là một widget trạng thái.
localhoost

@atilkan vì tập lệnh ban đầu của OP là StatefulWidget nên anh ấy chỉ thêm một số dòng để phù hợp với nhu cầu.
adadion

3
Tôi không nghĩ rằng có recordObjecttrường cả trong StateStatefulWidgetlớp là một ý tưởng hay (mặc dù tôi đã thấy các hướng dẫn làm chính xác điều này). Phương pháp tiếp cận lĩnh vực StatefulWidgetbằng cách sử dụng widgetlĩnh vực Statelớp học có vẻ như một cách tiếp cận chính xác hơn (mặc dù nó có vấn đề riêng của mình)
Alex Semeniuk

20

Đầy đủ ví dụ

Bạn không cần phải chuyển các tham số cho State bằng cách sử dụng hàm tạo của nó. Bạn có thể dễ dàng truy cập chúng bằng 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
  }
}

Chuyển dữ liệu của bạn khi bạn Điều hướng màn hình:

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyRecord("WonderWorld")));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.