Предположим, что класс 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 или содержащего его родительского виджета?
Уже есть несколько похожих вопросов по этому поводу здесь, в Stack Overflow, где я мог бы найти подсказки как использовать, так и не использовать глобальные ключи для такого поведения, которое я нашел вводящим в заблуждение. Кроме того, из-за быстрого развития флаттера они, вероятно, устарели, поэтому я снова задаю этот (аналогичный) вопрос в отношении этого конкретного варианта использования.
РЕДАКТИРОВАТЬ: Я забыл упомянуть, что очень важно, чтобы этот флаг был изменен после создания, поэтому он будет изменен несколько раз во время его существования. Это требует, чтобы виджет перерисовался.