Flutter 创建一个非最终的小部件

Flutter 创建一个非最终的小部件,flutter,Flutter,我想知道是否可以声明一个小部件,然后编辑小部件中的属性。见下例: InputDecoration temp = new InputDecoration( labelText: label, labelStyle: TextStyle(color: Colors.white), // ... ); 然后 temp.suffixIcon = IconButton(icon: Icons.sth); 我似乎无法让它工作,因为它是最终的。非常感谢任何帮助。不。这是不可能的,或者应该尽量避

我想知道是否可以声明一个小部件,然后编辑小部件中的属性。见下例:

InputDecoration temp = new InputDecoration(
  labelText: label,
  labelStyle: TextStyle(color: Colors.white),
  // ...
);
然后

temp.suffixIcon = IconButton(icon: Icons.sth);

我似乎无法让它工作,因为它是最终的。非常感谢任何帮助。

不。这是不可能的,或者应该尽量避免

原因是,同一个小部件可以插入小部件树的多个位置

例如,这样做是完全合理的:

小部件foo=某物; 返回行 儿童:[ 福, 福, ] ;
您试图做的是命令式编程: 您有一个程序状态,每当它发生更改时,您都会手动更新所有必要的UI元素

颤振是一个反应式UI框架。半数学地说,这意味着存在一些状态s和构建方法f,当状态改变时,框架通过调用函数fs来构建新的小部件子树

更具体地说,您不想更改子窗口小部件的具体属性,您甚至不想这样做,因为这违背了反应性范式。而是更改程序的状态,并告诉框架状态已更改。然后,它将使用新属性重新呈现所有子窗口小部件。 不要过分担心性能,颤振在这方面进行了大量优化

状态发生变化的小部件是flatter中的有状态小部件。每个StatefulWidget都有一个对应的状态,该状态还可以包含以下可变的非最终属性:

bool _useFirstIcon=true; 更改状态时,请在如下状态下使用setState函数通知框架更改:

无效(改变状态){ setState=>\u useFirstIcon=false; } 这告诉框架重新呈现该子树。基本上,这意味着您的构建方法将在绘制下一帧时被调用。 在这里,您应该根据_useFirstIcon属性的状态返回不同的小部件树

返回SomeWidget 装饰:新的输入装饰 后缀:图标按钮 图标:_使用第一个图标?Icons.someIcon:Icons.someOtherIcon, 按下时:_更改状态, , , ; 请注意,有时您确实希望从父窗口小部件访问窗口小部件的状态。通过向子窗口小部件提供某种控制器,子窗口小部件修改控制器的状态,使其自身状态的一部分可供父窗口小部件访问,可以说这有点不公平。
例如,此体系结构在使用TextController的TextField中使用。

否,但您可以在StatefulWidget中使用变量,在其中分配IconButton并刷新widget