Поскольку setState
обновлено ReorderableListView
, оно будет повторно отображать весь список, поэтому оно не будет считаться изменением.
, вам следует обновить только один listTile в listView. для этого переместите ваш виджет listTile в виджет Stateful
со своим собственным setState
и замените свою карту в HomePage:
class _HomePageState extends State<HomePage> {
List myItems = [];
@override
void initState() {
super.initState();
for (int i = 0; i < 10; i++) {
Map<String, dynamic> newTask = Map();
newTask['task'] = 'Task #$i';
newTask['done'] = false;
myItems.add(newTask);
}
}
bool a = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter To Do'),
),
body: ReorderableListView(
children: [
for (var item in myItems)
TaskListItem(
key: ObjectKey(item),
item: item,
),
],
onReorder: (oldIndex, newIndex) {
setState(() {
if (newIndex > oldIndex) {
newIndex -= 1;
}
final item = myItems.removeAt(oldIndex);
myItems.insert(newIndex, item);
});
},
),
);
}
}
class TaskListItem extends StatefulWidget {
final item;
const TaskListItem({Key key, this.item}) : super(key: key);
@override
_TaskListItemState createState() => _TaskListItemState();
}
class _TaskListItemState extends State<TaskListItem> {
@override
Widget build(BuildContext context) {
return Card(
margin: EdgeInsets.all(0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0)),
child: Container(
height: 56,
child: Row(
children: <Widget>[
IconButton(icon: Icon(Icons.reorder), onPressed: null),
Expanded(
child: Text(widget.item['task']),
),
Checkbox(
value: widget.item['done'],
onChanged: (value) {
setState(() {
widget.item['done'] = value;
});
},
)
],
),
),
);
}
}