添加FutureBuilder后,ListView不会更新状态

时间:2019-05-20 20:55:03

标签: dart flutter

在发生此问题之前,我正在处理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,
  ),
);
   }

  }

预先感谢,希望有人可以帮助我:)

2 个答案:

答案 0 :(得分:0)

据我所知,您的SELECT * FROM users WHERE user = 'admin' and password = '123456'已从本地实例列表_deleteTodo中删除,但您正在指示flutter通过todos从磁盘重建UI来重新获取数据从磁盘。

我的建议是使用loadData在页面加载时获取一次数据,然后仅引用initState的本地实例。

在您的todos中,您还需要将状态持久保存到磁盘或在某处具有提交按钮

答案 1 :(得分:0)

我在_toggleTodo中找到了解决方案,在对待办事项进行某些操作后,我需要它来保存我的TodoList。