Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 无状态窗口小部件与状态窗口小部件_Flutter - Fatal编程技术网

Flutter 无状态窗口小部件与状态窗口小部件

Flutter 无状态窗口小部件与状态窗口小部件,flutter,Flutter,无状态小部件的所有代码都在一个类中,甚至是构建方法。对于StatefulWidgets,为什么State是一个独立于Widget的类?难道不能将它们组合起来,StatefulWidget就可以自己调用setState吗?StatefulWidget类是不可变的,并将其构造函数参数存储在最终成员中。当它的配置信息改变时,它就会被丢弃,并被一个新的StatefulWidget替换。此操作通常非常便宜,并且会触发重建 相比之下,StatefulWidget的关联状态可能是长期存在的。在替换Statef

无状态小部件的所有代码都在一个类中,甚至是构建方法。对于StatefulWidgets,为什么State是一个独立于Widget的类?难道不能将它们组合起来,StatefulWidget就可以自己调用setState吗?

StatefulWidget类是不可变的,并将其构造函数参数存储在最终成员中。当它的配置信息改变时,它就会被丢弃,并被一个新的StatefulWidget替换。此操作通常非常便宜,并且会触发重建

相比之下,StatefulWidget的关联状态可能是长期存在的。在替换StatefulWidget时,即使构造函数参数发生更改,只要树结构和键匹配,也会重新使用状态。这允许您保持您的状态不被吹走,即使父级更改了有关StatefulWidget的某些内容。例如,您可能希望在动画的中间更改小部件的颜色或文本,并且该状态会注意到,因为它使用小部件获取器读取这些值。这就是为什么一个状态不能有任何构造函数参数;它必须使用小部件读取其配置

如果您希望为重新配置StatefulWidget的情况提供特殊处理,则可以通知您在中所做的更改,尽管通常只需重新构建即可得到预期的结果

StatefulWidget类是不可变的,并将其构造函数参数存储在最终成员中。当它的配置信息改变时,它就会被丢弃,并被一个新的StatefulWidget替换。此操作通常非常便宜,并且会触发重建

相比之下,StatefulWidget的关联状态可能是长期存在的。在替换StatefulWidget时,即使构造函数参数发生更改,只要树结构和键匹配,也会重新使用状态。这允许您保持您的状态不被吹走,即使父级更改了有关StatefulWidget的某些内容。例如,您可能希望在动画的中间更改小部件的颜色或文本,并且该状态会注意到,因为它使用小部件获取器读取这些值。这就是为什么一个状态不能有任何构造函数参数;它必须使用小部件读取其配置

如果您希望为重新配置StatefulWidget的情况提供特殊处理,则可以通知您在中所做的更改,尽管通常只需重新构建即可得到预期的结果

也许这对你有帮助:

在StatefulWidget上放置Widget buildcontext上下文方法,而不是在StatefulWidget上放置Widget buildcontext上下文,State State方法在子类化StatefulWidget时为开发人员提供了更大的灵活性

例如,AnimatedWidget是StatefulWidget的一个子类,它为要实现的子类引入了一个抽象的Widget BuildContext上下文方法。如果StatefulWidget已经有了一个采用状态参数的构建方法,则AnimatedWidget将被迫向子类提供其状态对象,即使其状态对象是AnimatedWidget的内部实现细节

从概念上讲,无状态widget也可以以类似的方式实现为StatefulWidget的子类。如果构建方法是在StatefulWidget而不是State上,那就不可能了

将构建函数置于State而不是StatefulWidget上也有助于避免与隐式捕获此函数的闭包相关的一类错误。如果您在StatefulWidget的构建函数中定义了闭包,那么该闭包将隐式地捕获它,即当前小部件实例

也许这对你有帮助:

在StatefulWidget上放置Widget buildcontext上下文方法,而不是在StatefulWidget上放置Widget buildcontext上下文,State State方法在子类化StatefulWidget时为开发人员提供了更大的灵活性

例如,AnimatedWidget是StatefulWidget的一个子类,它为要实现的子类引入了一个抽象的Widget BuildContext上下文方法。如果StatefulWidget已经有了一个采用状态参数的构建方法,则AnimatedWidget将被迫向子类提供其状态对象,即使其状态对象是AnimatedWidget的内部实现细节

从概念上讲,无状态widget也可以以类似的方式实现为StatefulWidget的子类。如果构建方法是在StatefulWidget而不是State上,那就不可能了

将构建函数置于State而不是StatefulWidget上也有助于避免与隐式捕获此函数的闭包相关的一类错误。如果您在StatefulWidget的构建函数中定义了闭包,那么该闭包将隐式地捕获它,即当前小部件实例