SetState не меняет значение в gridview во флаттере

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

class FilterDialog extends ModalRoute<void> {

   List<Grades> mGradeList = [];
   List<Styles> mStyleList = [];
   List<Types> mTypeList = [];
   List<Specials> mSpecialList = [];

   FilterDialog(this.mGradeList, this.mStyleList, this.mTypeList, this.mSpecialList);


      @override
      Widget buildPage(
        BuildContext context,
        Animation<double> animation,
        Animation<double> secondaryAnimation,
      ) {
        // This makes sure that text and other content follows the material style
        return Material(
          type: MaterialType.transparency,
          // make sure that the overlay content is not cut off
          child: SafeArea(
            child: _buildOverlayContent(context),
          ),
        );
      }

      Widget _buildOverlayContent(BuildContext context) {
        return new Container(
            padding: EdgeInsets.only(left: 15, right: 15),
            child: Column(
                children: <Widget>[
                    titleWidget("Grade"),  
                    gridViewWidget(mGradeList, 3, 2.2),

                    spaceWidget(),
                    titleWidget("Style"),  
                    gridViewWidget(mStyleList, 2, 3.5),

                    spaceWidget(),
                    titleWidget("Type"),  
                    gridViewWidget(mTypeList, 2, 3.5),

                    spaceWidget(),
                    titleWidget("Special"),  
                    gridViewWidget(mSpecialList, 2, 3.5),
                ],
              )
          );
      }

      Widget gridViewWidget(list, int count, double ratio) {
        return GridView.count(
          shrinkWrap: true,
          crossAxisCount: count,
          mainAxisSpacing: 2.0,
          crossAxisSpacing: 1.0,
          childAspectRatio: ratio,
          physics: new NeverScrollableScrollPhysics(),
          children: _getTiles(list)
        );
      }

      void _onTileClicked(int index, value, list){
        assert(index != null);
        assert(value != null);
        setState(() {
            list[index].setSelected(!value);
        });
        debugPrint("You tapped on item $index with $value");
      }

      // Get grid tiles
    List<Widget> _getTiles(list) {
      final List<Widget> tiles = <Widget>[];
      for (int i = 0; i < list.length; i++) {
        tiles.add(new GridTile(
              child: new Center(
                child: Container(
                  height: 35.0,
                  child: new RaisedButton(
                    onPressed: () => _onTileClicked(i, list[i]["selected"], list),
                    color: list[i]["selected"] ? backgroundColor : white, //here value not changing
                    shape: new RoundedRectangleBorder(
                        borderRadius:
                            new BorderRadius.circular(30.0)),
                    child: new Text(
                      list[i]["label"],
                      textAlign: TextAlign.center,
                      style: new TextStyle(
                        fontSize: 14.0,
                        color: Colors.grey,
                      ),
                    ),
                  ),
                ),
              ),
            ));
      }
      return tiles;
    }

модель класса:

class Grades {
    String label;
    bool selected;

    Grades(this.label, this.selected);

