Флаттер: как создать неконечное свойство для StatefulWidget? - PullRequest
1 голос
/ 01 марта 2020

Скажем, я хочу создать кнопку, которая при каждом нажатии меняет цвет. Его начальный цвет требуется в конструкторе.

Следующий код работает нормально, но когда я наведите курсор мыши на вершину 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,
    );
  }
}

1 Ответ

2 голосов
/ 01 марта 2020

Вы можете иметь переменные в объекте 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...