Как обновить состояние в виджете с отслеживанием состояния в этом случае?

#flutter

Вопрос:

Я пытаюсь изменить цвета SVG, когда нажимаю на него. Я использую boolean вход parent widget и устанавливаю значение true/false при нажатии svg. Затем я читаю boolean в своем child widget и пытаюсь настроить цвета для ребенка conditional logic . В debugging , я вижу boolean изменения true и false , как и ожидалось. Но цвет не меняется. Как изменить цвет в этом случае?

Ошибка: No errors, it just don't change colour when tap

Дочерний виджет

 class ToolSetButton extends StatefulWidget {    final double width;  final double height;  ...   const ToolSetButton(  {Key? key,  ...  this.checkedColour = iconColourUnchecked,  this.unCheckedColour = iconColourChecked,  ...  required this.buttonType ,     })  : super(key: key);   @override  Statelt;ToolSetButtongt; createState() =gt; _ToolSetButtonState(); }  class _ToolSetButtonState extends Statelt;ToolSetButtongt; {     @override  Widget build(BuildContext context) {  return Column(children: lt;Widgetgt;[  InkWell(  splashColor: Colors.white,  onTap: () {    widget.functionReceiverforButtonandSVG();      },  child: Container(    child: Padding(  padding: EdgeInsets.all(  functionCalculatePadding(widget.height)),  child: FittedBox(  fit: BoxFit.contain,  child: widget.icon == null  ? SvgPicture.asset(  widget.svgPicPath!,    color:     buttonChecked == true  ? widget.checkedColour  : widget.unCheckedColour  )   

Родительский виджет

 class _ToolSetBottomState extends Statelt;ToolSetBottomgt; {  @override  Widget build(BuildContext context) {    return Column(  crossAxisAlignment: CrossAxisAlignment.stretch,  mainAxisAlignment: MainAxisAlignment.center,  children: lt;Widgetgt;[  Row(    children: [  ToolSetButton(  svgPicPath: svgVectorImagePath,  buttonType: myButtonTypeList.SVGOnly,  checkedColour: Colors.green,  unCheckedColour: Colors.grey,    width: 80,  height: 80,    functionReceiverforButtonandSVG: () { funcForTapsandClicks (myButtonList.Two);}),     funcForTapsandClicks( myButtonList tappedOn) {   if (tappedOn == myButtonList.Two ){  print('Two');  buttonChecked = buttonChecked == true   ?false : true;    }      }  

Комментарии:

1. Вам нужно позвонить setState , чтобы запустить обновление виджета.

Ответ №1:

Отправьте переменную, отмеченную кнопкой, в дочерний виджет вместо передачи функции. В дочернем виджете используйте setState((){ widget.buttonChecked = !widget.buttonChecked; });

Комментарии:

1. куда вы его помещаете? под onTap: () этим ? там написано buttonChecked is not defined for "toolSetButton"

2. если (tappedOn == Мой список кнопок. Два ){ печать(«Два»); Кнопка отмечена = Кнопка отмечена == верно ? false : true; } Вы можете удалить эти строки и добавить строки, которые я вам дал