当以小部件的状态调用setState时,元素树中的相应元素被标记为脏,并重新生成小部件。然而,它如何处理后代呢?例如,下面的Text小部件在其祖先SampleWidgetState重新构建时重新生成。
为什么?
class SampleWidget extends StatefulWidget {
@override
SampleWidgetState createState() => SampleWidgetState();
}
class SampleWidgetState extends State<SampleWidget> {
String text = "text1";
@override
Widget build(BuildContext context) {
return Column(
children: [
Text(text),
ElevatedButton(
child: Text('call SetState'),
onPressed: () {
setState(() {
text = "text2";
});
},
),
],
);
}
}发布于 2022-11-20 03:15:46
从Flutter的官方文档,内颤振
响应用户输入(或其他刺激),元素可能变得脏,例如,如果开发人员对关联的状态对象调用setState()。框架保留一个脏元素的列表,并在构建阶段直接跳转到它们,跳过干净的元素。在构建阶段,信息单向地沿着元素树流动,这意味着每个元素在构建阶段最多只被访问一次。一旦清理完毕,元素就不能再次变得脏了,因为通过归纳,它的所有祖先元素也都是干净的。
我猜这个答案是在小部件的后代更新过程中颤振在引擎盖下所做的事情。
发布于 2022-11-20 05:37:44
SampleWidgetState是一个状态类,当您调用setState() --它的平均build()方法将重新调用--时,内部的一切都将重新构建。这就是它的工作原理。
如果要防止后代不进行重建,有几种方法,
const关键字。在您的示例中,Text小部件使用SampleWidgetState:String text = "text1";,它的平均文本小部件不是独立的,它依赖于该状态。
https://stackoverflow.com/questions/74505124
复制相似问题