    void setSelected(bool val) {
        this.selected = val;
    }
}

некоторые данные:

var typeList = [{"label": "Crack", "selected": false}, {"label": "Face", "selected": false},
   {"label": "Slab", "selected": false}, {"label": "Multi-pitch", "selected": false} ];  

SetState не меняет значение в gridview во флаттере

Вы не должны создавать свой пользовательский интерфейс в ModalRoute. Вы должны переместить это в виджет

Rémi Rousselet 02.11.2018 04:32

@ RémiRousselet, я понял, но есть ли способ использовать ModalRoute? bcz необходимо сделать просмотр фильтра в прозрачном полноэкранном диалоге.

Sagar Chavada 02.11.2018 05:07
_buildOverlayContent следует передать конструктору, а не быть методом
Rémi Rousselet 02.11.2018 11:29
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
4 578
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Widget _buildOverlayContent(BuildContext context) {
gridViewWidget(mTypeList, 2, 3.5)

List<Widget> _getTiles(list) {
onPressed: () => _onTileClicked(i, list[i]["selected"], list),

final typeList = [{"label": "Crack", "selected": false}, {"label": "Face", "selected": false},
   {"label": "Slab", "selected": false}, {"label": "Multi-pitch", "selected": false}

Вы намереваетесь использовать typeList как глобальное состояние? Я думаю, что у переменной не должно быть последнего модификатора.

https://www.dartlang.org/guides/language/language-tour

If you never intend to change a variable, use final or const, either instead of var or in addition to a type. A final variable can be set only once; a const variable is a compile-time constant. (Const variables are implicitly final.) A final top-level or class variable is initialized the first time it’s used.

Я основываю свой ответ на том факте, что вы обращаетесь к list[i]["selected"] как к карте, а вы определяете Grades как объект.

Спасибо .. буду иметь в виду .. но это не помогает с моим вопросом.

Sagar Chavada 01.11.2018 05:27

Ответом могло быть два варианта. Думаю, выбор неправильный. Другая проблема - виджет с отслеживанием состояния. Ну что ж. 50/50 шанс

user1462442 01.11.2018 17:50
Ответ принят как подходящий

Ваш класс должен расширить StatefulWidget вместе с виджетом Состояние, чтобы вы могли использовать метод setState (). Например:

class FilterWidget extends StatefulWidget {
  @override
  _FilterWidgetState createState() => _FilterWidgetState();
}

class _FilterWidgetState extends State<FilterWidget> {
    //lists here

  @override
  Widget build(BuildContext context) {
    //build stuff here with setState() being used
  }
}

Вы можете найти дополнительную информацию здесь из официальных документов.

setState работает нормально .. Я не могу использовать Stateful Widget, потому что это модальный класс диалога, и я получаю обновленное значение каждый раз, это просто не влияет на gridview

Sagar Chavada 01.11.2018 10:43

Логика в setState изменит значения, но точка setState - уведомить фреймворк об изменении внутреннего состояния этого объекта.. Поскольку ваш виджет не поддерживает состояние или не расширяет состояние, метод setState () не будет работать. Могу я спросить, зачем вы расширяете класс ModalRoute?

SnakeyHips 01.11.2018 10:59

потому что filterview должен быть в прозрачном диалоге. вот почему я использую класс ModalRoute. есть ли другой способ сделать диалог прозрачным с помощью виджета с отслеживанием состояния.

Sagar Chavada 01.11.2018 11:04

Вы можете использовать Цвета. Черный. С прозрачностью (0,8) (с любым желаемым значением) или Цвета. Прозрачный для цветовой опоры виджета Scaffold или Material, чтобы получить эффект прозрачности / стекла. Может быть, попробовать?

SnakeyHips 01.11.2018 11:23

он работает с StatefulWidget, но не работает с ModalRoute. Спасибо, что открыли мне глаза. Теперь осталась только проблема - сделать страницу прозрачной ... Я думаю, это невозможно без ModalRoute.

Sagar Chavada 01.11.2018 14:03

Сохраните его как StatefulWidget, а затем используйте как опору конструктора для метода showDialog. Если в вашем диалоговом окне в качестве основного виджета используется виджет «Материал» или «Скаффолд», вы можете использовать свойства цвета, о которых я упоминал ранее, для изменения прозрачности фона диалогового окна.

SnakeyHips 01.11.2018 14:35

Это не работает .. Я пытался установить фон для Scaffold, но он не работал .. Если вы найдете какое-либо решение, пожалуйста, упомяните здесь ..

Sagar Chavada 01.11.2018 16:56

Встречаюсь с той же проблемой. Мое решение - восстановить объект, который вы хотите изменить, в GridView. Не обновляйте элемент в списке, а восстановите список и обновите элемент по своему усмотрению. Может, это сработает.

Я предполагаю, что если точка списка не будет изменена, GridView, который ее включает, не будет изменен.

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