Pig*_*gna 5 attributes state final dart flutter
假设我想创建一个按钮,每次点击它都会改变颜色。在构造函数中需要它的起始颜色。
以下代码工作正常,但是当我将鼠标悬停在 TestButton 顶部时,我收到以下消息:“此类(或此类继承自的类)被标记为‘@immutable’,但它的一个或多个实例字段不是最终:TestButton.color”。
如果它应该是最终的但我需要改变它,那么解决方案是什么?如果它仍然有效,为什么它是最终的?
class TestButton extends StatefulWidget {
TestButton({this.color});
Color color;
@override
_TestButtonState createState() => _TestButtonState();
}
class _TestButtonState extends State<TestButton> {
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () {
setState(() {
widget.color = widget.color == Colors.red ? Colors.blue : Colors.red;
});
},
child: Icon(
Icons.add,
size: 80,
),
color: widget.color,
);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在 的State
对象中拥有变量StatefulWidget
,而不是在其StatefulWidget
本身中。
如果您需要从另一个小部件传递值,您可以传递它并将其重新分配给函数中的一个State
变量initState
。
例子:
class TestButton extends StatefulWidget {
TestButton({this.passedcolor});
final Color passedColor;
@override
_TestButtonState createState() => _TestButtonState();
}
class _TestButtonState extends State<TestButton> {
Color color;
@override
initState(){
color = widget.passedColor;
super.initState()
}
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () {
setState(() {
color = color == Colors.red ? Colors.blue : Colors.red;
});
},
child: Icon(
Icons.add,
size: 80,
),
color: color,
);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用setState
任何你想要的颜色来更新它。
至于为什么在构造函数中传递的值必须是final
或者为什么你不能改变它是因为它StatefulWidget
本身是不可变的并持有不可变的数据,但它也持有一个可变State
对象,它是aka mutable data
小部件所需的所有状态的存储。
引用 Flutter 文档:
StatefulWidget 实例本身是不可变的,并且将它们的可变状态存储在由 createState 方法创建的单独 State 对象中,或者存储在 State 订阅的对象中,例如 Stream 或 ChangeNotifier 对象,这些对象的引用存储在 StatefulWidget 的最终字段中本身。
您可以在此处阅读更多相关信息: Flutter 网站上的 StatefulWidget 类文档
归档时间: |
|
查看次数: |
2864 次 |
最近记录: |