您应该使用您的逻辑创建有状态小部件。单击项目应更改小部件状态。在这种情况下,小部件具有像 title 和 isSelected 这样的属性,这些属性被包装到 ListItem 类中。您需要的唯一逻辑基本上是
widget._listItem.isSelected = !_isSelected; in GestureDetector。下面的示例应该让您了解小部件状态。
class SelectableListItemWidget extends StatefulWidget {
final ListItem _listItem;
const SelectableListItemWidget(this._listItem);
@override
_SelectableListItemWidgetState createState() =>
_SelectableListItemWidgetState();
}
class _SelectableListItemWidgetState extends State<SelectableListItemWidget> {
String get _title => widget._listItem.title;
bool get _isSelected => widget._listItem.isSelected;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
setState(() {
print('element: $_title has been clicked');
widget._listItem.isSelected = !_isSelected;
});
},
child: Container(
color: _isSelected ? Colors.red : Colors.green,
padding: const EdgeInsets.all(16),
child: Text(
_title,
style: TextStyle(fontSize: 18),
)),
);
}
}
class ListItem {
String title;
bool isSelected;
ListItem(this.title, {this.isSelected = false});
}
可以使用新创建的小部件
var items = [
"Apple",
"Cherimoya",
"Grapefruit",
"Jostaberry",
"Plumcot",
"Pomegranate",
"Quince",
"Kiwi",
"Kiwano",
"Huckleberry",
"Marionberry",
"Mango",
"Strawberry",
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ListView(
children: items
.map((item) => SelectableListItemWidget(ListItem(item)))
.toList(),
),
);
}