让我们假设一个类“SpecialButton”及其状态类“SpecialButtonState”
class SpecialButton extends StatefulWidget {
bool active = false;
SpecialButton({Key key}) : super(key: key);
@override
SpecialButtonState createState() => SpecialButtonState();
}
class SpecialButtonState extends State<SpecialButton> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
decoration:
BoxDecoration(color: this.widget.active ? COLOR_1 : COLOR_2),
child: null);
}
}
在父小部件中,我管理其中的几个按钮。因此,我想为他们分配一个状态。我尝试的解决方案是在 SpecialButton 类中引入一个“活动”标志,我可以轻松地从父小部件将其设置为 true 或 false。然后我可以在状态类的构建函数中使用它来为按钮着色。不幸的是,这并不能完全起作用,因为它不会立即更新按钮(它需要某种状态更新,例如通过将鼠标悬停在元素上)。
我的第二个想法是将这个标志作为 SpecialButtonState 类的属性状态引入
class SpecialButton extends StatefulWidget {
SpecialButton({Key key}) : super(key: key);
@override
SpecialButtonState createState() => SpecialButtonState();
}
class SpecialButtonState extends State<SpecialButton> {
bool active;
@override
void initState() {
super.initState();
this.active = false;
}
activate() {
this.setState(() {
active = true;
});
}
deactivate() {
this.setState(() {
active = false;
});
}
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(color: this.active ? COLOR_1 : COLOR_2),
child: null);
}
}
据我了解,这将是使用颤振的正确方法,但似乎我无法从 SpecialButton 类或包含小部件的父类访问“激活”或“停用”功能。
所以我的问题是:我如何(直接或间接通过函数)从相应的 StatefulWidget 类或包含它的父 Widget 修改状态?
在 Stack Overflow 上已经有一些类似的问题,我可以在其中找到使用或不使用全局键的提示,我发现这种行为具有误导性。此外,由于颤振的快速持续发展,它们可能已经过时,所以我再次就这个确切的用例提出这个(类似的)问题。
编辑:我忘了提到在创建后更改此标志至关重要,因此它将在其生存期间多次更改。这需要小部件重绘。