Flutter ListTile的多重选择

Flutter ListTile的多重选择,flutter,dart,Flutter,Dart,我是新来这里的,我正在尝试选择所有的方块,下面给出的是一次选择ListTile的代码,当选择一个tile时,它会将背景颜色更改为redAccent,但我需要多个选择的代码,在这里我可以选择所有三个ListTile或两个ListTile,而不仅仅是一个ListTile class MultiSelect extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold(

我是新来这里的,我正在尝试选择所有的方块,下面给出的是一次选择ListTile的代码,当选择一个tile时,它会将背景颜色更改为redAccent,但我需要多个选择的代码,在这里我可以选择所有三个ListTile或两个ListTile,而不仅仅是一个ListTile

class MultiSelect extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: GradientAppBar(
        title: Text('MultiSelect'),
      ),
      body: MultipleSelectItems(),
    );
  }
}

class MultipleSelectItems扩展StatefulWidget{
@凌驾
_MultipleSelectItemsState createState()=>_MultipleSelectItemsState();
}
类_MultipleSelectItemsState扩展状态{
字符串selected=“First”;
@凌驾
小部件构建(构建上下文){
返回容器(
儿童:手势检测器(
子:列(
儿童:[
大小盒子(
身高:40,
),
手势检测器(
onTap:(){
设置状态(){
选择=“第一”;
});
},
子:容器(
边距:仅限边集(左:15,右:15),
身高:100,
宽度:double.maxFinite,
装饰:盒子装饰(
颜色:所选=='First'?Colors.redAccent:Colors.lightBlueAccent,
),
孩子:ListTile(
标题:正文(
“第一”,
textAlign:textAlign.center,
样式:TextStyle(
尺寸:20,
fontFamily:'半黑体',
fontWeight:fontWeight.bold,
),
),
),
),
),
填充(填充:仅限边集(顶部:20)),
手势检测器(
onTap:(){
设置状态(){
已选择=“秒”;
});
},
子:容器(
边距:仅限边集(左:15,右:15),
身高:100,
宽度:double.maxFinite,
装饰:盒子装饰(
颜色:所选=='Second'?Colors.redAccent:Colors.lightBlueAccent,
),
孩子:ListTile(
标题:正文(
"第二",,
textAlign:textAlign.center,
样式:TextStyle(
尺寸:20,
fontFamily:'半黑体',
fontWeight:fontWeight.bold,
),
),
),
),
),
填充(填充:仅限边集(顶部:20)),
手势检测器(
onTap:(){
设置状态(){
选择=“第三”;
});
},
子:容器(
边距:仅限边集(左:15,右:15),
身高:100,
宽度:double.maxFinite,
装饰:盒子装饰(
颜色:所选=='Third'?Colors.redAccent:Colors.lightBlueAccent,
),
孩子:ListTile(
标题:正文(
"三",,
textAlign:textAlign.center,
样式:TextStyle(
尺寸:20,
fontFamily:'半黑体',
fontWeight:fontWeight.bold,
),
),
),
),
),
大小盒子(
身高:40,
),
材料按钮(
儿童:文本(“提交”),
颜色:颜色。蓝灰色,
textColor:Colors.white,
按下:(){},
),
],
),
),
);
}
}

我已经得到了你的答案。将字符串变量更改为数组可以完成您希望执行的操作。然后通过检查数组中是否有“First”或“Second”或“Third”,我们可以确定ListTile应该是什么颜色。此外,当点击ListTile时,我们需要检查数组是否包含该字符串,以确定是否要从数组中删除该字符串(也称为将颜色变为蓝色),或者是否需要将该字符串添加到数组中(也称为将颜色变为红色)。下面我已经把所有这些变化都包括在你的课堂上了。希望这个答案有帮助!如果您有任何问题,请发表评论

class MultipleSelectItems extends StatefulWidget {
  @override
  _MultipleSelectItemsState createState() => _MultipleSelectItemsState();
}

class _MultipleSelectItemsState extends State<MultipleSelectItems> {
  var theSelected = ["First"];
  
