类之外的窗口小部件的“状态”是什么

时间:2018-08-25 11:39:25

标签: dart flutter

我已经开始研究flutter了,我很好奇类之外的小部件的“状态”。当我将searchAndAddRow移动到myApp类内部的构建函数之外时,我需要将Widget声明为final,这是有道理的,因为它是一个无状态的类。当我将Widget完全移到类之外时(就像我在代码片段中所做的那样),我不需要定义任何内容。

在两种情况下,当我将searchAndAddRowMyApp的{​​{1}}中移出时,android studio中的“热重载”功能均无法正常工作,该应用需要停止并重新启动更改生效。哪一种促使我首先问这个问题。

build

2 个答案:

答案 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容器,您可以在其中放置一些状态