我知道,从父StatefulWidget更新子StatefulWidget的正确方法是使用子GlobalKey实例。
但是我不明白,为什么setState(() {})不这么做!我没有找到任何关于这方面的文件或解释。
来自文档
调用setState会通知框架,该对象的内部状态发生了变化,可能会影响该子树中的用户界面,从而导致该框架为该状态对象安排构建。 如果您只是直接更改状态而不调用setState,框架可能不会安排构建,并且该子树的用户界面可能不会被更新以反映新的状态。
通过文档化,我预计整个小部件子树将被更新。但事实并非如此。
请解释我,为什么下面的例子不能像预期的那样工作(更改ChildStatefulWidget文本)。谢谢!
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class ParentStatefulWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return ParentState();
}
}
class ParentState extends State<ParentStatefulWidget> {
int counter = 0;
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
child: Container(
color: Colors.lightBlue,
padding: EdgeInsets.all(10),
child: Text(
"Tap me",
style: TextStyle(color: Colors.white, fontSize: 24),
)),
onTap: () {
setState(() {
counter = counter + 1;
});
},
),
ChildStatefulWidget(
text: "Count: $counter",
)
],
);
}
}
class ChildStatefulWidget extends StatefulWidget {
final String text;
ChildStatefulWidget({Key key, this.text = ""}) : super(key: key);
@override
State<StatefulWidget> createState() {
return ChildState(text);
}
}
class ChildState extends State<ChildStatefulWidget> {
final String text;
ChildState(this.text);
@override
Widget build(BuildContext context) {
return Text(
text,
style: TextStyle(fontSize: 18),
);
}
}发布于 2020-10-12 16:22:55
您不需要在childState中创建“文本”--只需使用"widget.text":
class ChildState extends State<ChildStatefulWidget> {
@override
Widget build(BuildContext context) {
return Text(
widget.text,
style: TextStyle(fontSize: 18),
);
}
}您的代码无法工作,因为您发送了值抛出构造函数,但是构造函数并不是每次更改状态时都调用。因此,获取的抛出构造函数值不会更改。
https://stackoverflow.com/questions/64321438
复制相似问题