为啥父 StatefulWidget 中的 setState 不更新子 StatefulWidget [重复]
Posted
技术标签:
【中文标题】为啥父 StatefulWidget 中的 setState 不更新子 StatefulWidget [重复]【英文标题】:Why setState in parent StatefulWidget do not update child StatefulWidget [duplicate]为什么父 StatefulWidget 中的 setState 不更新子 StatefulWidget [重复] 【发布时间】:2021-01-26 23:29:02 【问题描述】:我知道,从父 StatefulWidget 更新子 StatefulWidget 的正确方法是使用子 GlobalKey 实例。
但我不明白,为什么 setState(() ) 不这样做!我没有找到任何关于此的文档或解释。
来自documentation:
调用 setState 通知框架内部状态 此对象的更改方式可能会影响用户界面 在这个子树中,这会导致框架为 这个 State 对象。
如果你只是直接改变状态而不调用 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),
);
【问题讨论】:
【参考方案1】:您不需要在 childState 中创建“文本” - 只需使用“widget.text”:
class ChildState extends State<ChildStatefulWidget>
@override
Widget build(BuildContext context)
return Text(
widget.text,
style: TextStyle(fontSize: 18),
);
您的代码不起作用,因为您发送值抛出构造函数,但构造函数不会在每次更改状态时调用。所以得到的 throw 构造函数值不会改变。
【讨论】:
以上是关于为啥父 StatefulWidget 中的 setState 不更新子 StatefulWidget [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Flutter 中的其他 StatefulWidget 设置/更新 StatefulWidget 的状态?
Flutter 中的 statefulWidget 中的屏幕未更新