  @override
  Widget build(BuildContext context) {
    return Material(
      child: Container(
        child: GestureDetector(
          child: Column(
            children: <Widget>[
              SizedBox(
                height: 40,
              ),
              GestureDetector(
                onTap: () {
                  setState(() {
                    if(theSelected.contains("First")) {
                      theSelected.remove("First");
                    }
                    else {
                      theSelected.add("First");
                    }
                  });
                },
                child: Container(
                  margin: EdgeInsets.only(left: 15, right: 15),
                  height: 100,
                  width: double.maxFinite,
                  decoration: BoxDecoration(
                    color: theSelected.contains('First') ? Colors.redAccent : Colors.lightBlueAccent,
                  ),
                  child: ListTile(
                    title: Text(
                      'First',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        fontSize: 20,
                        fontFamily: 'WorksSansSemiBold',
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ),
              Padding(padding: EdgeInsets.only(top: 20)),
               GestureDetector(
                onTap: () {
                  setState(() {
                    if(theSelected.contains("Second")) {
                      theSelected.remove("Second");
                    }
                    else {
                      theSelected.add("Second");
                    }
                  });
                },
                child: Container(
                  margin: EdgeInsets.only(left: 15, right: 15),
                  height:100,
                  width: double.maxFinite,
                  decoration: BoxDecoration(
                    color: theSelected.contains('Second') ? Colors.redAccent : Colors.lightBlueAccent,
                  ),
                  child: ListTile(
                    title: Text(
                      'Second',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        fontSize: 20,
                        fontFamily: 'WorksSansSemiBold',
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ),
              Padding(padding: EdgeInsets.only(top: 20)),
               GestureDetector(
                onTap: () {
                  setState(() {
                    if(theSelected.contains("Third")) {
                      theSelected.remove("Third");
                    }
                    else {
                      theSelected.add("Third");
                    }
                  });
                },
                child: Container(
                  margin: EdgeInsets.only(left: 15, right: 15),
                  height:100,
                  width: double.maxFinite,
                  decoration: BoxDecoration(
                    color: theSelected.contains("Third") ? Colors.redAccent : Colors.lightBlueAccent,
                  ),
                  child: ListTile(
                    title: Text(
                      'Third',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        fontSize: 20,
                        fontFamily: 'WorksSansSemiBold',
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ),
                
              SizedBox(
                height: 40,
              ),
              MaterialButton(
                child: Text("Submit"),
                color: Colors.blueGrey,
                textColor: Colors.white,
                onPressed: () {},
              ),
            ],
          ),
        ),
      ),
    );
  }
}
class MultipleSelectItems扩展StatefulWidget{
@凌驾
_MultipleSelectItemsState createState()=>_MultipleSelectItemsState();
}
类_MultipleSelectItemsState扩展状态{
var theSelected=[“First”];
@凌驾
小部件构建(构建上下文){
退货(
子:容器(
儿童:手势检测器(
子:列(
儿童:[
大小盒子(
身高:40,
),
手势检测器(
onTap:(){
设置状态(){
如果(所选的。包含(“第一”)){
选择。删除(“第一”);
}
否则{
选择。添加(“第一”);
}
});
},
子:容器(
边距:仅限边集(左:15,右:15),
身高:100,
宽度:double.maxFinite,
装饰:盒子装饰(
颜色:所选。包含('First')?颜色。红色强调:颜色。浅蓝色强调,
),
孩子:ListTile(
标题:正文(
“第一”,
textAlign:textAlign.center,
样式:TextStyle(
尺寸:20,
fontFamily:'半黑体',
容重:
class MultipleSelectItems extends StatefulWidget {
  @override
  _MultipleSelectItemsState createState() => _MultipleSelectItemsState();
}

class _MultipleSelectItemsState extends State<MultipleSelectItems> {
  var theSelected = ["First"];
  
  @override
  Widget build(BuildContext context) {
    return Material(
      child: Container(
        child: GestureDetector(
          child: Column(
            children: <Widget>[
              SizedBox(
                height: 40,
              ),
              GestureDetector(
                onTap: () {
                  setState(() {
                    if(theSelected.contains("First")) {
                      theSelected.remove("First");
                    }
                    else {
                      theSelected.add("First");
                    }
                  });
                },
                child: Container(
                  margin: EdgeInsets.only(left: 15, right: 15),
                  height: 100,
                  width: double.maxFinite,
                  decoration: BoxDecoration(
                    color: theSelected.contains('First') ? Colors.redAccent : Colors.lightBlueAccent,
                  ),
                  child: ListTile(
                    title: Text(
                      'First',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        fontSize: 20,
                        fontFamily: 'WorksSansSemiBold',
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ),
              Padding(padding: EdgeInsets.only(top: 20)),
               GestureDetector(
                onTap: () {
                  setState(() {
                    if(theSelected.contains("Second")) {
                      theSelected.remove("Second");
                    }
                    else {
                      theSelected.add("Second");
                    }
                  });
                },
                child: Container(
                  margin: EdgeInsets.only(left: 15, right: 15),
                  height:100,
                  width: double.maxFinite,
                  decoration: BoxDecoration(
                    color: theSelected.contains('Second') ? Colors.redAccent : Colors.lightBlueAccent,
                  ),
                  child: ListTile(
                    title: Text(
                      'Second',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        fontSize: 20,
                        fontFamily: 'WorksSansSemiBold',
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ),
              Padding(padding: EdgeInsets.only(top: 20)),
               GestureDetector(
                onTap: () {
                  setState(() {
                    if(theSelected.contains("Third")) {
                      theSelected.remove("Third");
                    }
                    else {
                      theSelected.add("Third");
                    }
                  });
                },
                child: Container(
                  margin: EdgeInsets.only(left: 15, right: 15),
                  height:100,
                  width: double.maxFinite,
                  decoration: BoxDecoration(
                    color: theSelected.contains("Third") ? Colors.redAccent : Colors.lightBlueAccent,
                  ),
                  child: ListTile(
                    title: Text(
                      'Third',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                        fontSize: 20,
                        fontFamily: 'WorksSansSemiBold',
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ),
                
              SizedBox(
                height: 40,
              ),
              MaterialButton(
                child: Text("Submit"),
                color: Colors.blueGrey,
                textColor: Colors.white,
                onPressed: () {},
              ),
            ],
          ),
        ),
      ),
    );
  }
}
class MultipleSelectItems extends StatefulWidget {
  @override
  _MultipleSelectItemsState createState() => _MultipleSelectItemsState();
}

class _MultipleSelectItemsState extends State<MultipleSelectItems> {
  
  // This is responsible to crate your buttons 
  // Every button is created will be having it's unique instance only
  // Means, if you hit one button, it won't effect another, and you can select
  // multiple
  // And you don't have to declare your buttons multiple times in the code
  // Which is indeed bad way of coding :)
  List<Widget> get listTileWidgets{
     List<Widget> _widget = [SizedBox(height: 40.0)];
     List<String> _buttonName = ['First', 'Second', 'Third', 'Fourth'];
     
     // ListTileWidget is defined below in another StatefulWidget
     _buttonName.forEach((name){
         _widget.add(ListTileWidget(name: name));
         _widget.add(SizedBox(height: 20.0));
     });

     return _widget;
  }
  
  @override
  Widget build(BuildContext context) {
     return Material(
       child: Container(
          child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: this.listTileWidgets
          )
       )
     );
  }
}


// This will accept name of the button which will be used to be given
// plus maintaining the uniqueness
class ListTileWidget extends StatefulWidget{
    final String name;

    ListTileWidget({Key key, this.name}):super(key:key);
    
    @override
    ListTileWidgetState createState() => ListTileWidgetState();
}

class ListTileWidgetState extends State<ListTileWidget>{
    bool isTapped = false;

    @override
    Widget build(BuildContext context){
        return GestureDetector(
            onTap: () {
               setState(() => isTapped = true);
            },
            child: Container(
                margin: EdgeInsets.only(left: 15, right: 15),
                height:100,
                color: isTapped ? Colors.redAccent : Colors.lightBlueAccent,
                width: double.maxFinite,
                child: ListTile(
                    title: Text(
                        widget.name,
                        textAlign: TextAlign.center,
                        style: TextStyle(
                            fontSize: 20,
                            fontFamily: 'WorksSansSemiBold',
                            fontWeight: FontWeight.bold,
                        )
                    )
                )
            )
        );
    }
}
Column(
  crossAxisAlignment: CrossAxisAlignment.stretch,
  children: <Widget>[
     this.listTileWidgets,
     SizedBox(height: 40),
     MaterialButton(
       child: Text("Submit"),
       color: Colors.blueGrey,
       textColor: Colors.white,
       onPressed: () {},
     )
  ]
)