Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在颤振的gridview中设置状态不更改值_Gridview_Flutter_Setstate - Fatal编程技术网

在颤振的gridview中设置状态不更改值

在颤振的gridview中设置状态不更改值,gridview,flutter,setstate,Gridview,Flutter,Setstate,基本上,我正在更新gridview中使用的列表值,当我单击gridview卡时,我正在更改该卡的颜色。当我打印颜色值时,它确实改变了,但在gridview中没有效果。请告诉我该怎么做?我的逻辑方法是错误的吗 class FilterDialog extends ModalRoute<void> { List<Grades> mGradeList = []; List<Styles> mStyleList = []; List<Type

基本上,我正在更新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;
    }
一些数据:

var typeList = [{"label": "Crack", "selected": false}, {"label": "Face", "selected": false},
   {"label": "Slab", "selected": false}, {"label": "Multi-pitch", "selected": false} ];  
Widget\u buildoverlycontent(BuildContext){
gridViewWidget(mTypeList,2,3.5)
列表_getTiles(列表){
按下按钮:()=>\u按下按钮(i,列出[i][“选定的”],列出),
最终类型列表=[{“标签”:“裂纹”,“选定的”:假},{“标签”:“面”,“选定的”:假},
{“label”:“Slab”,“selected”:false},{“label”:“Multi-pitch”,“selected”:false}
您是否打算将typeList用作全局状态? 我认为这个变量不应该有最后一个修饰符

如果您从未打算更改变量,请使用final或const 代替var或添加到类型。可以设置最终变量 只有一次;常量变量是编译时常量。(常量 变量是隐式的final。)最终的顶级或类变量 在第一次使用时初始化

我的回答基于这样一个事实:当您将
等级定义为对象时,您将
列表[I][“selected”]
作为地图访问。

小部件\u BuildOverlyContent(BuildContext上下文){
gridViewWidget(mTypeList,2,3.5)
列表_getTiles(列表){
按下按钮:()=>\u按下按钮(i,列出[i][“选定的”],列出),
最终类型列表=[{“标签”:“裂纹”,“选定的”:假},{“标签”:“面”,“选定的”:假},
{“label”:“Slab”,“selected”:false},{“label”:“Multi-pitch”,“selected”:false}
您是否打算将typeList用作全局状态? 我认为这个变量不应该有最后一个修饰符

如果您从未打算更改变量,请使用final或const 代替var或添加到类型。可以设置最终变量 只有一次;常量变量是编译时常量。(常量 变量是隐式的final。)最终的顶级或类变量 在第一次使用时初始化


我的回答基于这样一个事实:当你将
等级定义为一个对象时,你将
列表[I][“selected”]
作为一个地图访问。

你的类必须扩展StatefulWidget以及它的状态小部件,以便你使用设置状态()方法。例如:

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
  }
}
class FilterWidget扩展StatefulWidget{
@凌驾
_FilterWidgetState createState()=>\u FilterWidgetState();
}
类_FilterWidgetState扩展状态{
//这里列出
@凌驾
小部件构建(构建上下文){
//使用setState()在此处构建内容
}
}

您的类必须扩展StatefulWidget以及State小部件,以便使用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
  }
}
class FilterWidget扩展StatefulWidget{
@凌驾
_FilterWidgetState createState()=>\u FilterWidgetState();
}
类_FilterWidgetState扩展状态{
//这里列出
@凌驾
小部件构建(构建上下文){
//使用setState()在此处构建内容
}
}

我遇到了同样的问题。我的解决方案是在GridView中重建要更改的对象。不要更新列表中的项目,而是重建列表,并根据需要更新项目。也许可以


我想,如果列表点没有更改,包含它的GridView将不会更改。

我遇到了同样的问题。我的解决方案是在GridView中重建要更改的对象。不要更新列表中的项目,而是重建列表,并根据需要更新项目。也许可以


我想如果列表点没有改变,包含它的GridView也不会改变。

谢谢。我会记住。但这对我的问题没有帮助。答案可能是两个选择。我猜是错误的选择。另一个问题是有状态小部件。哦,好吧。50/50机会谢谢。我会记住。但这不是帮助回答我的问题。答案可能是两个选择。我猜是错误的选择。另一个问题是有状态的小部件。哦,好吧。50/50 chancesetState工作正常。我不能使用StatefulWidget,因为它的对话框模式类,我每次都会得到更新值,它只是对GridView没有影响。setState中的逻辑会改变nge值,但setState的要点是to。由于您的小部件不是有状态的或扩展状态,那么setState()方法将不起作用。我可以问一下为什么要扩展ModalRoute类吗?因为filterview应该在transperent dialog中。这就是我使用ModalRoute类的原因。是否有其他方法使用statfulwidget创建transperent dialog。您可以使用Colors.black.withOpacity(0.8)(使用您想要的任何值)或Colors.transparent用于脚手架或材质小部件的颜色道具,以获得透明/玻璃般的效果。也许可以尝试一下?它与StatefulWidget一起工作,但与ModalRoute不一起工作。感谢您打开我的眼睛。现在唯一剩下的问题是使页面透明。我想没有ModalRoute是不可能的。setState工作正常。。我不能使用StatefulWidget,因为它的对话框模式类,并且我每次都会得到更新的值,它对GridView没有任何影响setState中的逻辑将更改值,但setState的要点是。因为你的小部件没有状态或扩展状态,所以setState()方法将不起作用。我可以问一下为什么要扩展ModalRoute类吗?因为filterview应该在transperent dialog中。这就是我使用ModalRoute类的原因。是否有其他方法使用statfulwidget创建transperent dialog。您可以使用Colors.black.withOpacity(0.8)(使用您想要的任何值)或者颜色。对于脚手架或材质小部件的颜色道具来说是透明的,以获得透明/玻璃般的效果。也许可以这样做
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
  }
}