Flutter 中复选框的 OnChanged 状态
OnChanged State of Checkbox in Flutter
我正在开发待办事项列表应用程序并使用 CheckBox
来检查列表中的待办事项。
但是在刷新页面时它一直回到未选中状态。
我想将状态保存在数据库中。
我在 getAllTodos
中填充 todoList
代码如下:
List<Todo>_todoList=List<Todo>();
@override
initState(){
super.initState();
getAllTodos();
}
getAllTodos()async{
_todoService=TodoService();
_todoList=List<Todo>();
var todos= await _todoService.readTodo();
todos.forEach((todo){
setState(() {
var model=Todo();
model.id=todo['id'];
model.title=todo['title'];
model.dueDate=todo['dueDate'];
model.category=todo['category'];
model.isFinished=todo['isFinished'];
_todoList.add(model);
});
});
}
body: ListView.builder(itemCount: _todoList.length,itemBuilder: (context, index){
return Padding(
padding: EdgeInsets.only(top:8.0, left: 8.0, right: 8.0),
child: Card (
elevation: 8.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0)
),
child: InkWell(
onTap: (){
setState(() {
_todoList[index].isChecked=!_todoList[index].isChecked;
});
},
child: ListTile(
leading: Checkbox(
checkColor: Colors.indigo,
value: _todoList[index].isChecked,
onChanged: (bool value){
setState(() {
_todoList[index].isChecked=value;
_todoService.saveTodo(_todoList[index]);
});
},
),
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(_todoList[index].title ?? 'No Title',
style: TextStyle(decoration: (_todoList[index].isChecked? TextDecoration.lineThrough: TextDecoration.none),
),
),
IconButton(icon: Icon(Icons.delete,color: Colors.red,
),
onPressed: (){
_deleteFormDialog(context,_todoList[index].id);
}
),
],
),
subtitle: Text(_todoList[index].dueDate ?? 'No Due Date'),
),
),
),
);
}),
这里是 isChecked 值:
class Todo{
bool isChecked=false;
}
请帮帮我。
更新: 在 onChanged 回调的 setState()
中添加一行调用服务方法通过 _todoService.saveTodo(_todoList[index]);
[= 更改复选框的状态16=]
现在的问题是 onChange()
在单击时被调用了两次。如何更正onChange回调中的多次调用?
按照 here w.r.t 复选框操作中的步骤进行操作。
希望一切顺利!
我正在开发待办事项列表应用程序并使用 CheckBox
来检查列表中的待办事项。
但是在刷新页面时它一直回到未选中状态。 我想将状态保存在数据库中。 我在 getAllTodos
中填充 todoList代码如下:
List<Todo>_todoList=List<Todo>();
@override
initState(){
super.initState();
getAllTodos();
}
getAllTodos()async{
_todoService=TodoService();
_todoList=List<Todo>();
var todos= await _todoService.readTodo();
todos.forEach((todo){
setState(() {
var model=Todo();
model.id=todo['id'];
model.title=todo['title'];
model.dueDate=todo['dueDate'];
model.category=todo['category'];
model.isFinished=todo['isFinished'];
_todoList.add(model);
});
});
}
body: ListView.builder(itemCount: _todoList.length,itemBuilder: (context, index){
return Padding(
padding: EdgeInsets.only(top:8.0, left: 8.0, right: 8.0),
child: Card (
elevation: 8.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0)
),
child: InkWell(
onTap: (){
setState(() {
_todoList[index].isChecked=!_todoList[index].isChecked;
});
},
child: ListTile(
leading: Checkbox(
checkColor: Colors.indigo,
value: _todoList[index].isChecked,
onChanged: (bool value){
setState(() {
_todoList[index].isChecked=value;
_todoService.saveTodo(_todoList[index]);
});
},
),
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(_todoList[index].title ?? 'No Title',
style: TextStyle(decoration: (_todoList[index].isChecked? TextDecoration.lineThrough: TextDecoration.none),
),
),
IconButton(icon: Icon(Icons.delete,color: Colors.red,
),
onPressed: (){
_deleteFormDialog(context,_todoList[index].id);
}
),
],
),
subtitle: Text(_todoList[index].dueDate ?? 'No Due Date'),
),
),
),
);
}),
这里是 isChecked 值:
class Todo{
bool isChecked=false;
}
请帮帮我。
更新: 在 onChanged 回调的 setState()
中添加一行调用服务方法通过 _todoService.saveTodo(_todoList[index]);
[= 更改复选框的状态16=]
现在的问题是 onChange()
在单击时被调用了两次。如何更正onChange回调中的多次调用?
按照 here w.r.t 复选框操作中的步骤进行操作。
希望一切顺利!