我想从ListView中选择颜色,如下所示:
问题是我在尝试时打印所有内容,代码:
class _ProcedureList extends State<ProcedureList> {
bool isSelected = true;
_isSelected() {
setState(() {
if (isSelected) {
isSelected = false;
} else {
isSelected = true;
}
});
}
@override
Widget build(BuildContext context) {
var procedureList = widget.filteredkits
.where((kit) => kit.brand == widget.brand)
.map((kit) => kit.procedure)
.toSet()
.toList();
return Expanded(
flex: 2,
child: Container(
padding: EdgeInsets.only(left: 35.0),
child: new ListView.builder(
itemCount: procedureList.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: EdgeInsets.all(6.0),
child: Column(
children: <Widget>[
new Container(
width: 300.0,
height: 30.0,
color: Colors.grey[700],
padding: EdgeInsets.all(6.0),
child: new Text(widget.brand),
),
GestureDetector(
onTap: () => widget.getProcedureSelectedandList(procedureList[index].toString()) & _isSelected(),
child: Container(
width: 300.0,
padding: EdgeInsets.all(3.0),
color: !isSelected ? Colors.white : Colors.orange,
child:
new Text(procedureList[index])
),
),
],
),
);
},
),
),
);
}
}
这就是我所取得的成就,所有颜色:
我不知道如何在事件发生时只为一个项目着色,以及我们是否可以更好地更改相同事件的文本颜色 .
2 回答
你应该在列表中的每个项目上都有一个isSelected值,然后当用户点击列表中的一个项目时,你将改变isSelected值只是为了录音项目索引而在构建语句中你应该这样做action基于传入索引的isSelected值
这是一个例子:
或者您可以创建StateFull小部件,它为列表中的每个项目保留自己的isSelected值,如下例所示:
我认为第二种选择因性能原因更好
你需要做的是重构你的代码,使得传递给
ListView
builder
函数的小部件拥有它自己的StatefulWidget
. 因此,将构建器函数内的窗口小部件树移动到它自己的单独的StatefulWidget
中,并在那里处理状态操作逻辑而不是ProcedureList
. 您获得此行为的原因是因为通过将逻辑移动到单独的StatefulWidget
中,从ListView.builder
生成的每个实例都暴露于相同的状态值isSelected
,每个实例都将拥有自己的状态 .