我已经开始研究flutter了,我很好奇类之外的小部件的“状态”。当我将searchAndAddRow
移动到myApp
类内部的构建函数之外时,我需要将Widget声明为final,这是有道理的,因为它是一个无状态的类。当我将Widget完全移到类之外时(就像我在代码片段中所做的那样),我不需要定义任何内容。
在两种情况下,当我将searchAndAddRow
从MyApp
的{{1}}中移出时,android studio中的“热重载”功能均无法正常工作,该应用需要停止并重新启动更改生效。哪一种促使我首先问这个问题。
build
答案 0 :(得分:2)
您的问题是,您没有定义窗口小部件。您定义了一个变量。
变量不会被热重载,因为框架无法知道您要使用旧值还是新值。
通常,不要将小部件树提取到变量中。而是将它们提取到另一个小部件中:
/** DON"T */
Widget foo = Container();
/** DO */
class Foo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container();
}
}
但是如果它是常数怎么办?出于优化目的
好吧,您可以为小部件定义const
构造函数:
class Foo extends StatelessWidget {
const Foo();
@override
Widget build(BuildContext context) {
return Container();
}
}
这意味着只要您执行const Foo()
(自dart 2.0起就不需要const
关键字),它将始终返回完全相同的小部件实例。
基本上,它的作用与将其提取到常量变量中相同。但是隐式地,因此热重装仍然有效。
答案 1 :(得分:0)
这帮助我了解了为什么要将小部件提取到另一个小部件中的原理,以及为什么每个有状态小部件都有单独的状态: Why are stateful widgets defined as two classes in flutter?
主要思想是将小部件对象保存在静态树中,该树在构造函数中定义其UI属性(例如,TextStyle,color,child)。就像HTML DOM一样,有状态是一个div容器,您可以在其中放置一些状态