在Flutter中实现列表多选并显示选择顺序,可以通过以下方式实现:
核心实现代码
class SelectableListItem {
final String title;
bool isSelected = false;
int? selectionOrder;
SelectableListItem(this.title);
}
class OrderedMultiSelectList extends StatefulWidget {
@override
_OrderedMultiSelectListState createState() => _OrderedMultiSelectListState();
}
class _OrderedMultiSelectListState extends State<OrderedMultiSelectList> {
List<SelectableListItem> items = [
SelectableListItem('项目1'),
SelectableListItem('项目2'),
SelectableListItem('项目3'),
SelectableListItem('项目4'),
SelectableListItem('项目5'),
];
int _currentOrder = 0;
void _toggleSelection(int index) {
setState(() {
if (items[index].isSelected) {
// 取消选择
items[index].isSelected = false;
items[index].selectionOrder = null;
_reorderSelection();
} else {
// 选择项目
items[index].isSelected = true;
_currentOrder++;
items[index].selectionOrder = _currentOrder;
}
});
}
void _reorderSelection() {
_currentOrder = 0;
// 重新计算选择顺序
for (var item in items) {
if (item.isSelected) {
_currentOrder++;
item.selectionOrder = _currentOrder;
}
}
}
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
leading: _buildSelectionIndicator(items[index]),
title: Text(items[index].title),
onTap: () => _toggleSelection(index),
);
},
);
}
Widget _buildSelectionIndicator(SelectableListItem item) {
return Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: item.isSelected ? Colors.blue : Colors.grey[300],
shape: BoxShape.circle,
),
child: Center(
child: Text(
item.isSelected ? '${item.selectionOrder}' : '',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
);
}
}
关键特性
- 选择状态管理:使用
SelectableListItem类存储选择状态和顺序
- 顺序计算:
_toggleSelection方法处理选择/取消选择逻辑
- 重新排序:取消选择时自动重新计算剩余项目的顺序
- 视觉反馈:圆形指示器显示选择顺序数字
使用方式
// 在页面中使用
Scaffold(
appBar: AppBar(title: Text('多选列表')),
body: OrderedMultiSelectList(),
)
这个实现提供了完整的列表多选功能,选择顺序会实时显示在圆形指示器中,取消选择时会自动更新剩余项目的顺序编号。