在发生此问题之前,我正在处理Future处理,以返回保存在sharedPreference上的值,但是我的_deleteTodo方法工作得很好。 在我添加FutureBuilder并最终在UI上呈现了我的值之后,现在我正在努力解决这个新错误。 每次更新UI的状态和项目时,我的UI都会反映它,但会立即撤消
我试图用_deleteTodo方法查看是否存在某种情况,所以我将setState更改为仅将布尔值从false更改为true,但它的功能完全相同。 在_deleteTodo之后,我还打印了列表的长度,并且发生了一些有趣的事情:它可以工作一次,_deleteTodo删除Todo,但是之后不再起作用
This is my TODO class
class Todo {
Todo ({this.title,this.isDone = false});
String title;
bool isDone;
//Decode method to convert a Json String into a Dynamic object
Todo.fromJson(Map <String, dynamic> json)
: title = json ["title"],
isDone = json ["isDone"];
Map <String,dynamic> toJson() =>
{
"title" : title,
"isDone" : isDone
};
}
这是我的屏幕
class _TodoListScreenState extends State<TodoListScreen> {
List<Todo> todos = [];
//updates the state of the checkbox and reflects it on the UI
_toggleTodo(Todo todo, bool isChecked) {
setState(() {
todo.isDone = isChecked;
_deleteTodo(todo,isChecked);
print(todos.length);
});
}
_addTodo() async {
final todo = await showDialog<Todo>(
context: context,
builder: (BuildContext context) { // <- Here you draw the
Dialog
return NewTodoDialog();
},
);
if (todo != null) {
setState(() {
todos.add(todo);
_saveTodo(todos);
print(todos.length);
});
}
}
_deleteTodo (Todo todo, bool isDone) => (isDone)?
todos.remove(todo): debugPrint;
//Save you array object as an array of Strings in Shared Preferences
Future<void> _saveTodo(List<Todo> todo) async {
SharedPreferences sharedPreferences = await
SharedPreferences.getInstance();
sharedPreferences.setStringList("savedData", _mapTodoData(todo));
}
_mapTodoData(List<dynamic> todos) {
try {
var res = todos.map((v) => json.encode(v)).toList();
return res;
} catch (err) {
// Just in case
return ["Nope"];
}
}
Future<List> loadData() async {
SharedPreferences sharedPreferences = await
SharedPreferences.getInstance();
final List<Todo> todoArray =
_decodeTodoData(sharedPreferences.
getStringList("savedData")).toList();
todos = todoArray;
return todoArray;
}
List<Todo> _decodeTodoData(List<String> todos) {
try {
//Transforming List<String> to Json
var result = todos.map((v) => json.decode(v)).toList();
//Transforming the Json into Array<Todo>
var todObjects = result.map((v) => Todo.fromJson(v)).toList();
return todObjects;
} catch (error) {
return [];
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(backgroundColor: Colors.deepPurple[900],
title: Text('Todo List')),
body: Container(
child: FutureBuilder(
future: loadData(),
builder: (BuildContext context, AsyncSnapshot snapshot){
return TodoList(
todos: todos,
onTodoToggle: _toggleTodo,
);
})
)
,
floatingActionButton: FloatingActionButton(
backgroundColor: Colors.purpleAccent[700],
child: Icon(Icons.add),
onPressed: _addTodo,
),
);
}
}
预先感谢,希望有人可以帮助我:)
答案 0 :(得分:0)
据我所知,您的SELECT * FROM users WHERE user = 'admin' and password = '123456'
已从本地实例列表_deleteTodo
中删除,但您正在指示flutter通过todos
从磁盘重建UI来重新获取数据从磁盘。
我的建议是使用loadData
在页面加载时获取一次数据,然后仅引用initState
的本地实例。
在您的todos
中,您还需要将状态持久保存到磁盘或在某处具有提交按钮
答案 1 :(得分:0)
我在_toggleTodo中找到了解决方案,在对待办事项进行某些操作后,我需要它来保存我的TodoList。