【发布时间】:2020-11-11 02:11:31
【问题描述】:
我正在开发待办事项应用程序并使用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]);调用服务方法来改变复选框的状态
现在的问题是onChange() 一次点击就被调用了两次。如何更正 onChange 回调中的多次调用?
【问题讨论】:
-
您在哪里填充_todoList?请添加代码
-
添加了代码@CristianBregant
-
@RuchitaBhaskar 但它实际上在哪里?在您的
build()方法中? -
不,在 build() 方法之外@MiguelRuivo
-
你在哪里打电话给
getAllTodos()?
标签: android-studio flutter checkbox state sqflite