如何解决Flutter 小部件及其状态:鸡与蛋的问题
正如您在下面的代码中看到的,createState()
在 MyWidget
的构造函数完成后运行,因此 keyword
可用。
但是,尽管 MyWidgetState
的构造函数在 MyWidget
的构造函数之后运行 ,但取消注释前者中的 print()
失败。 widget
似乎还没有准备好。
如果先有鸡还是先有蛋的问题解决了:先创建widget,为什么状态不能在自己的构造函数中访问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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。