Flutter 小部件及其状态:先有鸡还是先有蛋的问题
A Flutter widget and its state: a chicken-and-egg problem
正如您在下面的代码中看到的,createState()
在 MyWidget
的构造函数完成后运行,因此 keyword
可用。
但是尽管 MyWidgetState
的构造函数在 MyWidget
的构造函数 之后运行 ,取消注释前者中的 print()
失败。 widget
好像还没准备好。
如果先有鸡还是先有蛋的问题解决了:先创建widget,为什么state不能在自己的构造函数中访问widget变量呢? widget
在 build()
里面访问就好了。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: MyWidget(keyword: 'keyword'),
),
);
}
}
class MyWidget extends StatefulWidget {
final String keyword;
MyWidget({Key key, this.keyword}) : super(key: key) {
print('In _MyWidget(): ${keyword}');
}
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
_MyWidgetState() {
// print('In _MyWidgetState(): ${widget.keyword}');
}
@override
Widget build(BuildContext) {
return Text(widget.keyword);
}
}
这可能会也可能不会回答您的问题,但您需要使用 initState
而不是尝试对 _MyWidgetState
的构造函数做任何事情。这是小部件的有状态部分中发生的第一件事,它发生在构建方法之前。
class MyWidget extends StatefulWidget {
final String keyword;
MyWidget({Key key, this.keyword}) : super(key: key) {
print('In _MyWidget(): ${keyword}');
}
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
@override
void initState() {
super.initState();
print('In _MyWidgetState(): ${widget.keyword}'); // this will print
}
@override
Widget build(BuildContext context) {
return Text(widget.keyword);
}
}
正如您在下面的代码中看到的,createState()
在 MyWidget
的构造函数完成后运行,因此 keyword
可用。
但是尽管 MyWidgetState
的构造函数在 MyWidget
的构造函数 之后运行 ,取消注释前者中的 print()
失败。 widget
好像还没准备好。
如果先有鸡还是先有蛋的问题解决了:先创建widget,为什么state不能在自己的构造函数中访问widget变量呢? widget
在 build()
里面访问就好了。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: MyWidget(keyword: 'keyword'),
),
);
}
}
class MyWidget extends StatefulWidget {
final String keyword;
MyWidget({Key key, this.keyword}) : super(key: key) {
print('In _MyWidget(): ${keyword}');
}
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
_MyWidgetState() {
// print('In _MyWidgetState(): ${widget.keyword}');
}
@override
Widget build(BuildContext) {
return Text(widget.keyword);
}
}
这可能会也可能不会回答您的问题,但您需要使用 initState
而不是尝试对 _MyWidgetState
的构造函数做任何事情。这是小部件的有状态部分中发生的第一件事,它发生在构建方法之前。
class MyWidget extends StatefulWidget {
final String keyword;
MyWidget({Key key, this.keyword}) : super(key: key) {
print('In _MyWidget(): ${keyword}');
}
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
@override
void initState() {
super.initState();
print('In _MyWidgetState(): ${widget.keyword}'); // this will print
}
@override
Widget build(BuildContext context) {
return Text(widget.keyword);
}
}