Вызовите setState вне StatefulWidget (с установщиком)

У меня большой опыт работы с Javascript, и теперь я хочу начать с Flutter. Так что, возможно, моя проблема в том, что я вижу код как разработчик JS, и решение Flutter будет другим. Но вот моя проблема: Я хочу создать простую карточную игру. Игральная карта — это StatefulWidget:

class GameCard extends StatefulWidget {

  int _value;
  String _suit;
  bool _visible;

  String _imagePath;

  // void setVisible() {
  //   How to execute setState here??
  // }

  GameCard({int value, String suit, bool visible = false}) {
    ...
    this._visible = visible;
    this._value = value;
    this._suit = suit;
  }

  @override
  _GameCardState createState() => _GameCardState();
}

class _GameCardState extends State<GameCard> {

  String getSuit() => widget._suit;
  int getValue() => widget._value;

  bool isVisible() => widget._visible;

  @override
  Widget build(BuildContext context) {
  ...
  return ClipRRect(
      borderRadius: BorderRadius.circular(10),
      child: Container(
        width: width,
        height: width * 1.5,
        decoration: BoxDecoration(
          image: DecorationImage(
            fit: BoxFit.cover,
            image: AssetImage(widget._imagePath), 
      ...

Идея состоит в том, что imagePath в классе состояния должен быть изображением рубашки карты, когда карта не видна. Теперь я хочу иметь функцию setVisible в моем StatefulWidget, которая запускает setState() с последующим обновлением imagePath. После этого imagePath должен быть изображением игральной карты, например, червовым королем. Итак, наконец, я хочу создать экземпляр GameCard в другом месте и изменить изображение с помощью сеттера:

GameCard spadeFour = GameCard(value: 4, suit: 'spade', visible: false),
spadeFour.setVisible(true)

Как мне это сделать? Я читал о Globalkey и других вещах, но это не может быть так сложно, потому что это очень распространенный вариант использования.

Но тогда я не могу получить доступ к методу из экземпляра GameCard: spadeFour.setVisible(true)

anfeu 11.12.2020 09:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 618
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как правило, вам следует избегать создания экземпляра виджета, а затем его изменения с помощью свойств. Это также не нужно, так как вы уже правильно используете параметры для изменения внешнего вида виджета.

Чтобы виджет перерисовывался с другими параметрами, вместо вызова setState внутри этого виджета вызовите его в родительском виджете.

class _YourParentPageState extends State<YourParentPage> {

  bool visible = false;

  _changeVisibility(bool v) {
    setState(() {
      visible = v;
    });
  }
  
  @override
  Widget build(BuildContext context) {
    return GameCard(value: 4, suit: 'spade', visible: visible);
  }
}

Вызов _changeVisibility перерисует вашу GameCard с обновленным параметром visible.

Спасибо. Я думаю, что мое понимание виджетов неверно. Думаю, мне следует попытаться немного лучше понять концепцию Flutter и его виджетов.

anfeu 11.12.2020 09:50

И как можно изменить состояние списка GameCards. Например. в карточной игре 52 карты. Я создаю виджеты в цикле, а затем мне нужно 52 переменные для управления состоянием карт? Какова наилучшая практика в таком случае?

anfeu 13.12.2020 17:14

Другие вопросы по теме