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