首页 > 解决方案 > 当数据库获取新数据时,如何使 FutureBuilder 更新?

问题描述

我正在构建一个待办事项列表应用程序。我有一个 FutureBuilder 小部件,我可以在其中处理有关任务的所有内容。然后我有另一个小部件,其中有两个浮动操作按钮,其中一个从 sql 中删除表,另一个打开另一个小部件以向数据库添加任务。他们都工作。但我必须重新加载应用程序才能看到更改。我看到有两个像这样的问题,但没有明确的答案,我花了大约一个小时寻找答案,但我什么也找不到。

这是我有两个操作按钮的小部件。

class FloatingActionButtons extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<DataProvider>(
      builder: (context, data, child) {
        return Padding(
          padding: const EdgeInsets.all(10.0),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              FloatingActionButton(
                backgroundColor: Color(0xFF25202B),
                onPressed: () {
                  data.deleteAll();
                },
                child: Icon(Icons.clear, size: 30.0, color: Colors.white),
              ),
              FloatingActionButton(
                backgroundColor: Color(0xFF25202B),
                onPressed: () {
                  showModalBottomSheet(
                      context: context,
                      isScrollControlled: true,
                      builder: (context) => AddTaskScreen());
                },
                child: Icon(Icons.add, size: 30.0, color: Colors.white),
              ),
            ],
          ),
        );
      },
    );
  }
}

这是我拥有 FutureBuilder 的小部件

class DisplayTasks extends StatefulWidget {
  @override
  _DisplayTasksState createState() => _DisplayTasksState();
}

class _DisplayTasksState extends State<DisplayTasks> {
  final db = DBHelper.instance;
  Future<List<Task>> tasks;

  void updateTasksList() {
    setState(() {
      tasks = db.getTaskList();
    });
  }

  void toggleDone(Task task) {
    setState(() {
      if (task.isDone == 0) {
        task.isDone = 1;
      } else {
        task.isDone = 0;
      }
      db.update(task);
    });
  }

  void deleteTask(String taskName) {
    setState(() {
      db.deleteTask(taskName);
    });
  }

  void insert(taskName, isDone) {
    setState(() {
      db.insertTask(Task(
        taskName: taskName,
        isDone: isDone,
      ));
    });
  }

  @override
  void initState() {
    super.initState();
    updateTasksList();
  }

  @override
  Widget build(BuildContext context) {
    updateTasksList();
    return Expanded(
      child: FutureBuilder(
          future: tasks,
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
              return Center(
                child: Text(
                  'No tasks added yet.',
                  style: TextStyle(
                    fontSize: 30.0,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              );
            }

            if (snapshot.hasError) {
              return Center(
                child: Text('Future Error'),
              );
            }

            return ListView.builder(
              itemCount: snapshot.data.length,
              shrinkWrap: true,
              itemBuilder: (context, index) {
                return GestureDetector(
                  onLongPress: () {
                    deleteTask(snapshot.data[index].taskName);
                  },
                  onTap: () {
                    toggleDone(snapshot.data[index]);
                  },
                  child: Container(
                    padding:
                        EdgeInsets.symmetric(vertical: 20.0, horizontal: 10.0),
                    margin:
                        EdgeInsets.symmetric(horizontal: 30.0, vertical: 10.0),
                    decoration: BoxDecoration(
                        color: Color(0xFF252030),
                        borderRadius: BorderRadius.circular(15.0)),
                    child: Center(
                      child: Text(
                        '${snapshot.data[index].taskName}',
                        style: TextStyle(
                            decoration: snapshot.data[index].isDone == 0
                                ? TextDecoration.none
                                : TextDecoration.lineThrough,
                            fontSize: 18.0,
                            fontWeight: FontWeight.bold,
                            textBaseline: TextBaseline.ideographic),
                      ),
                    ),
                  ),
                );
              },
            );
          }),
    );
  }
}

非常感谢任何能够提供帮助的人!

标签: flutterdartsqflite

解决方案


推荐阅读