Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.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
Flutter 颤振:更改列表中类按钮按下时的颜色_Flutter_Dart - Fatal编程技术网

Flutter 颤振:更改列表中类按钮按下时的颜色

Flutter 颤振:更改列表中类按钮按下时的颜色,flutter,dart,Flutter,Dart,我已经看到了这个问题的各种变化,但还不能为我的用例拼凑出一个解决方案 我有一个圆圈按钮列表 List<CircleButton> buttons = [ new CircleButton(onTap: () => print("Arts"), iconData: Icons.palette, label: "Arts"), new CircleButton(onTap: () => print("Board

我已经看到了这个问题的各种变化,但还不能为我的用例拼凑出一个解决方案

我有一个
圆圈按钮列表

List<CircleButton> buttons = [
    new CircleButton(onTap: () => print("Arts"), iconData: Icons.palette, label: "Arts"),
    new CircleButton(onTap: () => print("Board Games"), iconData: Icons.casino, label: "Board Games"),
    new CircleButton(onTap: () => print("Causes"), iconData: Icons.volunteer_activism, label: "Causes"),    
  ];
当点击按钮时,我想更新它的外观。我已经设置了
CircleButton
类,以使布尔值
isSelected
确定着色方式:

class CircleButton extends StatelessWidget {
  final GestureTapCallback onTap;
  final IconData iconData;
  final String label;
  bool isSelected = false;

  CircleButton({Key key, this.onTap, this.iconData, this.label}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    double size = 65.0;

    return new
      InkResponse(
        onTap: onTap,

        child: new Container(
          width: size,
          height: size,
          decoration: new BoxDecoration(
            color: isSelected ? Color.fromRGBO(139, 207, 236, 1.0) : Color.fromRGBO(248, 248, 250, 1.0),
            shape: BoxShape.circle,
          ),
          child: new Icon(
            iconData,
            color: isSelected ? Colors.white : Color.fromRGBO(2, 78, 157, 1.0),
          ),
        ),
      );
  }
}

如何从
onTap
更新
isSelected
变量?

如果希望每个按钮管理其自己的选定状态(意味着点击按钮不会取消选择其他按钮),则必须使用StatefulWidget:

class CircleButton扩展StatefulWidget{
最后一个手势点击点击按钮;
最终Iconda Iconda;
最终字符串标签;
CircleButton({Key,this.onTap,this.iconData,this.label})
:super(key:key);
@凌驾
_CircleButtonState createState()=>_CircleButtonState();
}
类_CircleButtonState扩展状态{
bool-isSelected=false;
@凌驾
小部件构建(构建上下文){
双尺寸=65.0;
返回新的InkResponse(
onTap:(){
widget.onTap;
//添加这些行
设置状态(){
isSelected=!isSelected;
});
},
子容器:新容器(
宽度:大小,
高度:尺寸,
装饰:新盒子装饰(
颜色:已选择
?来自RGBO的颜色(1392072361.0)
:颜色。来自RGBO(248248250,1.0),
形状:BoxShape.circle,
),
孩子:新图标(
widget.iconda,
颜色:isSelected?颜色。白色:颜色。来自RGBO(2,78,157,1.0),
),
),
);
}
}
否则,如果您希望一次只选择一个按钮,只需在父窗口小部件中创建一个变量来存储选择的按钮:

int selectedButtonIndex;
列表按钮=[
新的圆形按钮(onTap:(){
印刷品(“艺术”);
setState((){selectedButtonIndex=selectedButtonIndex!=0?0:null;});
},Iconda:Icons.palete,标签:“艺术”,
isSelected:selectedButtonIndex==0,
),
新的圆形按钮(onTap:(){
印刷品(“棋盘游戏”);
setState((){selectedButtonIndex=selectedButtonIndex!=1?1:null;});
},iconData:赌场,标签:“棋盘游戏”,
isSelected:selectedButtonIndex==1,
),
... 
];

并添加
isSelected
作为
CircleButton

的参数。如果希望每个按钮管理其自己的选定状态(意味着点击按钮不会取消选择其他按钮),则必须使用StatefulWidget:

class CircleButton扩展StatefulWidget{
最后一个手势点击点击按钮;
最终Iconda Iconda;
最终字符串标签;
CircleButton({Key,this.onTap,this.iconData,this.label})
:super(key:key);
@凌驾
_CircleButtonState createState()=>_CircleButtonState();
}
类_CircleButtonState扩展状态{
bool-isSelected=false;
@凌驾
小部件构建(构建上下文){
双尺寸=65.0;
返回新的InkResponse(
onTap:(){
widget.onTap;
//添加这些行
设置状态(){
isSelected=!isSelected;
});
},
子容器:新容器(
宽度:大小,
高度:尺寸,
装饰:新盒子装饰(
颜色:已选择
?来自RGBO的颜色(1392072361.0)
:颜色。来自RGBO(248248250,1.0),
形状:BoxShape.circle,
),
孩子:新图标(
widget.iconda,
颜色:isSelected?颜色。白色:颜色。来自RGBO(2,78,157,1.0),
),
),
);
}
}
否则,如果您希望一次只选择一个按钮,只需在父窗口小部件中创建一个变量来存储选择的按钮:

int selectedButtonIndex;
列表按钮=[
新的圆形按钮(onTap:(){
印刷品(“艺术”);
setState((){selectedButtonIndex=selectedButtonIndex!=0?0:null;});
},Iconda:Icons.palete,标签:“艺术”,
isSelected:selectedButtonIndex==0,
),
新的圆形按钮(onTap:(){
印刷品(“棋盘游戏”);
setState((){selectedButtonIndex=selectedButtonIndex!=1?1:null;});
},iconData:赌场,标签:“棋盘游戏”,
isSelected:selectedButtonIndex==1,
),
... 
];

并添加
isSelected
作为
CircleButton

的参数,因为我不熟悉颤振,所以仍然掌握状态。这很有效!谢谢你,我是新来的,所以仍然掌握着美国的窍门。这很有效!非常感谢。
class CircleButton extends StatelessWidget {
  final GestureTapCallback onTap;
  final IconData iconData;
  final String label;
  bool isSelected = false;

  CircleButton({Key key, this.onTap, this.iconData, this.label}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    double size = 65.0;

    return new
      InkResponse(
        onTap: onTap,

        child: new Container(
          width: size,
          height: size,
          decoration: new BoxDecoration(
            color: isSelected ? Color.fromRGBO(139, 207, 236, 1.0) : Color.fromRGBO(248, 248, 250, 1.0),
            shape: BoxShape.circle,
          ),
          child: new Icon(
            iconData,
            color: isSelected ? Colors.white : Color.fromRGBO(2, 78, 157, 1.0),
          ),
        ),
      );
  }
}