【问题标题】:coloring containers by tabbing with flutter通过颤振标签为容器着色
【发布时间】:2020-05-30 21:14:11
【问题描述】:

我有许多 ((Tabbed)) 项目的列,当我在其中一个项目上进行选项卡时,它应该是彩色的,而其他项目应该是透明的,这是我的选项卡类this image for what I have now with my code

class Tabbed extends StatefulWidget {
  @override
  _TabbedState createState() => _TabbedState();
}

class _TabbedState extends State<Tabbed> {
  Color color = Colors.transparent;
  @override
  void initState() {
    color = Colors.transparent;
  }
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: (){
        print("tab");
        if (color == Colors.transparent){
          setState(() {
            color = Colors.purple;
          });
        }
        else{
          setState(() {
            color = Colors.transparent;
          });
        }
      },
      child: Container(
        height: 100,
        width: 100,
        decoration: BoxDecoration(
          color: color,
          border: Border.all(color: Colors.red,width: 1),
        ),
      ),
    );
  }
}

【问题讨论】:

标签: flutter dart colors containers tabbed


【解决方案1】:

您可以简单地尝试为您的盒子创建一个模型并拥有一个boolean 属性并将每个盒子的状态存储在一个列表中以了解该盒子是否被点击,您也可以喜欢一个布尔列表,但我更喜欢创建一个模型列表,因为它可以让你添加更多属性,我已经稍微修改了你的代码,你可以看到它也在工作here on dartpad

class Tabbed extends StatefulWidget {
  @override
  _TabbedState createState() => _TabbedState();
}

class _TabbedState extends State<Tabbed> {
  Color color = Colors.green; 
  @override
  void initState() {
    for(int i=0;i<listLength;i++){
      list1.add(
      TabModel(isTapped: false)); // assigns initial value to false
    }
    for(int i=0;i<listLength;i++){
      list2.add(
      TabModel(isTapped: false)); // assigns initial value to false
    }
  }

  Widget column1(){
    return Column(
    children: List.generate(
          listLength,
          (index) =>GestureDetector(
          onTap: (){
            // this selects only one out of many and disables rest
            for(int i=0;i<list1.length;i++){
              if(i!=index){
                list1[i].isTapped=false;
              }
            };
            setState((){
              list1[index].isTapped = true;
            });
          },
          child:Container(
            margin:EdgeInsets.all(5),
            color: list1[index].isTapped? Colors.red:color,
          height:100,
          width:100
          ))
        ));
  }

  Widget column2(){
    return Column(
    children: List.generate(
          listLength,
          (index) =>GestureDetector(
          onTap: (){
            setState((){
              list2[index].isTapped = !list2[index].isTapped;
            });
          },
          child:Container(
            margin:EdgeInsets.all(5),
            color: list2[index].isTapped? Colors.red:color,
          height:100,
          width:100
          ))
        ));
  }

 List<TabModel> list1 =[]; 
 List<TabModel> list2 =[]; 

  int listLength=5;
  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    children: <Widget>[
      column1(),
      column2()
    ],);
  }
}
class TabModel{
   bool isTapped = false;
  TabModel({this.isTapped});
}

如果这不是您想要的,或者如果您在理解代码的任何部分时遇到任何问题,请随时发表评论,我很乐意提供帮助 bwlow 输出在 coumn1 中显示了两个独立的列,您可以从多个框中选择一个,在其他框中您可以选择多个框

【讨论】:

  • 我试了下代码还是不行,还是一样的问题,你可以同时点击多个项目,我有水平列表视图,每个项目都是容器列表, 7 水平 * 4 垂直选项卡式小部件,用户应该只选项卡一个,当单击另一个项目时,第一个自动禁用。
  • 你能发布你的布局图片吗
  • 我认为我的回答解决了你的问题,只是你必须根据你的要求设计盒子,如果你使用上面的代码,它将选择用户点击的盒子,其余的将被取消选择
  • 在 dartPad 中编译为 JavaScript 时出错,这是什么意思?
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2020-10-30
  • 2022-01-15
  • 2019-07-10
  • 1970-01-01
  • 2020-02-28
  • 2020-05-27
  • 2021-02-11
相关资源
最近更新 更多