Удаленное изменение состояния виджета в списке

В настоящее время я работаю над GridView, который создает виджет Container для каждого элемента в списке.

new GridView.count(
        crossAxisCount: 2,
        childAspectRatio: 1.3,
        children: cardSet.map((card){
        Color containerColor = Colors.blue;
        return new GestureDetector(
          onTap: (){
          setState(){
           containerColor = Colors.green;
           //This part is unsolved:
           containerColor.of(matchingWidget) = Colors.green;
          };
          }
          child: new Container(
            color: containerColor,
          ),
        );
          }).toList()),

Итак, вот моя проблема: я хотел бы, чтобы пользователь находил совпадающие значения в GridView, и, поскольку каждый Container содержит одно значение, выбор двух значений с onTap приводит либо к совпадающим значениям, либо к несовпадающим значениям. В обоих случаях цвет двух выбранных виджетов Container должен измениться.

Изменить последний выбранный виджет Container легко, просто изменив свойство color с помощью setState(), но как мне изменить цвет ранее выбранного «подходящего» контейнера? Чтобы использовать изображение, как бы я одновременно изменил цвет контейнера «два» и «2» после того, как пользователь нажал на соответствующий контейнер «два»?

Использую ли я свойство key для хранения ссылки на «совпадающий» виджет или есть другая возможность?

Удаленное изменение состояния виджета в списке

Не могли бы вы поделиться своим кодом больше?

yaho cho 27.05.2019 18:25

@yahocho Я только что обновил фрагмент кода соответствующей частью, которую я хотел бы решить. В основном все сводится к изменению containerColor соответствующего контейнера (если совпадение действительно правильное, например, «2» и «два») одновременно с изменением цвета последнего нажатого контейнера.

stefanmuke 28.05.2019 15: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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я сделал class myCard как показано ниже:

class myCard {
  String key;
  Color color;
  String match;

  myCard( {
    this.key,
    this.color,
    this.match
  });
}

И создал список cardSet, как показано ниже:

class _MyHomePageState extends State<MyHomePage> {
  var cardSet = [
    myCard(key:"two", color:Colors.blue, match:"2"),
    myCard(key:"3", color:Colors.blue, match:"three"),
    myCard(key:"one", color:Colors.blue, match:"1"),
    myCard(key:"2", color:Colors.blue, match:"two"),
    myCard(key:"10", color:Colors.blue, match:"ten"),
    myCard(key:"ten", color:Colors.blue, match:"10"),
    myCard(key:"three", color:Colors.blue, match:"3"),
    myCard(key:"1", color:Colors.blue, match:"one"),
  ];

Я думаю, вы можете сделать это в своем стиле. На самом деле, мы можем назвать myCard моделью.

И я сделал getMatchCard функцию обнаружения связанной карты.

  myCard getMatchCard(card){
    return cardSet.where((_card)=>_card.match==card.key).toList()[0];
  }

Наконец, я установил цвет карты в setState по атрибутам myColor. containerColor была локальной переменной, и ее данные нельзя было сохранить. Итак, я подумал, что нам нужны переменные-члены для хранения данных после создания всех GestureDetector.

child: new GridView.count(
    crossAxisCount: 2,
    childAspectRatio: 1.3,
    children: cardSet.map((card){
      return new GestureDetector(
        onTap: (){
          setState((){
            card.color = Colors.green; // a color of Tapped card
            getMatchCard(card).color = Colors.green; // a color of related card
          });
        },
         child: new Container(
           color: card.color,
           child:Text(card.key) // I set the text in myself because I can not see your cardSet data.
         ),
      );
    }).toList()),

Вы знаете, Flutter выводит реактивное программирование. Итак, разделение model и view by state удобно.

Это работает хорошо. Пожалуйста, обратитесь к изображению, как показано ниже:

Оно работает! Большое спасибо за развернутое объяснение!

stefanmuke 29.05.2019 19:14

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