Вы можете иметь переменные в объекте 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,
);
}
}
, а затем вы можете обновить ее, используя setState
, до любого цвета, который вам будет sh.
Почему значение, передаваемое в конструкторе, должно быть final
или почему вы не можете его изменить, это потому, что сам StatefulWidget
является неизменным и содержит неизменные данные, но он также содержит изменяемый State
объект, который является хранилищем для всех состояний aka mutable data
виджет требует.
Цитирование из документов Flutter:
Сами экземпляры StatefulWidget являются неизменяемыми и сохраняют свое изменяемое состояние либо в отдельные объекты State, созданные методом createState или в объектах, на которые подписано это State, например объекты Stream или ChangeNotifier, ссылки на которые хранятся в конечных полях самого StatefulWidget. * 10 25 *
Подробнее об этом можно прочитать здесь: Документация класса StatefulWidget на веб-сайте Flutter